什么是树状数组,就是树的数组
首先声明一点:树状数组用的是树结构的思想(也就是树型逻辑结构),而不是真正的“树形结构”
树状数组支持的操作:
1、区间和、区间异或和、区间乘积和 RMQ(显然,支持的操作都具有交换律,这也算是树状数组的一大特性吧)
2、单点修改(朴素的树状数组结构不支持区间修改,当然也可以普及成区间修改结构但我们先不提)
那为什么不直接用前缀和或者差分数组呢?
因为前缀和数组的维护是 O(n) 的,查询、修改是 O(1) 的。然而,树状数组的维护却是 O(logn) 的。并且查询、修改也是 O(1) 的——这便是一个很大的优化。
实际上,对于树状数组的每一个 i,其实际意义应该为:
算上其本身的讯息,总共存储了 2k
个元素的信息,其中 k 表示 i 在二进制下,末尾零的个数,同时也可以表示最小的含 1 位的二进制权值——换句话讲,2k
即可表示成:对于每个二进制意义下的 i,从最末位数 k+1 位,保留这 k+1 位并删除 k+1 位以左的所有数位上的数,留下的新二进制数的实际大小。
而对于每一个x的最低含一位,即上文中的 2k
所以可得函数lowbit
代码登录后可见
最后附上树状数组的工作原理:

