对于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算法,请你帮助我
答案 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)