码迷,mamicode.com
首页 > 编程语言 > 详细

树状数组

时间:2018-07-20 16:53:29      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:分享图片   str   mat   load   code   单点   shu   original   div   

树状数组


基本概念

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     }

 

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

树状数组

标签:分享图片   str   mat   load   code   单点   shu   original   div   

原文地址:https://www.cnblogs.com/zllwxm123/p/9342044.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!