📜  二维差分阵列(1)

📅  最后修改于: 2023-12-03 15:06:20.230000             🧑  作者: Mango

二维差分阵列介绍

什么是二维差分阵列

二维差分阵列(2D difference array)是一种数据结构,用于支持二维数值数组的区间修改和单点查询。其主要思想是将原始数组转化为一系列差分数组,从而支持高效的区间修改。

具体来说,对于一个二维数值数组A,我们可以定义一个和A同维度的差分数组B,其中B[i][j]表示A[i][j]与A[i-1][j] + A[i][j-1] - A[i-1][j-1]的差值。这样,对于B数组的区间修改,可以通过修改四个角落的差分值来实现,从而高效地修改A数组的任意区间。单点查询时,则需要根据B数组构造前缀和,从而求出任意位置的值。

二维差分阵列的适用场景

二维差分阵列主要适用于以下情况:

  • 二维数组需要频繁进行区间修改和单点查询,而且修改操作的次数较多;
  • 数据规模较大,一般的线段树或树状数组无法满足性能要求。
二维差分阵列的实现

下面是一个基本的二维差分阵列的实现(使用C++语言):

#include <iostream>
#include <vector>
using namespace std;

class DifferenceArray2D {
public:
    DifferenceArray2D(vector<vector<int>>& nums) {
        int n = nums.size(), m = nums[0].size();
        B = vector<vector<int>>(n, vector<int>(m, 0));
        for (int i=0; i<n; i++) {
            for (int j=0; j<m; j++) {
                if (i == 0 && j == 0) {
                    B[i][j] = nums[i][j];
                } else if (i == 0) {
                    B[i][j] = nums[i][j] - nums[i][j-1];
                } else if (j == 0) {
                    B[i][j] = nums[i][j] - nums[i-1][j];
                } else {
                    B[i][j] = nums[i][j] - nums[i-1][j] - nums[i][j-1] + nums[i-1][j-1];
                }
            }
        }
    }

    void update(int row1, int col1, int row2, int col2, int val) {
        B[row1][col1] += val;
        if (row2 + 1 < B.size() && col2 + 1 < B[0].size()) {
            B[row2+1][col2+1] += val;
        }
        if (row2 + 1 < B.size()) {
            B[row2+1][col1] -= val;
        }
        if (col2 + 1 < B[0].size()) {
            B[row1][col2+1] -= val;
        }
    }

    int get(int row, int col) {
        int res = B[row][col];
        if (row > 0) {
            res += B[row-1][col];
        }
        if (col > 0) {
            res += B[row][col-1];
        }
        if (row > 0 && col > 0) {
            res -= B[row-1][col-1];
        }
        return res;
    }

private:
    vector<vector<int>> B;
};

该实现中,构造函数接受一个二维数值数组作为输入,并创建一个对应的二维差分数组。update()函数支持对B数组的任意区间修改,get()函数支持获取B数组任意位置的值。

总结

二维差分阵列是一种高效的支持二维数值数组区间修改和单点查询的数据结构。通过将原始数组转化为差分数组,可以实现高效地区间修改和单点查询。在需要频繁修改二维数值数组时,使用二维差分阵列可以获得良好的性能。