acm应用——Binary Indexed Tree

Binary Indexed Tree,也就是二进制索引树,也就是树状数组。用来快速查找和修改一堆数的前缀和。传说中,时间复杂度是lg(n)。

好吧,它就是利用一个数组,每个元素分管一堆特定的连续元素,当然下标是不会超过它的,而且是以它为最终下标。

神奇之处就在于,它是利用二进制的特性进行区域的划分,即每个大于0的下标转成二进制,它的二进制数中的1的最低位就是它所管辖的数的数目。
比如说,4,二进制就是100,它还是管辖4个数。

利用二进制的方法划分区域,会得到几个有趣的性质。

这些性质如下:


比如说,数组中某个元素加a,那么更新管理前缀和数组的元素,就可以先把第一个对应的下标加上a,然后下标不断累加由当前下标转换成的管辖数目,每次得到一个新的下标,都加上一个a,直到遍历到最后的那个元素为止。这样,前缀和数组就可以更新完毕了。



再比如说,要输出某个下标的前缀和,那么就从这个下标开始,不断往前推当前下标所管的数目,并累加这些下标所管控的数字,直到遍历到最前面的那个元素为止。这样,结果就是某个下标的前缀和了。

最后,要得到某个下标管控的数目,用计算机的“与”运算就可以了。


废话完毕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值