矩阵前缀和可视化演示

交互式学习矩阵前缀和算法及其实现

输入矩阵

×

控制面板

前缀和计算过程可视化

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 是矩阵的维度。

© 2024 算法可视化教学工具