前缀和与差分
1. 前缀和 (Prefix Sum)
定义:将数组中前n个元素累加得到的新数组,用于快速计算区间和13。
- 一维公式:
sum[i] = sum[i-1] + arr[i]
- 二维公式:
sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + arr[i][j]
2
2. 差分 (Difference)
定义:记录相邻元素差值的新数组,用于快速实现区间增减操作37。
- 一维构造:
diff[i] = arr[i] - arr[i-1]
- 二维构造:差分矩阵每个元素对应原矩阵的增量变化5
3. 相互关系
- 差分是前缀和的逆运算,二者可相互转换47
- 差分数组的前缀和即原数组,前缀和数组的差分即原数组3
二、应用场景对比
技术 | 典型场景 | 时间复杂度 | 操作特点 |
---|---|---|---|
前缀和 | 区间求和、子矩阵求和 | O(1)查询 | 预处理O(n),适合高频查询 |
差分 | 区间批量增减、动态修改后求最终值 | O(1)修改 | 无需预处理,适合高频修改 |
三、实战代码示例
1. 一维区间增减(差分)
Cpp
void rangeUpdate(int l, int r, int val, vector<int>& diff) { diff[l] += val; if(r+1 < diff.size()) diff[r+1] -= val; } // 最终结果通过求差分的前缀和获得[7]()
2. 二维子矩阵求和(前缀和)
Cpp
int querySum(int x1, int y1, int x2, int y2, vector<vector<int>>& sum) { return sum[x2][y2] - sum[x1-1][y2] - sum[x2][y1-1] + sum[x1-1][y1-1]; } // 参考[2]()中的矩阵分解原理
四、高频考点与技巧
- 复合应用
- 差分修改后求前缀和,实现多次区间操作后快速获取结果7
- 结合二分查找优化边界条件,如「最大子段和」问题4
- 特殊处理技巧
- 环形数组:扩展数组为2n长度处理循环区间5
- 离散化处理:对稀疏大范围数据压缩坐标4
- 调试要点
- 验证前缀和与差分数组的互逆性
- 测试空数组、全零数组等边界情况1
五、工程实践建议
- 内存优化
- 二维场景使用滚动数组降低空间复杂度5
- 并发处理
- 差分数组支持并行化区间修改操作7
- 数据库优化
- 将前缀和预计算存储,加速统计类查询1
完整代码实现与进阶案例可参考25中的项目实例。在动态规划、图像处理等领域中,这两种技术常作为基础组件与其他算法结合使用。