树状数组原理理解

树状数组原理理解

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值