做算法题目的时候经常会遇到一些求区间和的内容。比如给你一个数组a[0..100],要你计算哪个区间的元素和为100这类的。
这种题目往常都是采用前缀和数组来解答的。设有数组a[0..100]对应的前缀数组b[0..100],则b元素的值为:
这样我们要求a[m..n]这个区间的内容,原本需要,现在只要计算
这样
的操作即可。
之所以前缀和数组计算区间和需要常数级别的复杂度,是因为我们在构建前缀和数组的时候,已经产生了的复杂度了。
有没有其它更好的方法来计算区间和呢?答案是有的。这就是树状数组。
一. lowbit介绍
理解树状数组最关键是理解一个叫做lowbit的概念。
什么是lowbit?lowbit指的是一个二进制形式的数,其低位0和低位第一个1组成的数:
以一个8位二进制为例,:这个数低位有3个0,配合从低位到高位的第一个1,其lowbit为:
。
lowbit的作用(非常重要):
- 一个数与他的lowbit相加,得到一个最小的,值比他大,lowbit也比他大的数。
- 一个数与他的lowbit相减,得到一个最大的,值比他小,但lowbit比他大的数。