Algorithm 如何在O(1)时间内实现以下算法?
我有一个用整数填充的2D数组。我想要一种在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。我将给出一个关于该怎么做的提示。您可以设置辅助数据结构以方便计算。但是,该数据结
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作业中有一个提示,说可以通过预先计算所有可能的子区域的平均值来加速这个过程。但我不知道怎么做?查积分图。什么是前缀数组?我不明白你是怎么计算的。前缀数组是一个使用动态规划的数组。您需要制作另一个数组。我编辑了我的帖子。看那个。