当前位置: 首页 > news >正文

前缀和与差分

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中的项目实例。在动态规划、图像处理等领域中,这两种技术常作为基础组件与其他算法结合使用。

相关文章:

  • 【深度学习】Adam和AdamW优化器有什么区别,以及为什么Adam会被自适应学习率影响
  • 鸿蒙开发深入浅出03(封装通用LazyForEach实现懒加载)
  • MySQL 数据库基础
  • Ryu控制器:L2交换功能实现案例
  • 帆软report
  • 使用GPU训练模型
  • js数据类型检测
  • Linux 常见面试题汇总
  • Baklib一站式企业知识库搭建指南
  • Deepseek首页实现 HTML
  • 连接Sql Server时报错无法通过使用安全套接字层加密与 SQL Server 建立安全连接
  • 通俗易懂的浏览器事件循环指南(含async/await)
  • Linux提权之计划任务反弹shell提权(十一)
  • 【Viewer.js】vue3封装图片查看器
  • 【时时三省】(C语言基础)结构化程序设计方法
  • 二:前端发送POST请求,后端获取数据
  • Java并发 ThreadLocal 原理(详解)
  • c++中,什么时候应该使用mutable关键字?
  • Bash Shell控制台终端命令合集
  • C语言番外篇(3)------------>break、continue
  • 夜读丨庭院春韵
  • 上海明天起进入“升温通道”,五一假期冲刺33℃
  • 热点问答|第三轮间接谈判结束,美伊分歧还有多大?
  • 上海市市管干部任职前公示:赵亮拟为地区区长人选
  • 视频丨伊朗阿巴斯港一处油罐发生高强度爆炸:造成大面积破坏,伤亡不明
  • 偷拍拷贝某轨道车技术信息后撰写论文发表,工程师被判一年有期徒刑