• 二叉索引树 树状数组


    树状数组 维护一个序列 a1 a2 a3……an

    支持两种操作:

    1. sum(int a,int b) a~b的区间和

    2. add(int x,int d) 第x个数增加d

    设lowbit(x)为x的二进制最右边的1表示的值

    如lowbit(38288)=lowbit(1001010110010000)=10000=16

    lowbit(i)=i&-i

    在树状数组中,对于节点i,如果它是左子结点,父节点为i+lowbit(i);如果它是右子节点,那么父节点是i-lowbit(i)

    (不要在意上面的手写)

    设置一个数组C,C[i]=A[i-lowbit(i)+1]+A[i-lowbit(i)+2]+...+A[i]

    C对应着那个黑块和它左面的白色长块,如C12=A9+A10+A11+A12

    那么如何算前缀和S呢?

    从i向上、左爬,把经过的C加起来,不一定沿树上的边,如S11=C11+C10+C8

    如果修改了一个Ai,如何更新C?

    从i开始向上、右爬,修改沿途的C即可。如修改了A3,C3->C4->C8

    代码:(短小精悍)

    int sum(int x){
        int ans=0;
        while(x>0){
            ans+=C[x];
            x-=lowbit(x);
        }
        return ans;
    }
    
    void add(int x,int d){
        while(x<=n){
            C[x]+=d;
            x+=lowbit(x);
        }
    }

    时间复杂度为log(n)

    预处理先把A、C清空,进行n次add,n log n

    树状数组相比线段树的优势:空间复杂度略低,编程复杂度低,容易扩展到多维情况。

    劣势:适用范围小,对可以进行的运算也有限制,比如每次要查询的是一个区间的最小值,似乎就没有很好的解决办法。

  • 相关阅读:
    pyhon简单比较文本相似度的方法
    MongoDB数据的导入、导出、备份与恢复
    django实现注册、登录小系统
    nginx+uwsgi部署django的简单介绍
    python操作Excel的几种方式
    Python的Pexpect的简单使用
    JVM之类加载
    Java中的绑定
    JVM之GC
    JVM之内存管理
  • 原文地址:https://www.cnblogs.com/FuTaimeng/p/5554474.html
Copyright © 2020-2023  润新知