Algorithm 如何在O(1)时间内实现以下算法?

Algorithm 如何在O(1)时间内实现以下算法?,algorithm,multidimensional-array,data-structures,runtime,Algorithm,Multidimensional Array,Data Structures,Runtime,我有一个用整数填充的2D数组。我想要一种在O(1)时间内找到数组某部分平均值的方法。例如,我有数组A[][]={{1,2,3},{4,5,6},{7,8,9}和算法的输入将是边界。所以算法(int-top,int-bottom,int-left,int-right)。如果top=1,bottom=2,left=1,right=2,那么该部分将从第二行到第三行,从第二列到第三列。所以平均值应该是(5+6+8+9)/4。我将给出一个关于该怎么做的提示。您可以设置辅助数据结构以方便计算。但是,该数据结

我有一个用整数填充的2D数组。我想要一种在O(1)时间内找到数组某部分平均值的方法。例如,我有数组
A[][]={{1,2,3},{4,5,6},{7,8,9}和算法的输入将是边界。所以
算法(int-top,int-bottom,int-left,int-right)
。如果top=1,bottom=2,left=1,right=2,那么该部分将从第二行到第三行,从第二列到第三列。所以平均值应该是(5+6+8+9)/4。

我将给出一个关于该怎么做的提示。您可以设置辅助数据结构以方便计算。但是,该数据结构需要超过O(1)次的计算时间,因此只有在多次计算时才有帮助

提示是累积值很有用。我将给出一个一维的例子。你需要弄清楚如何扩展它。假设您有以下数据:

1      2      3      4      5
10    -3      6      6     -2
你也有同样的问题。如何在恒定时间内解决这个问题?那么,创建另一个具有累积和的数据结构:

1      2      3      4      5
10     7     13     19     17

现在,如果你想要2-5的和,你可以只计算17-10(也就是说,在2之前有一个索引)。您可以通过将其除以(1+5-2)得到平均值。

您可以编写前缀表的总和

示例如下所示 你的阵列

1 2 3

4 5 6

7 8 9

前缀数组:

  For(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
           prefix[i][j] = prefix[i-1][j] + prefix[i][j-1] + array[i][j] - prefix[i-1][j-1];
        }
    }
1 3 6

51221

12 27 45

然后,当您想要计算您的示例时:

X = (prefix[bottom][right] - prefix[bottom][left-1] - prefix[top-1][right] + prefix[top-1][left-1]) / (right - left + 1) * (bottom - top + 1);

X = (45 - 12 - 6 + 1) / 4 = 7;
用于填充前缀数组的模型:

  For(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
           prefix[i][j] = prefix[i-1][j] + prefix[i][j-1] + array[i][j] - prefix[i-1][j-1];
        }
    }
For(int i=0;i
<代码>用C++语言编写
**n-行数,m-列数

您必须读取值,因此不知道这是如何成为O(1)。它几乎必须是O(n)(其中“n”是值的数目),除非你对这个问题有其他的限制。@GordonLinoff作业中有一个提示,说可以通过预先计算所有可能的子区域的平均值来加速这个过程。但我不知道怎么做?查积分图。什么是前缀数组?我不明白你是怎么计算的。前缀数组是一个使用动态规划的数组。您需要制作另一个数组。我编辑了我的帖子。看那个。