树状数组原理理解
1.原理
给出一个数组,要求查询任意区间和,且能单点更新。我们用树状数组解决。
树状数组的核心很简单,是一个数学事实:任何(十进制)数都可以被2的次幂之和表示。例如,13=8+4+1,21=16+4+1,…
这就提供了便利:想要查询1到13的区间和(下记为S[1…13]),只要求S[1…8]、S[9…12]、S[13…13],它们的长度也即符合13=8+4+1。
2.工作
我们要维护许多或大或小的区间和。
先从长度1开始吧,也就是S[i…i]。
然后是长度2,S[1..2] S[3..4] …
然后是长度4,S[1..4] S[5..8] …
注意到不仅要构建还要维护,我们需要把它们视为许多节点并关联起来,如下图:
那么,更新数组中某个数的值时,再一路更新它的父节点就好了。最后会更新到最大的节点S[1…N]。
总共有多少个节点呢?这取决于N除2的余数,大体上是2N,比线段树省空间。
3.参考资料
https://www.geeksforgeeks.org/binary-indexed-tree-or-fenwick-tree-2/(英文)