树状数组简单总结

1、树状数组最早用于数据压缩。
2、c[i]的初始位置是去掉最低位的1之后加上1.(最后一个1代表的权值表示c中拥有a的个数。)
3、c[i]下标的起点是下标 x=i-[i&(-i)]+1;
4、树状数组之所以高效简洁的原因就是能够利用位运算直接求出i对应的lowbit。
# define lowbit(x)((x)&(-x));
int lowbit(int i){
return i&(-i);
}


5、某一a[i]的值,位于数状数组中位置关系是i=i+lowbit(i)
void update(int i,int data){
while(i<=n){
c[i]+=data;     //改变需要修改的数据。
i+=lowbit(i);  //a[i]所在的下一个c中的位置。
}
}


6、树状数组与原始数组的关系:
c[i]=a[i-lowbit(i)+1]+...a[i];
以及
a[i]∈c[i],c[i=i+lowbit(i)],c[i=i+lowbit(i)]...
7、树状数组与累加数组:
sum[i]=c[i]+c[i=i-lowbit(i)]+c[i=i-lowbit(i)]+...;(最后一个1代表的权值与i位置的差即为sum包含的数的个数0的时候是1)
int query(int i)
{
    int ans=0;
     while(i>0){
    ans+=c[i];
    i-=lowbit(i);
    }
return ans;
}


8、扩展到多维时的情形:
void update(int x,int y,int data){
for(;x<=n;x+=lowbit(x))
    for(j=y;j<=m;j+=lowbit(j))
    c[x][j]+=data;
}/*updata数据插入*/
int query(int x,int y)
{
    int ans=0;
    for(;x>0;x-=lowbit(x))
       for(j=y;j>0;j-=lowbit(j))
           ans+=c[x][j];
return ans;
}

/*query求和查询*/
9、树状素组特点:
(1)树状数组十分容易进行编程实现。
(2)树状数组的每个操作花费常数时间或是o(log2N)的时间。
(3)树状数组需要线性的存储空间o(n),只维护c数组。
(4)树状数组可以扩展为n维的情况。
10、总结:
弊端:
(1)树状数组的致命缺点是无法记录一些附加信息,比如:不相交区间的个数,就无法用树状数组维护
(2)树状数组的应用范围是很窄的。(求和的问题可以用树状数组,如果求最大值操作,而且没有删除操作的话,那么也能够用树状数组。)






  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值