大家好,我是div.2的垫底选手,本期由我来为大家介绍一个实用的区间信息维护与查询的数据结构——二叉索引树,又名树状数组,Fenwick。
(->)
对于动态连续和查询问题。给定一个n个元素的数组A1.A2,...,An,我们想设计一种数据结构,支持以下两种操作:Add(x,d)...和Query(L,R)...,并且让Query和Add都快速完成。如果用简单的前缀和来做的话,预处理会花费O(n)的时间,这样虽然查询是O(1)的,但每次Add操作却是O(n)的,总的时间复杂度是平方级的,还是会很慢。本期要介绍的二叉索引树就可以很好地解决这个问题。
(->)
我们先来理解一下树状数组中的"树状"的意思。这是一个下标从下向上生长的数组,下标已经用二进制表示出来(0,1,2...)。注意,下标0我们丢弃不用,他不是树的一部分。