对复杂度为0(1)的索引范围内的值求和

sum values in a range of indices with O(1) complexity

本文关键字:索引 范围内 求和 复杂度      更新时间:2023-10-16

给定一个整数向量(V[])和两个指标值,AB。我们需要对V[A]V[B]之间的所有整数求和。

例如

V[] == {0, 1, 2, 0, 4, 0, 3}, A == 2, B == 6
Sum == V[3] + V[4] + V[5] == 4

是否有可能解决O(1)复杂性?我想过使用内存地址操作,但我仍然不确定它是如何工作的(类似于:从&V[A]求和下一个(B-A)地址值)

如果允许预处理,则可以使用辅助数组完成。

第二个数组的每个元素将包含相应元素和前面所有元素的和。此一次性预处理耗时O(n),空间O(n)。

例如:

int Vsum[7];
Vsum[0] = V[0];
for (int i=1; i<7; i++) {
    Vsum[i] = Vsum[i-1] + V[i];
}

对于给定的数组,相应的求和数组Vsum将包含:

{0, 1, 3, 3, 7, 7, 10}

一旦你有了这个,你只需要执行两次查找:一次查找上界,一次查找下界。所以预处理后,每次执行得到的范围和为0(1)。

对于A==2和B==6的例子,您可以计算Vsum[B-1] - Vsum[A] == 7 - 3 == 4

0(1)空格:没问题。但是对于"随机"数字总是需要O(n)时间。