您的位置:首页 > 其它

树状数组算法分析

2017-07-31 19:59 232 查看
最近经常碰到树状数组的问题,  就不如写一写对这个算法的理解吧;

先偷一张图:





大概理解就是, 对于 c[]数组 是整个树状数组里的灵魂, 也可是tree[] 数组,   其实A[] 数组 是不存在的(可以这么理解 ) 借势,

C[8]= C[4] + C[6] + C[7] + A[8]

而 C[4] = C[2] +C[3] + A[4]  

C[6] = C[5] + A[ 6] 

对于 从 8 -4-6-7  这些数 经历的变化 用k 来表示,  二进制啥的  一系列转化

变成这个: k&(-k);
K 在变化, 但是变化的工程中就把所有的都访问了, 一级管一级的意思,

树状数组维护:

'void add(int k,int num)//维护添加值
{
while(k<=2*n)
{
tree[k]+=num;
k+=k&(-k);// lowbit(k)= k&(-k);
}
}
求 区间[1-x]的和

int Sum(int x)//求区间[1,x] 的和
{
int sum=0;
while(x)
{
sum+=tree[x];
x-=x&(-x);
}
return sum;
}求 x - y 的和
int Get_sum(int y,int x)// x-y区间的和
{
return Sum(y)-Sum(x);
}


一般 的用法, 如果 我要求 x-- y 之间 的数值和,  我可以 先对add(y,1); 使 y 前面的 都 +1;  然后add(x,-1); 对x 前面的都-1   然后 x ,y 之间的 就是结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: