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

    树状数组


    基本概念

    Binary Indexed Tree
    二叉索引树
    它的查询和修改的时间复杂度都是log(n),空间复杂度则为O(n).


    二进制操作

     

    如上图所示,可以写出下列式子:
    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
    ...
    C16 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 + A9 + A10 + A11 + A12 + A13 + A14 + A15 + A16

    Ci有自己的管辖区域,
    这需要看Ci化成二进制后后面有多少个零,
    那么这个节点管辖的区间为2^k(2的k次方)
    但是要想求最后有多少个零要怎么求呢?不急,现在就是二进制使用的时候了.

    1    int lowbit(int x){
    2           return x&(-x);
    3     }
    4 
    5     int lowbit(int x){
    6         return x&(x^(x-1));
    7     }

    这两种是求二进制的补码,再进行与操作,最后的出结果.


    单点修改

    当我们要对最底层的值进行更新时,那么它相应的父亲节点存储的和也需要进行更新

    1     void update(int x,int val){
    2           while(x<MAX){
    3             tree[x] = val;
    4             x += lowbit(x);
    5           }
    6       }

    区间查询

    查询的时候,则需要向前进行统计

    1     int add(int x){
    2         int sum = 0;
    3         while(x>0){
    4             sum+=tree[x];
    5             x -= lowbit(x);
    6         }
    7         return sum;
    8     }

    其实树状数组里面更多的是二进制的理解,只要理解,就可以很快的掌握这些.

  • 相关阅读:
    js 数据格式化
    js 获取URL中参数
    微信公众平台JSSDK开发
    js 日期格式化及日期增减
    一句话的设计模式
    微信小程序开源项目库汇总
    bash 配置文件
    centos 设置时间为北京时间
    数据库一般数据的查询操作
    linux tmux 工具使用 tmux.conf 文件
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/9342044.html
Copyright © 2011-2022 走看看