[数据结构]树状数组

    刷题遇到树状数组,在这里做一下总结。

    树状树状是一种数据结构,可以在o(logn)的时间内对元素进行修改和求和

   1、根据元素数组构建树状数组

   

     数组A为原数组,数组C为树状数组

    
    C1 = A1 
    C2 = A1 + A2 
    C3 = A3 
    C4 = A1 + A2 + A3 + A4 
    C5 = A5 
    C6 = A5 + A6 
    C7 = A7 
    C8 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8

      C[x]求解: 

        将x转换为二进制1***1000,C[1***1000]=A[1***0001]+A[1***0010]+.....+A[1***1000]即获得x的二进制中最后一位1的位数k,求从A[x]开始向左数的2的k次方个数组的和。

       

int lowbit(int n)  
{  
    return n& (-n);    
        //or return n&(n^(n-1));  
}  

     更新数组:

    当原数组进行更新时,树状数组与原数组有关的每一个数组都需要进行更新:

   

void update(int i, int val)  //将第i个元素增加val  
{  
    //与A[i]相关的所有的C[i]更新 
    while(i <= n)  
    {  
        C[i] += val;  
        i += lowbit(i);   //下一个 
    }  
}  


   求数组前n项和:

   

int Sum(int i)   //求前i项的和  
{  
    int s = 0;  
    while(i > 0)  
    {  
        s += C[i];  
        i -= lowbit(i);  //去掉i的二进制最后一个  
    }  
    return s;  
}  


      

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值