树状数组(Binary Indexed Tree)

本文深入解析树状数组的应用场景、算法过程及其复杂度,包括预处理、区间和求解、数据更新等核心步骤,并通过示例代码展示其实现细节。重点突出树状数组在解决多次区间查询与数据更新问题上的优势。

应用:

        树状数组一般用来求区间的和,适合于给出一连串的数,多次求区间的和和以及多次更新某个位置的数

算法过程:
    预处理:
        对于:a[1],a[2],a[3] .....a[N];(求a数组中某区间的和)
        定义函数lowbit(i)=i&(i^(i-1);
        可得lowbit=pow(2,k),k为i的二进下制下末尾的0的个数
        c[i]=a[i-lowbit(i)+1]+a[i-lowbit(i)+2]+a[i-lowbit(i)+3]...a[i];
        伪代码:
         for i to n do
             j:=i-lowbit(i)+1;
             c[i]:=0;   
             for j to i do
                  c[i]:=c[i]+a[j];
    求区间和:
        求区间[from,to]的和:
        可得ans=sum[to]-sum[from-1];
        sum(k)=c[N1]+c[N2]+c[N3]....c[Nm];(Nm>0)
        N1=k;
        Ni-1=Ni-lowbit(Ni);
        伪代码:   
            ni=k;     
            ans:=0;
             while(ni>0)
            {
                ans:=ans+c[ni];
                ni-=lowbit(ni);(ni每次将二进制下最右边的1变成0)

       
            }
            sum(k)=ans;

         复杂度为O(log(k))   INT(log(k))+1可理解为k二进制下的位数 (INT为取整)
      数据更新:
        a[i]的数据更新,则c[Ni],c[Ni+1],c[Ni+2]....c[Nm];(Nm<=n)
        Ni+1=Ni+lowbit(Ni);
        伪代码:   
                ni=i;
                ans=0;
                while(ni>0)
                {
                    ans:=ans+c[ni];
                    ni:=ni+lowbit(ni);(ni二进制下最右边的1向前进1位直到为N)

       
                }
        复杂度为(log(N));  (N=length(a));

 

 示例代码:

            

      
       
       
       
       
       
     

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值