Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 复杂度为O(1)的指数范围内的和值_C++_Algorithm_Vector_Time Complexity_Big O - Fatal编程技术网

C++ 复杂度为O(1)的指数范围内的和值

C++ 复杂度为O(1)的指数范围内的和值,c++,algorithm,vector,time-complexity,big-o,C++,Algorithm,Vector,Time Complexity,Big O,我们得到一个整数向量(V[])和两个索引值,a和B。我们需要对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(1)空格:没问题。但是“随机”数总是需要O(n)时间。如果允许预处理,可以使用辅助数组来完成

我们得到一个整数向量(
V[]
)和两个索引值,
a
B
。我们需要对
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(1)空格:没问题。但是“随机”数总是需要O(n)时间。

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

第二个数组的每个元素将包含相应元素和所有前面元素的总和。这种一次性预处理是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];
}
一旦你有了这个,你只需要执行2个查找:一个用于上限,一个用于下限。因此,在预处理之后,每次执行时,得到的范围和是O(1)


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

您认为这是如何实现的?完全不可能。如果你想O(1)访问范围和,你应该对数据进行预处理,并构建前缀和向量或类似的东西。通常当问这个问题时,上下文允许对输入进行预处理。也就是说,您有一个从向量构造的类,然后是一个查询方法。唯一常见的要求是查询是O(1),但构造可以更多。不,不需要预处理。你可以简单地存储一个部分和数组,其中S[i]=元素的和0->i,所以你的答案应该是
S[B]-S[a-1]
…所以这不是一个让其他人为你解决编程难题的服务。这应该是一个评论。OP没有指定他在寻找什么类型的O(1)。我相信我的帖子回答了这个问题?这个问题不值得实际回答answer@Treycos如果你认为这个问题很愚蠢,不值得回答,那就好了。那你为什么不忽略它呢?因为你不喜欢这个问题而对答案投否决票有意义吗?在我看来,OP似乎还没有理解大O符号的含义,而且需要考虑空间和时间的复杂性。我的回答是试图说明这两个都是big-O的一部分,并且当正确操作时,具体的例子确实具有O(1)的两个复杂性之一。阅读上面,这是一个回答,而不是一个评论,它解释得很精确,写得很好
{0, 1, 3, 3, 7, 7, 10}