有人能为我提供二维二进制索引树的算法吗?

时间:2017-07-26 17:58:34

标签: c++ algorithm fenwick-tree 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;
}

1 个答案:

答案 0 :(得分:0)

topcoder上的2d二进制索引树有一个很好的解释。

要理解aux[i][j]-(v1-v2-v4+v3)注意:

  1. getSum(BIT,i,j)返回矩形中所有元素的总和,其中左上角位于原点,右下角位于坐标i,j。
  2. 因此getSum(BIT, i, j)-getSum(BIT, i, j-1)是第j行到列i的所有元素的总和
  3. 因此getSum(BIT, i-1, j)-getSum(BIT, i-1, j-1)是第j行到列i-1
  4. 的所有元素的总和
  5. 因此v1-v2-v4+v3是位置i,j
  6. 的输入值

    更新代码的工作原理是在某个位置添加值。在此代码中,他们希望将值设置为aux[i][j]中的特定选项,因此,这样做的方法是添加目标值和当前值之间的差异。

    (话虽如此,此代码依次更新每个值,因此您应该发现v1-v2-v4 + v3始终等于零,因为每个值都开始清除)