前缀和的定义
前缀和(Prefix Sum)是一种数组预处理技术,用于高效地计算数组中某个范围内元素的和。前缀和数组是原始数组的元素依次累加的结果。
具体来说,计算前缀和的步骤包括:
初始化一个前缀和数组,长度为原始数组长度加一。
从数组的第一个元素开始,依次累加得到前缀和数组的每个元素。
最终得到前缀和数组,其中每个元素表示原数组中对应位置之前所有元素的和。
由于每个元素只被访问一次,所以总体的时间复杂度是 O(n)。
这使得前缀和成为一种高效的预处理技术,特别是在需要多次查询数组中某个范围的元素和时。
感觉前缀和有一点动态规划的思想在里面 通过前后的关系找到状态转移方程
一维前缀和:
一维前缀和公式
S[i]=S[i−1]+a[i]
SUM =S[x2]-S[x1]
二维前缀和
二维前缀和公式
S[i][j]=S[i][j−1]+S[i−1][j]−S[i−1][j−1]+a[i][j]
SUM=s[x2][y2]−s[x1−1][y2]−s[x2][y1−1]+s[x1−1][y1−1]
一维差分
类似于数学中的求导和积分,差分可以看成前缀和的逆运算。
1.s[]数组是表示b[]数组前缀和的数组,此时b[]数组就是s[]数组的差分数组。
而b[i]=s[i]-s[i-1]。a
2.a[]数组是表示原数组,b[]数组表示差分数组
b[i]=a[i]-a[i-1]
二维差分
这里对比一维差分数组的求解,就是巧妙的将求二维前缀和的公式:
b[i] [j] = b[i-1][j] + b[i][j-1 ] - b[i-1][ j-1] + a[i] [j]
转换后求二维差分公式:a[i][j] = b[i][j] - b[i-1][j] - b[i][j-1] + b[i-1][j-1];
二维差分的使用
二维差分的主要用处:快速地将一个区块中的所有元素都加上一个值 v。使用差分可以将在数组 arr 上的区块操作转化为在差分数组 d 上的单点操作。
转换方式如下:假设区块左上角坐标为 (x1, y1),右下角坐标为 (x2, y2),对该区块中的每个元素都加上 v 等价于下面四个操作:
因为差分数组的前缀和相当于原数组,所以对差分数组进行以上四个单点操作后,就相当于给数组 arr 的区块加上一个值 v。