有人可以给我提供二维二元索引树的算法吗?
can someone provide me the algorithm of 2-d binary indexed tree?
我在互联网上搜索,但找不到好的。 我从 geeksforgeeks.org 那里得到了一些帮助,但无法理解我们在更新 BIT 数组时从 aux[i][j] 中减去 v1-v2-v2-v4+v3 的构造部分。只要让我知道我们为什么要在这里减去。
void constructAux(int mat[][N], int aux[][N+1])
{
// Initialise Auxiliary array to 0
for (int i=0; i<=N; i++)
for (int j=0; j<=N; j++)
aux[i][j] = 0;
// Construct the Auxiliary Matrix
for (int j=1; j<=N; j++)
for (int i=1; i<=N; i++)
aux[i][j] = mat[N-j][i-1];
return;
}
// A function to construct a 2D BIT
void construct2DBIT(int mat[][N], int BIT[][N+1])
{
// Create an auxiliary matrix
int aux[N+1][N+1];
constructAux(mat, aux);
// Initialise the BIT to 0
for (int i=1; i<=N; i++)
for (int j=1; j<=N; j++)
BIT[i][j] = 0;
for (int j=1; j<=N; j++)
{
for (int i=1; i<=N; i++)
{
// Creating a 2D-BIT using update function
// everytime we/ encounter a value in the
// input 2D-array
int v1 = getSum(BIT, i, j);
int v2 = getSum(BIT, i, j-1);
int v3 = getSum(BIT, i-1, j-1);
int v4 = getSum(BIT, i-1, j);
// Assigning a value to a particular element
// of 2D BIT
updateBIT(BIT, i, j, aux[i][j]-(v1-v2-v4+v3));
}
}
return;
}
在topcoder上有一个很好的解释2d二元索引树。
要了解aux[i][j]-(v1-v2-v4+v3)
请注意:
getSum(BIT,i,j)
返回矩形中所有元素的总和,左上角位于原点,右下角位于坐标 i,j。- 因此
getSum(BIT, i, j)-getSum(BIT, i, j-1)
是第 j 行中所有元素的总和,直到第 I 列 - 因此
getSum(BIT, i-1, j)-getSum(BIT, i-1, j-1)
是第 j 行中所有元素的总和,直到第 I-1 列 - 因此
v1-v2-v4+v3
是位置 I,j 的入场值
更新代码通过在位置添加值来工作。 在此代码中,他们希望将值设置为aux[i][j]
中的特定选项,因此执行此操作的方法是将目标值和当前值之间的差异相加。
(话虽如此,这段代码会依次更新每个值,所以你应该发现 v1-v2-v4+v3 总是等于零,因为每个值都开始清除(
相关文章:
- 数组索引的值没有增加
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 查找最接近的大于当前数字的数字的索引
- 在C++中调整向量中的索引
- 重载元组索引运算符-C++
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- 跟随整数索引列表的自定义类迭代器
- 如何在for循环中包含两个索引值的测试条件
- D3D11-将混合权重和索引传递到顶点着色器
- 将转换字符键入 int 以用作向量C++的索引
- 在 C++ 中访问数组负索引处的内存不会返回垃圾
- 如何为圆环创建索引
- 在子集化后将包含索引号的列表列表映射到标准索引序列
- 查找字符在两个索引之间出现的次数
- Azure Kinect 使用正文索引映射裁剪正文
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 数组索引重载错误
- 有人可以给我提供二维二元索引树的算法吗?