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

二维差分(2D Difference Array)详解

二维差分

一、二维差分是什么?

二维差分(2D Difference Array)是一种:

用于“高效进行矩形区域批量修改”的算法技巧。

它通常搭配:

  • 二维前缀和(2D Prefix Sum)
  • 矩阵区间修改
  • 图像区域处理
  • 算法竞赛

一起使用。


二、它解决什么问题?

假设有一个二维矩阵:

5 x 5

现在需要频繁进行操作:

给某个矩形区域全部 +v

例如:

(x1,y1) 到 (x2,y2)

全部加上 v


三、暴力做法的问题

普通写法:

for i in range(x1, x2 + 1):for j in range(y1, y2 + 1):a[i][j] += v

一次修改复杂度:

O(nm)

如果:

  • 更新很多次
  • 矩阵很大

会非常慢。


四、二维差分核心思想

二维差分本质:

不直接修改整个矩形,
只记录“影响从哪里开始、从哪里结束”。

最后再统一恢复。


五、二维差分更新公式

对于矩形:

[x1,x2] × [y1,y2]

全部加 v

d[x1][y1] += v
d[x2 + 1][y1] -= v
d[x1][y2 + 1] -= v
d[x2 + 1][y2 + 1] += v

六、为什么这样做?

1. 左上角 +v

d[x1][y1] += v

表示:

从这里开始产生影响。


2. 下边界 -v

d[x2 + 1][y1] -= v

表示:

到 x2 为止,
x2+1 开始取消影响。


3. 右边界 -v

d[x1][y2 + 1] -= v

表示:

到 y2 为止,
y2+1 开始取消影响。


4. 右下角 +v

d[x2 + 1][y2 + 1] += v

这是最容易绕晕的地方。

因为:

下边减了一次
右边减了一次

所以:

右下区域被减了两次

因此需要:

补回来一次

这其实就是:

容斥原理


七、注意:差分数组 ≠ 最终数组

很多人容易误解:

d[i][j]

是不是:

最终矩阵的值

其实不是。


差分数组表示的是:

“变化从哪里开始/结束”

不是最终结果。


八、二维前缀和恢复原矩阵

恢复公式:

a[i][j]
=
d[i][j]
+ a[i-1][j]
+ a[i][j-1]
- a[i-1][j-1]

代码:

for i in range(1, n + 1):for j in range(1, m + 1):d[i][j] += (d[i-1][j]+ d[i][j-1]- d[i-1][j-1])

恢复后:

d[i][j]

就变成最终矩阵。


九、二维差分为什么是闭区间?

很多人会疑惑:

d[x2+1][y2+1] += v

是不是说明:

右下角也被加了?

其实不是。


真正的有效区域是:

[x1,x2]
[y1,y2]

也就是:

闭区间

因为:

x2+1
y2+1

只是:

“从下一格开始取消影响”

不是最终区域。


十、经典例子

假设:

给矩形:
(1,1) 到 (2,2)
全部 +1

差分更新:

d[1][1] += 1
d[3][1] -= 1
d[1][3] -= 1
d[3][3] += 1

差分数组:

 1  0 -10  0  0
-1  0  1

注意:

(3,3)
确实是 +1

但:

这不是最终值。

做二维前缀和后:

1 1 0
1 1 0
0 0 0

真正的 +1 区域:

只有左上 2x2

因此:

d[x2+1][y2+1]+=v

只是:

“抵消重复减法”

不是:

“真的给右下角加值”


十一、复杂度优势

暴力修改

一次:

O(nm)

k次:

O(knm)

二维差分

每次更新:

O(1)

最后统一恢复:

O(nm)

总复杂度:

O(k + nm)

优化巨大。


十二、典型应用场景

二维差分常用于:

1. 图像处理

例如:

  • 区域增亮
  • 区域模糊
  • 像素批量修改

2. 游戏地图

例如:

  • AOE范围伤害
  • 区域Buff
  • 地图染色

3. 算法竞赛

经典题:

  • 区间加法
  • 矩阵批量更新
  • 二维前缀和综合题

十三、一句话总结

二维差分本质:

只记录矩形影响的开始与结束,
最后通过二维前缀和扩散到整个区域。

它不是直接修改矩阵,

而是:

“记录影响传播规则”

http://www.jsqmd.com/news/791257/

相关文章:

  • 技术突破:PyWxDump 4.0如何破解微信数据解析的四大技术壁垒
  • 2026届必备的六大AI论文平台实际效果
  • 从3:2到4:2压缩:华莱士树乘法器的延时优化之路
  • js逆向-某政策数据平台
  • linux执行应用程序或者shell脚本关于污不污染的问题
  • 中央电教馆少儿硬笔书法教师证书法教育培训证书详解及正规报考指南 少儿硬笔书法教师证书报考条件 书法教育培训教师证书含金量 书法家教需要什么资质证书 一文解答 - 教育官方推荐官
  • Royal TSX中文汉化终极指南:3步让专业远程管理工具说中文
  • 如何用MCA Selector轻松清理Minecraft世界:终极免费区块管理指南
  • 匿名内部类的使用场景
  • Taotoken平台在应对突发高并发请求时的稳定性观察
  • 在Node.js后端服务中集成Taotoken调用AI模型的步骤
  • 如何在Blender中完美导入导出3MF文件:完整3D打印工作流指南
  • Python Pillow库:`img.format`与`img.mode`的区别详解
  • 为Hermes Agent工具链配置Taotoken自定义供应商接入
  • 基于微信小程序的医院体检管理系统(30272)
  • 公众号附件添加工具软件小程序(政企小编都在用)政企云文档小程序 - 政企云文档
  • 如何快速上手Draw.io Mermaid插件:面向新手的终极绘图解决方案
  • 书匠策AI拆解实验:我用一个论文小白的视角,测了它的毕业论文全流程功能
  • 终极指南:如何用DeepL翻译插件实现跨语言无障碍浏览
  • 使用Taotoken后,模型API调用的延迟与稳定性体感观察
  • 开源协作工具OpenClaw-CC:基于Git与Markdown的内容创作平台设计与部署
  • 深圳水管漏水检测性价比选品指南:从实测维度拆解优劣 - 奔跑123
  • AutoCAD二次开发避坑:DCL对话框加载失败、位置错乱的5个常见问题及解决方法
  • 如何快速提升GitHub下载速度:智能加速工具的完整指南
  • Source Han Serif CN:5大核心优势与跨平台部署全指南
  • 如何在Windows上实现专业级网络转发:socat-windows终极使用指南
  • 【2026奇点智能技术大会首发】:AI原生开发流程重构的5大颠覆性范式与落地路线图
  • KMS_VL_ALL_AIO:Windows与Office批量激活的自动化解决方案
  • 5分钟上手:这款免费AI语音转文字工具如何改变你的工作方式?
  • 书匠策AI拆解:毕业论文这场“闯关游戏“,AI到底能替你打通几关?