矩阵前缀和可视化演示
交互式学习矩阵前缀和算法及其实现
输入矩阵
×
控制面板
前缀和计算过程可视化
1
2
3
4
5
6
7
8
9
原始矩阵
→
前缀和矩阵
当前计算
计算前缀和矩阵位置 [0][0]:
第一个元素: 1
C++ 实现代码
void calculatePrefixSum(const vector<vector<int>>& matrix,
vector<vector<int>>& prefixSum) { ←
int rows = matrix.size();
int cols = matrix[0].size();
// 初始化第一个元素
prefixSum[0][0] = matrix[0][0];
// 计算第一行
for (int j = 1; j < cols; j++) {
prefixSum[0][j] = prefixSum[0][j-1] + matrix[0][j];
}
// 计算第一列
for (int i = 1; i < rows; i++) {
prefixSum[i][0] = prefixSum[i-1][0] + matrix[i][0];
}
// 计算其他位置
for (int i = 1; i < rows; i++) {
for (int j = 1; j < cols; j++) {
prefixSum[i][j] = prefixSum[i-1][j] + prefixSum[i][j-1]
- prefixSum[i-1][j-1] + matrix[i][j];
}
}
}
调用堆栈
- main()
变量状态
i = 0
j = 0
currentSum = 0
矩阵前缀和算法说明
矩阵前缀和是一种用于快速计算子矩阵和的数据结构。对于矩阵 A,其前缀和矩阵 P 定义为:
P[i][j] = Σ(A[x][y]), 0≤x≤i, 0≤y≤j
计算过程:
- 第一个元素 P[0][0] = A[0][0]
- 第一行:P[0][j] = P[0][j-1] + A[0][j]
- 第一列:P[i][0] = P[i-1][0] + A[i][0]
- 其他位置:P[i][j] = P[i-1][j] + P[i][j-1] - P[i-1][j-1] + A[i][j]
使用前缀和矩阵,可以在 O(1) 时间内计算任意子矩阵的和。时间复杂度为 O(m×n),其中 m 和 n 是矩阵的维度。