倍增
任意整数均可被表示成若干个2的次幕项之和。
例如整数5,其二进制表示为101,该二进制数从右向左第0、2位均为1,则5=22+20。
整数26,其二进制表示为11010,该二进制数从右向左第1、3、4位均为1,则26=24+23+21。
也就是说,2的次幕项可被拼成任一需要的值。
倍增,顾名思义就是成倍增加。若问题的状态空间特别大,则一步步递推的算法复杂度太高,可以通过倍增思想,只考察2的整数次幕位置,快速缩小求解范围,直到找到解。
用ST表法——求RMQ问题
0.首先要明白ST表是啥?
ST(Sparse Table,稀疏表)算法
采用了倍增思想,在 O(nlogn)时间构造一个二维表之后,可以在0(1) 时间在线查询 [ l,r ] 区间的最值,有效解决在线RMQ(Range Minimum/Maximum Query,区间最值查询)
问题。
如何实现呢?设F[i,j]
表示 [i,i+2j-1] 区间的最值,区间长度为2j。
0. ST表的递推公式
1.即初始化ST表
2. ST表的查询
若查询 [l,r] 区间的最值,则首先计算k值,和前面的计算方法相同,区间长度为 r-I+1,2k<r-l+1<2k+1,因此k=log2(r-I+1)。
若查询区间的长度大于或等于2k且小于2+1k+1,则根据倍增思想,可以将查询区间分为两个查询区间,取两个区间的最值即可。两个区间分别为从l向后的2k个数及从r向前的2k个数,这两个区间可能有重叠,但对求最值没有影响。