难写难调的数据结构题目
- 线段树
- splay
那么今天我们来讲的树状数组反而是比较简单的 QAQ
操作
- 快速的求前缀和
- 修改某一个数
基本原理
- 假设我们要有这样一个数组
- 如果我们要进行以上两个操作,则需要遍历字符串中的所有数据,当数组变大时对运行时间的影响是灾难性的
- 所以我们想出了这样一种优化方法
- 这样我们所需的时间会变为原来的一半,且在更改数字时只需要多更改一个数字按照这种思路,我们可以想到下面的优化方法
- 这样如果我们要计算几百万个数字的和我们也只需要进行几十次加法就可以了,时间复杂度大大降低
- 再仔细观察我们会发现这个算法还能进一步优化,比如在图中被标出的这个数字5就是完全用不到的数字
这是因为如果你要计算前三位数字你会使用14+1,如果你要计算前4位数字你会使用19,如果要计算前五位你会使用19+5,总之这个5就是个"five"。
- 事实上,所有层的第偶数个数都是没用的,都是可以被去掉的
- 我们可以恰好的把所有剩下的数字放入长度大小为n的数组,这就是俗称的树状数组
其实这两种操作可以分别有数组和前缀和数组来实现但“鱼和熊掌不可得兼”一旦两者同时使用,时间复杂度将大幅度提升所以树状数组就显得尤为有效
实现方法
lowbit(x)函数