具有O(1)复杂度

时间:2016-10-28 20:11:41

标签: c++ algorithm vector time-complexity big-o

我们得到一个整数向量(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)复杂度解决? 我考虑过使用内存地址操作,但我仍然不确定它是如何工作的(例如:将(B-A)中的下一个&V[A]地址值相加)

2 个答案:

答案 0 :(得分:1)

如果允许预处理,可以使用辅助阵列完成此操作。

第二个数组的每个元素都包含相应元素和所有前面元素的总和。这种一次性预处理是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}

一旦你有了这个,你只需要执行2次查找:一次用于上限,一次用于下限。因此,在预处理之后,每次执行时获得范围和为O(1)。

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

答案 1 :(得分:-1)

O(1)空间:没问题。但是“随机”数字总是需要O(n)时间。