📅  最后修改于: 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数组任意位置的值。
二维差分阵列是一种高效的支持二维数值数组区间修改和单点查询的数据结构。通过将原始数组转化为差分数组,可以实现高效地区间修改和单点查询。在需要频繁修改二维数值数组时,使用二维差分阵列可以获得良好的性能。