前缀和
一个数组的前缀和可以理解为从数组开头到该位置的和。
利用前缀和可以 Θ(1) 的时间复杂度完成查询。
前缀和用于查询一个序列的区间和。
一维前缀和
一维前缀和可以在 Θ(n) 的时间复杂度完成统计。
si=j=1∑iaj=si−1+ai
i=l∑rai=sr−sl−1
二维前缀和
二维前缀和可以在 Θ(nm) 的时间复杂度完成统计。
si,j=k=1∑il=1∑jak,l=si−1,j+si,j−1−si−1,j−1+ai
i=x1∑x2j=y1∑y2ai,j=sx2,y2+sx1−1,y1−1−sx2,y1−1−sx1−1,y2
差分
一个数组的差分可以理解为数组中相邻两个数据的差。
对差分数组求前缀和即可得到原数组。
利用差分可以 Θ(1) 的时间复杂度完成修改。
前缀和用于快速修改序列中的区间,并在所有修改完成后读取。
一维差分
si={a1,i=1ai−ai−1, 2≤i≤n
实际编程中若 i 从 1 起则无需考虑 i=1 的特殊情况。
将区间 [l,r] 增加 z 可以转化为 sl=sl+z,sr+1=sr+1−z。
二维差分
si,j=⎩⎪⎪⎪⎨⎪⎪⎪⎧a1,1, i=1,j=1a1,j, i=1,2≤j≤mai,1, 2≤i≤n,j=1ai,j−ai−1,j−ai,j−1+ai−1,j−1, 2≤i≤n,2≤j≤m
实际编程中若 i,j 从 1 起则无需考虑前三种特殊情况。
将区间 [(x1,y1),(x2,y2)] 增加 z 可以转化为 sx1,y1=sx1,y1+z,sx2+1,y2+1=sx2+1,y2+1+z,sx1,y2+1=sx1,y2+1−z,sx2+1,y1=sx2+1,y1−z。