Algorithm 求前缀和变化的O(n)解

Algorithm 求前缀和变化的O(n)解,algorithm,complexity-theory,Algorithm,Complexity Theory,我知道这个问题是前缀和的变化,我只是在设置它时遇到了一些困难。计算两个数组怎么样: 左[i]等于前i个元素之和: Lefts[i] = A[0]+A[1]+A[2]..+A[i] 权利[i]等于最后i个元素之和: Rights[i] = A[n-1]+A[n-2]..+A[i] 然后,S[i]=Left[i-1]+Rigt[i+1]我提出的想法可以归结为其他答案中已经提出的内容。但是,我想提出一种具有恒定内存开销的实现: initialize S with 0 for i = 2 to n


我知道这个问题是前缀和的变化,我只是在设置它时遇到了一些困难。

计算两个数组怎么样: 左[i]等于前i个元素之和:

Lefts[i] = A[0]+A[1]+A[2]..+A[i]
权利[i]等于最后i个元素之和:

Rights[i] = A[n-1]+A[n-2]..+A[i]

然后,
S[i]=Left[i-1]+Rigt[i+1]
我提出的想法可以归结为其他答案中已经提出的内容。但是,我想提出一种具有恒定内存开销的实现:

initialize S with 0
for i = 2 to n {
  S[i] = S[i -1] + A[i - 1] // somewhat similar to prefix sum array
}

help = 0 // a single variable - constant memory overhead
for i = n to 1 {
  S[i] += help
  help += A[i]
}
在第一次迭代之后,S[i]存储索引小于i的所有值的总和。在第二次迭代中,我将当前值右侧的值之和相加

定义:

P[i] = A[i+1] + A[i+2] + ... + A[n]
Q[i] = A[1] + ... + A[i-1]

然后,
S[i]=p[i]+Q[i]
定义B[i]=A[1]+。。。A[i-1]和C[i]=A[i+1]+…+然后S[i]=B[i]+C[i]

可以在线性时间内计算两个数组。需要向后迭代以在线性时间内计算C


加法的总数为3N-2(每个位置加一个加法,除了B中的第一个和C中的最后一个)。

看起来索引计算需要减法运算或至少减法运算。@Henrik可以通过颠倒列表A来计算权限[i],而不必减法。但老实说,我认为递减是正确的OK@ig-melnyk我误读了声明,我将删除我的评论,因为它是错误的。但是,可以实现一个没有内存开销的解决方案,我在回答中解释了如何实现。@ig melnyk我不太明白如何在不递减的情况下反转数组,但你可能是对的,递减是允许的。你能解释一下你是如何得到3N-2的吗?是因为B和A各加N,然后S再加N,得到3N吗?但我还是不明白-2@MutatingAlgorithmB[1]和C[n]都是0,因此这两个值不需要相加。