二叉树基础(三)树状数组(Fenwick Tree)
概念
树状数组(Binary Indexed Tree, Fenwick Tree)是一种用于高效处理对一个存储数字的列表进行更新及求前缀和的数据结构。
l o w b i t lowbit lowbit运算
l o w b i t ( x ) lowbit(x) lowbit(x)是x的二进制表达式中最低位的1所对应的值,比如:
( 6 ) 10 = ( 110 ) 2 (6)_{10}=(110)_2 (6)10=(110)2
若一个数 x x x的二进制最低位的1在从右往左数的第 k k k位,则
l o w b i t ( x ) = 2 k − 1 lowbit(x)=2^{k-1} lowbit(x)=2k−1
l o w b i t ( ) lowbit() lowbit()函数有以下两种常用的实现方式:
int lowbit(int x)
{
return x&(-x);
}
int lowbit(int x)
{
return x&(x^(x-1));
}
结构
对于正整数 n n n,若其二进制表现形式为
n = 2 i 1 + 2 i 2 + ⋅ ⋅ ⋅ + 2 i m n=2^{i_1}+2^{i_2}+···+2^{i_m} n=2i1+2i2+⋅⋅⋅+2im