树状数组原理理解

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/(英文)

相关文章:

  • 2022-12-23
  • 2021-05-19
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-01
  • 2021-08-12
  • 2021-10-14
猜你喜欢
  • 2021-08-09
  • 2021-07-12
  • 2021-09-01
  • 2021-12-11
  • 2021-07-06
  • 2021-10-10
相关资源
相似解决方案