数据结构-Binary Indexed Tree 树状数组
简介
树状数组或二叉索引树(英语:Binary Indexed Tree),又以其发明者命名为Fenwick树,最早由Peter M. Fenwick于1994年以A New Data Structure for Cumulative Frequency Tables为题发表在SOFTWARE PRACTICE AND EXPERIENCE。其初衷是解决数据压缩里的累积频率(Cumulative Frequency)的计算问题,现多用于高效计算数列的前缀和, 区间和。
它的功能是:
- 单点更新 update(i, v): 把序列 i_ _位置的数加上一个值 v
- 区间查询 query(i): 查询序列 [1… i] 区间的区间和,即 i_ _位置的前缀和
修改和查询的时间代价都是 O(log n),其中 n_ _为需要维护前缀和的序列的长度。
树状数组的主要结构就是父节点存储大范围,子节点再进行划分范围,直到节点为一个。
c8表示整个数组,其子节点为c4,c6,c7,a8,各自子节点又有自己的子节点。如果要求数组a的区间和,比如说 [a5,a7] 区间,从[0,a7]中求和,然后减去和从[0,a4]中查找和。