C 带o(1)的数组

C 带o(1)的数组,c,arrays,C,Arrays,我试图以o(1)复杂度在2D数组中找到随机子集的和,大小可达数组[1000][1000],但让我们以[4][4]为基本示例: array[4][4] = {0, 1, 2 ,3 4, 5, 6, 7 8, 9, 10, 11 12, 13, 14, 15} 我见过一些一维数组的实现,其中存储运行的和,然后进行减法 这是有道理的,但假设我想把array[2][2]的和加到array[3][3]的o(1)中。所以是

我试图以o(1)复杂度在2D数组中找到随机子集的和,大小可达数组[1000][1000],但让我们以[4][4]为基本示例:

array[4][4] = {0, 1, 2 ,3
              4, 5, 6, 7
              8, 9, 10, 11
              12, 13, 14, 15}
我见过一些一维数组的实现,其中存储运行的和,然后进行减法

这是有道理的,但假设我想把
array[2][2]
的和加到
array[3][3]
的o(1)中。所以是10+11+14+15

但是如何在o(1)中实现这一点呢?o(n)很容易

这与哈希表或更复杂的预处理数组有关吗

编辑>>>

对于回到这个问题上来的任何人来说,还有一些补充说明:

  • 谷歌搜索时使用的具体措辞似乎是“总面积表”或“整幅图像”或“Viola–Jones目标检测框架”
  • 有用的参考资料包括和

  • 对于每个元素
    [i][j]
    ,预计算从
    数组[0][0]
    数组[i][j]
    的矩形中所有元素的总和;表示该值
    和[i][j]
    。然后,如果最大数组大小为[4][4],那么要计算矩形子集
    i1的和,最好使用for循环,让编译器为您优化它,而不是预先计算每个子集的和“o(1),无论数组大小如何”。如果数组大小是固定的,则for循环已经是o(1)。如果你说的是不同的数组大小,那么不要在你的问题中陈述最大数组大小[4][4]。好的,我已经用这些细节澄清了我的问题“大小到数组[1000][1000]”,使用最简单的方法总结所有元素,那么复杂性是
    O(1000*1000)=O(1)
    。问题不在于查找任意子集中元素的和,而在于查找连续子数组中元素的和,即i0的所有元素的和
    数组[i][j]
    ≤ isums[i2][j2] - (i1 == 0 ? 0 : sums[i1 - 1][j2]) - (j1 == 0 ? 0 : sums[i2][j1 - 1]) + ((i1 == 0 || j1 == 0) ? 0 : sums[i1-1][j1-1])