引言:
树状数组,在存储空间上是一个数组,但是在逻辑上,把它作为一个树来处理。我们先来大致感受下,暂时不需要深入理解。
图1
如图,红色部分的数组c[ ],在存储的时候,是一个一维数组,图中之所以变现出树形结构,是经过了“某些操作”,我将在后文中解释。
“树状数组” 与 “和” 的关系
假设我们已经把树状数组构造好了(后面会讲如何构造,先感受下如何求和的),来看看如何求和:
符号:数列-----a[1...N] 树状数组-----tree[1...N] 前i项的和-----getSum(i) (这是一个函数)
例子:
getSum(1) =tree[1]
getSum(2) =tree[2]
到这里,似乎能看出规律!!tree[i]中存的就是前i项的和!!这是错的。继续往下看:
getSum(3) =tree[3] + tree[2]
getSum(4) =tree[4]
getSum(5) =tree[5] + tree[4]
到这里,不知道大家找到规律没有,反正我是没找到。。。。
我们不妨换一种方式写,用二进制试试!!(注意:以下式子中,数字都是以二进制形式书写)
getSum(1) = tree[1]