前缀和与差分

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]()中的矩阵分解原理


四、高频考点与技巧

  1. 复合应用
    • 差分修改后求前缀和,实现多次区间操作后快速获取结果7
    • 结合二分查找优化边界条件,如「最大子段和」问题4
  2. 特殊处理技巧
    • 环形数组:扩展数组为2n长度处理循环区间5
    • 离散化处理:对稀疏大范围数据压缩坐标4
  3. 调试要点
    • 验证前缀和与差分数组的互逆性
    • 测试空数组、全零数组等边界情况1

五、工程实践建议

  1. 内存优化
    • 二维场景使用滚动数组降低空间复杂度5
  2. 并发处理
    • 差分数组支持并行化区间修改操作7
  3. 数据库优化
    • 将前缀和预计算存储,加速统计类查询1

完整代码实现与进阶案例可参考25中的项目实例。在动态规划、图像处理等领域中,这两种技术常作为基础组件与其他算法结合使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值