python前缀和

1.前缀和的概念:

对于数组a[0]~a[n-1] (长度为n),前缀和sum[i]等于a[0]~a[n-1]的和;
sum[0]=a[0]
sum[1]=a[0]+a[1]
sum[2]=a[0]+a[1]+a[2] …………
在O(n)时间内求所有前缀和:sum[i]=sum[i-1]+a[i] (递推)
代码清单1-1:

n=10
a=[i for i in range(n)]
print(a)         #数组初始化即a

sum=[0]*n
for i in range(1,n):
    sum[i]=a[i]+sum[i-1]       #递推
print(sum)

输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]

2.区间问题

计算前缀和的作用:能快速计算出区间和,优化到O(1)的计算

a[i]+a[i-1]+……+a[j-1]+a[j]=sum[j]-sum[i-1]

3.前缀和与差分

一维差分数组D[k]=a[k]-a[k-1],即原数组a[ ]的相邻元素的差

python前缀和_第1张图片
a[k]=D[1]+D[2]+…+D[k]
a[ ]是D[ ]的前缀和
差分是前缀和的逆运算:把求a[k]转化为求D的前缀和

4.差分数组:提升修改的效率

把区间[L,R]内每个元素a[ ]加上d,只需把对应的D[ ]做以下操作:
把D[L]加上d:D[L]+=d
把D[R+1]减去d:D[R+1]-=d

利用D[ ],能极快解决修改区间[L,R]内元素的目的
说明:前缀和a[x]=D[1]+D[2]+…+D[x],有:
python前缀和_第2张图片

你可能感兴趣的:(python,算法)