四维及以上前缀和公式推导

前言

我在全网搜索,发现没有一篇帖子涉及到四维及以上的前缀和,于是我在冥思苦想之后,根据数学+找规律总结出高维前缀和的公式。

思路

为了找规律,我们来看低维前缀和的公式。

一维

//预处理
s[i]=s[i-1]+a[i];
//求部分和
sum[l~r]=s[r]-s[l-1];

二维

s[i][j]=s[i-1][j]
+s[i][j-1]
-s[i-1][j-1]
+a[i][j];

sum[l1~r1][l2~r2]=s[r1][r2]
-s[r1][l2-1]
-s[l1-1][r2]
+s[l1-1][l2-1];

三维

s[i][j][k]=s[i-1][j][k]
+s[i][j-1][k]
+s[i][j][k-1]
-s[i-1][j-1][k]
-s[i-1][j][k-1]
-s[i][j-1][k-1]
+s[i-1][j-1][k-1]
+a[i][j][k];

sum[l1~r1][l2~r2][l3~r3]=s[r1][r2][r3]
-s[r1][r2][l3-1]
-s[r1][l2-1][l3]
-s[l1-1][r2][r3]
+s[l1-1][l2-1][r3]
+s[l1-1][r2][l3-1]
+s[r1][l2-1][l3-1]
-s[l1-1][l2-1][l3-1];

四维

到四维我们发现有些不对起来了,因为我们所处的世界是三维的,理解不了高维的东西,但我们可以进行类比研究。

预处理

以三维来举例我们可以发现,s[i][j][k]轮流加上s[i-1][j][k],s[i][j-1][k],s[i][j][k-1],仔细研究可以加上的是只有一维进行更改的。

然后s[i][j][k]又开始减去s[i-1][j-1][k],s[i-1][j][k-1],s[i][j-1][k-1],这些东西只改变了两个维度。

最后s[i][j][k]又开始加上s[i-1][j-1][k-1],改变了三个维度

大家可否发现什么,没错,只改变奇数个维度的数被加上,只改变偶数个维度的数被减去。

因此,根据上述猜想可以写出:

s[i][j][k][l]=s[i-1][j][k][l]
+s[i][j-1][k][l]
+s[i][j][k-1][l]
+s[i][j][k][l-1]
-s[i-1][j-1][k][l]
-s[i-1][j][k-1][l]
-s[i-1][j][k][l-1]
-s[i][j-1][k-1][l]
-s[i][j-1][k][l-1]
-s[i][j][k-1][l-1]
+s[i-1][j-1][k-1][l]
+s[i-1][j][k-1][l-1]
+s[i][j-1][k-1][l-1]
-s[i-1][j-1][k-1][l-1]
+a[i][j][k][l];

求解

如果是求sum[l1~r1][l2 ~r2][l3 ~r3][l4 ~r4]呢?

还是类比,这次我不在细讲,直接给结论

每次只有l的维度(如:l1,l2,l3,l4)会被更改,其他的根预处理正好相反,奇数次会被减去,偶数次会被增加

sum[l1~r1][l2~r2][l3~r3][l4~r4]=s[r1][r2][r3][r4]
+s[l1-1][r2][r3][r4]
-s[r1][l2-1][r3][r4]
-s[r1][r2][l3-1][r4]
+s[r1][r2][r3][l4-1]
+s[l1-1][l2-1][r3][r4]
+s[l1-1][r2][l3-1][r4]
+s[l1-1][r2][r3][l4-1]
+s[r1][l2-1][l3-1][r4]
+s[r1][l2-1][r3][l4-1]
+s[r1][r2][l3-1][l4-1]
-s[l1-1][l2-1][l3-1][r4]
-s[l1-1][r2][l3-1][l4-1]
-s[r1][l2-1][l3-1][l4-1]
+s[l1-1][l2-1][l3-1][l4-1];

更高维

更高维的前缀和的规律和上述一致

总结

这样,我们就研究出高维前缀和的公式

预处理

只改变奇数个维度的数被加上,只改变偶数个维度的数被减去。

求解

每次只有l的维度(如:l1,l2,l3,l4)会被更改,其他的根预处理正好相反,奇数次会被减去,偶数次会被增加

<think>好的,用户让我用图解释二维前缀和。首先,我需要确定用户对这个概念的理解程度。可能他们是刚开始学习算法或者数据结构,特别是在处理矩阵相关的问题时遇到了困难。二维前缀和常用于快速计算子矩阵的和,这在动态规划或者图像处理中很常见。 用户的需求是直观的图示解释,所以文字描述需要简洁,配合图示的关键点。不过由于只能文字回复,我需要用语言描述清楚图示的结构。可能需要先介绍一维前缀和,再扩展到二维,这样用户更容易理解。 接下来,我需要考虑如何分步骤解释。首先定义二维前缀和数组,然后说明如何构建这个数组,最后举例如何计算子矩阵的和。需要确保每一步都有清晰的公式和例子,比如用具体的数字矩阵来演示计算过程。 可能用户对公式中的符号不太熟悉,所以要用简单的语言解释每个符号的意义。例如,s[i][j]表示从(1,1)到(i,j)的子矩阵和,然后分解成四个部分来说明递推公式。同时,要强调如何通过递推公式避免重复计算,提高效率。 还要注意可能出现的误区,比如边界条件的处理,当i或j为0时的初始化问题。在例子中,使用具体的数字矩阵可以更直观地展示计算步骤,用户可以通过跟随例子来验证自己的理解是否正确。 最后,在应用场景部分,需要举出实际的问题,比如LeetCode题目,这样用户可以看到二维前缀和的实际用途,加深理解。同时,提醒用户注意矩阵索引的起始位置,不同的实现可能有不同的初始化方式,这也是容易出错的地方。 总结一下,回答的结构应该是:定义→构建方法→查询方法→示例→应用场景→注意事项。确保每个部分都有清晰的标题和分点,使用公式时用$$包裹,行内公式用$,并且语言简洁,符合中文表达习惯。</think>好的,我将通过结构化描述和公式推导来解释二维前缀和的核心原理,以下是分步说明: --- ### 一、基本定义 **二维前缀和(2D Prefix Sum)** 是一种预处理技术,用于快速计算矩阵中任意矩形区域的和。定义前缀和矩阵$S$,其中$S[i][j]$表示原矩阵$A$从左上角$(1,1)$到右下角$(i,j)$形成的子矩阵元素和。 数学表达式: $$ S[i][j] = A[i][j] + S[i-1][j] + S[i][j-1] - S[i-1][j-1] $$ --- ### 二、构建过程图解 假设原矩阵$A$为: ``` 1 2 3 4 5 6 7 8 9 ``` **步骤1:初始化前缀和矩阵** 边界条件处理: - 当$i=0$或$j=0$时,$S[i][j]=0$ **步骤2:递推填充** 按行优先顺序计算每个$S[i][j]$: ``` S[1][1] = 1 + 0 + 0 - 0 = 1 S[1][2] = 2 + 0 + 1 - 0 = 3 ... 最终前缀和矩阵: 1 3 6 5 12 21 12 27 45 ``` --- ### 三、子矩阵和查询 要计算原矩阵中矩形区域$(x1,y1)$到$(x2,y2)$的和: $$ \text{Sum} = S[x2][y2] - S[x1-1][y2] - S[x2][y1-1] + S[x1-1][y1-1] $$ **几何解释**: 通过四块区域的加减操作,去除多余部分(类似容斥原理): ``` S[x2][y2] - S[x1-1][y2] ▲ ▲ | | ▼ ▼ - S[x2][y1-1] + S[x1-1][y1-1] ``` --- ### 四、应用示例 计算$A$中$(2,2)$到$(3,3)$区域的和(即元素5,6,8,9): $$ \text{Sum} = S[3][3] - S[1][3] - S[3][1] + S[1][1] = 45 - 6 - 12 + 1 = 28 $$ --- ### 五、应用场景 1. 图像处理中的区域像素统计 2. LeetCode 304题「二维区域和检索 - 矩阵不可变」 3. 动态规划中的子矩阵优化问题 --- ### 六、复杂度分析 | 操作 | 时间复杂度 | 空间复杂度 | |------------|------------|------------| | 预处理构建 | $O(mn)$ | $O(mn)$ | | 单次查询 | $O(1)$ | - | --- **注意事项**: - 矩阵索引通常从1开始计数以避免边界判断 - 实际编程时需注意矩阵的行列索引方向一致性 是否需要通过具体代码实现进一步说明?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值