博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Binary indexed tree
阅读量:7083 次
发布时间:2019-06-28

本文共 1682 字,大约阅读时间需要 5 分钟。

  hot3.png

Fenwick tree

它又叫 Binary indexed tree ,也叫树状数组。

能在log(n)查询区间和,并且在log(n)时间内进行结点更新操作。

 

 

lowbit(x)函数

定义lowbit(x)为x的二进制表达式中最右边的1所对应的值。

比如,1234的二进制是0100 1101 0010  lowbit(1234)=2,在程序的实现中,

Lowbit(x)=x&-x;(为什么这样写呢?因为计算机内部采用补码表示,-x是x按位取反,尾数+1的结果)

 

树的结构图

让我们来看看图:横坐标是x, 纵坐标是lowbit(x)

对于节点x,

  • 为左子结点,则父结点的编号是x+lowbit(x),
  • 为右子结点,则父结点的编号是x-lowbit(x)

设C[i] 为以i结尾的水平长条内的元素之和,如c[6]=a5+a6。

  • 顺着结点I往左走,边走边往上爬,沿途经过的c[i]所对应的长条不重复不遗漏的包含了所有需要累加的元素。
    • 如sum(6) = c[6] + c[4]
  • 如果修改了一个a[i] ,那么从c[i]往右走,边走边网上爬,沿途修改所有结点对应的c[i]即可。
    • 如a[1] + 1 那么 c[1] + 1, c[2]+1,c[4]+1………一直到最大值。

用C++ 的代码如下:

inline int lowbit(int x) { return x&(-x) ; } 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);     } }

 

 

 

实现代码

写成类的话:

C++

 

 
class FenwickTree {	vector
sum_array; int n; inline int lowbit(int x) { return x & -x; }public: FenwickTree(int n) :n(n), sum_array(n + 1, 0) {} void add(int x, int val) { while (x <= n) { sum_array[x] += val; x += lowbit(x); } } int sum(int x) { int res = 0; while (x > 0) { res += sum_array[x]; x -= lowbit(x); } return res; }};

 

 

Python

 

class FenwickTree(object):    def __init__(self, n):        self.sum_array = [0] * (n + 1)        self.n = n    def lowbit(self, x):        return x & -x    def add(self, x, val):        while x <= self.n:            self.sum_array[x] += val            x += self.lowbit(x)    def sum(self, x):        res = 0        while x > 0:            res += self.sum_array[x]            x -= self.lowbit(x)        return res

 

 

 

 

 

转载于:https://my.oschina.net/sukai/blog/1624968

你可能感兴趣的文章
hadoop(2.5,2.6) HDFS偶发性心跳异常以及大量DataXceiver线程被Blocked故障处理分享
查看>>
中控集团杭州深蓝数智专场 — 纯前端表格技术应用研讨会
查看>>
我的友情链接
查看>>
kvm打开虚拟机失败Failed to bindsocket: No such file or directory
查看>>
Nginx 负载均衡(基于IP/端口)
查看>>
JSP页面中嵌入UEditor编辑器方法
查看>>
Android面试笔记基础篇
查看>>
NET图像处理库ImageGear for .NET更新至v23.4,添加增强版的数字签名技术
查看>>
检测程序运算时间的快慢
查看>>
甩掉运维黑锅,容灾部署如何该怎么做
查看>>
免费的在线加密笔记-ProtectedText
查看>>
旅行的青蛙ios正版无限四叶草教程,正版!正版!App Store下载的那种
查看>>
MySQL 可以用localhost 连接,但不能用IP连接的问题解决方法
查看>>
sed 替换文件中的字符串
查看>>
Python日期字符串比较
查看>>
关于Webservice框架cxf遇到的一些问题
查看>>
java.lang.IllegalStateException异常产生的原因及解决办法
查看>>
全排列算法——Java实现
查看>>
台式机前置耳机插孔没声音(window7系统设置)
查看>>
为什么这些UI设计很糟糕?什么是好的UI设计?
查看>>