按照Peter M. Fenwick的说法,正如所有的整数都可以表示成2的幂和,我们也可以把一串序列表示成一系列子序列的和。采用这个想法,我们可将一个前缀和划分成多个子序列的和,而划分的方法与数的2的幂和具有极其相似的方式。一方面,子序列的个数是其二进制表示中1的个数,另一方面,子序列代表的f[i]的个数也是2的幂。
三个概念
1. Lowest bit number = lowestBitNum(x)
= x&-x
或 = x &(x^(x-1))
2. 后继
i 的 后继 = i + lowestBitNum (i)
3. 前驱
i 的前驱 = i - lowestBitNum(i)
两个实现
Sum(i) = i节点 + i 的所有前驱节点
Update(i) = 更新 i 节点 和 所有的后继节点