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}