国内资料:http://baike.baidu.com/view/1420784.htm
国外资料:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=binaryIndexedTrees
重点:
储存策略,更新策略,查找策略, x & (-x)的证明
数组从1开始
自己实现的代码如下:
#include <iostream>
int const N = 1000;
int tree[N];
void updateBIT(int* a, int idx, int len)
{
int val = a[idx];
while(idx <= len)
{
tree[idx] += val;
idx += (idx & (-idx));
}
};
void buildBIT(int* a, int len)
{
memset(tree, 0, len * sizeof(int));
for(int i = 1; i <= len; i++)
{
updateBIT(a, i, len);
}
};
int getSum(int idx)
{
int sum = 0;
while(idx > 0)
{
sum += tree[idx];
idx -= (idx & (-idx));
}
return sum;
};
int main()
{
int a[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
buildBIT(a, 20);
for(int i = 1; i <= 20; i++)
{
std::cout << "Sum[" << i << "] = " << getSum(i) << std::endl;
}
return 0;
}