zoukankan      html  css  js  c++  java
  • 树状数组

          平常我们会遇到一些对数组进行维护查询的操作,比较常见的如,修改某点的值、求某个区间的和,而这两种恰恰是树状数组的强项!当然,数据规模不大的时候,对于修改某点的值是非常容易的,复杂度是O(1),但是对于求一个区间的和就要扫一遍了,复杂度是O(N),如果实时的对数组进行M次修改或求和,最坏的情况下复杂度是O(M*N),当规模增大后这是划不来的!而树状数组干同样的事复杂度却是O(M*lgN),别小看这个lg,很大的数一lg就很小了。

          树状数组所白了是按照二分对数组进行分组;维护和查询都是O(lgn)的复杂度,复杂度取决于最坏的情况,也是O(lgn);lowbit这里只是一个技巧,关键在于明白c数组的构成规律;分析的过程二进制一定要深入人心,当作心目中的十进制。

    void add(int k,int num)  
    {  
        while(k<=n)  
        {  
            tree[k]+=num;  
            k+=k&-k;  
        }  
    }  
    int read(int k)//1~k的区间和  
    {  
        int sum=0;  
        while(k)  
        {  
            sum+=tree[k];  
            k-=k&-k;  
        }  
        return sum;  
    }  
  • 相关阅读:
    go module配置
    beego conf配置文件
    go string类型的特性
    go语言简单介绍,增强了解
    beego项目和go项目 打包部署到linux
    第一个go程序
    linux下vim编辑器查找 关键字
    配置ngnix下的虚拟主机
    PHP中文无乱码截取
    #1040
  • 原文地址:https://www.cnblogs.com/zeze/p/6249413.html
Copyright © 2011-2022 走看看