使用BIT增加序列的数量

时间:2014-11-06 06:12:50

标签: algorithm

对于EX:序列正在给1 3 2 4现在我必须找到增加序列的数量 我开始了解BIT算法,与O(n 2 )相比,它给出了O(nlog 2 n)解决方案。
代码如下

void update(int idx ,int val){
    while (idx <= MaxVal){
        tree[idx] += val;
        idx += (idx & -idx);
    }
}

阅读

int read(int idx){
    int sum = 0;
    while (idx > 0){
        sum += tree[idx];
        idx -= (idx & -idx);
    }
    return sum;
}

我无法理解they如何使用BIT算法,请你帮助我

1 个答案:

答案 0 :(得分:1)

二进制索引树read函数将返回等于或小于idx的值的数量。

因此,通过逐个插入每个元素,从0到n(n是元素数)

  • 对于每个元素,我们需要知道有多少值小于当前元素,并且已经添加到BIT中。假设这个数字是x,那么在这个元素处结束的递增序列的数量是2 ^ x

  • 在计算了以此元素结尾的所有序列后,我们需要将此元素添加到BIT

伪代码:

long result = 0;
BIT tree = //initialize BIT tree
for(int i = 0; i < n; i++){
    int number = tree.read(data[i] - 1);// Get the number of element that less than data[i];
    result += 1L<< number;
    tree.update(data[i], 1);

}

由于更新和读取功能具有O(log n)时间复杂度,因此上述算法具有时间复杂度O(n log n)