这篇文章是以前写的当时还用着pascal,还请见谅——蒟蒻mqy
倍增是一种思想,每次将考虑的范围扩大或减少一倍从而达到加速的效果,将某一步的O(n)优化到O(logn)
已经接触过的倍增:
快速幂(每次将指数缩小一倍)
归并排序(每次将排序区间缩小一倍)
倍增在st表上的实现:
St表又称稀疏表,f[I,j]是对于第i个点第2^j个状态的诠释
例题(RMQ问题-区间最值查询)
输入n,再输入n个数,进行m次询问,对于每次询问求出x,y之间的最小/最大值(n,m<=100000)
此时在不借助高级数据结构的情况下似乎没办法解决了,但其实可以通过倍增思想来将复杂度优化到(nlogn+m)
倍增在st表上的实现
以区间最大值为例
F[I,j]表示第i个数开始2^j个数当中的最大值
易得:
f[I,0]=a[i]
f[I,j]=min(f[I,j-1],f[i+2^(j-1),j-1])
这样做很明显是正确的,因为除2^0以外任何的2的幂都是偶数都可以分成已知的两部分
在求出f[I,j]后对于每一个大小不是2的整次幂的区间的RMQ有什么帮助呢?
这里给出一种O(1)回答每一个询问的方法,常规的st表的查询方法要O(logn)
K=trunc(ln(y-x+1)/ln(2))