一维树状数组
一维数组相信大家平时都是经常使用,对于一维数组而言,查询以及求和的时间复杂度分别为O(1) 和 O(n) 。
今天我们介绍一个新的数据结构——树状数组英文名称为Binary Index Tree,直译过来就是二进制索引树,我觉得二进制索引树更能说明其本质。树状数组的本质就是一种通过二进制位来维护一个序列前i和的数据结构。它的查询和求和的时间复杂度均为O(logn)。而且特别是当数组元素的值可以随时发生变化时,它的求和不需要像线性数组一样重新从头扫到尾更新求和而是只用更新改变的部分元素即可。其实树状数组通俗地说就是把一位线性数组模拟成树状,从而达到跳跃性的查询和求和。
序列C[]就是树状数组, 那么C[]如何求得?
C[1]=A[1];
C[2]=A[1]+A[2];
C[3]=A[3];
C[4]=A[1]+A[2]+A[3]+A[4];
C[5]=A[5];C[6]=A[5]+A[6];
C[7]=A[7];
C[8]= A[1]+A[2]+A[3]+A[4]+A[5]+A[6]+A[7]+A[8];
以上只是枚举了所有的情况,那么推广到一般情况,得到一个C