二维前缀和与差分详解:原理、实现及应用
创作时间:
作者:
@小白创作中心
二维前缀和与差分详解:原理、实现及应用
引用
CSDN
1.
https://blog.csdn.net/2301_77160836/article/details/136824769
二维前缀和与二维差分是算法竞赛中常见的数据结构和算法技巧,主要用于解决矩阵元素的区间加减问题。本文将详细介绍二维前缀和与差分的概念、原理及应用,并通过具体的例子和代码实现帮助读者深入理解。
二维前缀和
二维前缀和的计算方法与一维前缀和类似,但需要考虑二维数组的特性。给定一个二维数组a
,其前缀和数组b
可以通过以下递推公式计算:
为了方便计算,通常在定义数组a
和b
时会多定义一行和一列的0,这样可以避免边界条件的特殊处理。
二维差分
差分可以看作是前缀和的逆运算。给定一个二维数组a
,其差分数组b
可以通过以下公式计算:
方法一:直观理解
这种方法通过构造差分矩阵来实现区间加减操作。具体步骤如下:
- 初始化差分矩阵
b
,大小为(n+2) x (m+2)
,其中n
和m
分别是原矩阵的行数和列数。 - 对于每个区间加减操作
(x1, y1, x2, y2, c)
,在差分矩阵b
中进行以下更新:
b[x1][y1] += c
b[x1][y2+1] -= c
b[x2+1][y1] -= c
b[x2+1][y2+1] += c
这种方法的时间复杂度为O(1)
,可以显著优化区间加减操作的效率。
方法二:优化实现
这种方法通过"曲线救国"的方式构造差分矩阵。具体步骤如下:
- 初始化差分矩阵
b
,大小为(n+2) x (m+2)
。 - 对于原矩阵
a
中的每个元素a[i][j]
,在差分矩阵b
中执行以下操作:
b[i][j] += a[i][j]
b[i][j+1] -= a[i][j]
b[i+1][j] -= a[i][j]
b[i+1][j+1] += a[i][j]
这种方法在构造差分矩阵时需要O(n*m)
的时间复杂度,但在后续的区间加减操作中仍然保持O(1)
的时间复杂度。
代码实现
以下是使用Python实现的二维差分算法:
def update_diff_matrix(b, x1, y1, x2, y2, c):
b[x1][y1] += c
b[x1][y2 + 1] -= c
b[x2 + 1][y1] -= c
b[x2 + 1][y2 + 1] += c
def construct_diff_matrix(a):
n, m = len(a), len(a[0])
b = [[0] * (m + 2) for _ in range(n + 2)]
for i in range(1, n + 1):
for j in range(1, m + 1):
b[i][j] = a[i - 1][j - 1] - a[i - 1][j] - a[i][j - 1] + a[i][j]
return b
def apply_operations(a, operations):
n, m = len(a), len(a[0])
b = construct_diff_matrix(a)
for x1, y1, x2, y2, c in operations:
update_diff_matrix(b, x1, y1, x2, y2, c)
return b
def reconstruct_matrix(b):
n, m = len(b) - 2, len(b[0]) - 2
res = [[0] * m for _ in range(n)]
for i in range(1, n + 1):
for j in range(1, m + 1):
res[i - 1][j - 1] = b[i][j] - b[i - 1][j] - b[i][j - 1] + b[i - 1][j - 1]
return res
# Example usage
a = [
[1, 2, 2, 1],
[3, 2, 2, 1],
[1, 1, 1, 1]
]
operations = [
(1, 1, 2, 2, 1),
(1, 3, 2, 3, 2),
(3, 1, 3, 4, 1)
]
b = apply_operations(a, operations)
result = reconstruct_matrix(b)
for row in result:
print(row)
总结
二维前缀和与差分是算法竞赛中常见的数据结构和算法技巧,主要用于解决矩阵元素的区间加减问题。通过构造差分矩阵,可以将区间加减操作的时间复杂度从O(n*m)
优化到O(1)
,显著提高算法效率。本文详细介绍了二维前缀和与差分的概念、原理及应用,并通过具体的例子和代码实现帮助读者深入理解。
热门推荐
处理邻里关系这件事儿,在其他国家也同样重要
环保企业如何获得投资方青睐?专家建议重视“软实力”培育
蔷薇怎么修剪才能爬满墙?
召唤师联盟防御类召唤兽怎么样解析
本地SEO优化 提升本地企业在线可见度的关键策略
孕妇感冒挂产科可以吗
“百善孝为先”背后,孝道的误区你踩过吗?
当想提前发言或插话时,怎样做才恰当
五保户可以过户房产吗?详细解析五保户房产与土地处理问题
车船税的征收方法是什么?了解车船税的征收标准有何帮助?
健康宝宝养成记:1岁宝宝的每日三餐及加餐科学安排指南
心速宁胶囊说明书:成分、功效与服用方法详解
二手房买卖报价技巧详解:如何把握市场行情,实现稳健收益
一亩草养多少只羊?详解影响因素及推荐牧草品种
湿热吃什么草药
为什么一个人出门会感到孤独?从心理学角度解析及应对方法
保险理财在个人财务规划中的作用
网络热词“op”的多样解读:从原贴到游戏,它如何演变?
十八路诸侯与董卓之战:实力与决心的较量
交通灯知识:红灯能否右转?全屏灯与箭头灯有何区别?
豆腐皮主要营养成分
如何把大量照片传到云盘
龙胆草的功效作用与副作用是什么
北魏为什么能轻松夺取南朝宋的青州冀州?--细品《资治通鉴》之南北风云
圣女贞德与断头玛丽:巴黎奥运会开幕式的历史象征
砷化镓GaAs的发展和制备方法
全屋净水方案及安装施工注意事项
如何选择空调插座?插座的安全性如何保障?
长痘痘时该吃什么水果?三类水果助你改善肌肤状况
吃什么水果对皮肤好消除痘痘