-
概论
ST(sparse table)算法用于快速求取区间最值。这是我们做题中经常遇到的问题,当求区间(l,r)之间的最值时,最简单的方法方法是从头到尾扫描一遍,复杂度log(n),显然在n较大,查询较为频繁时,时间过长。于是,对于这种区间求最值,我们需要另外考虑高效算法。ST算法正是这样一个算法,当然线段树也可以实现O(log(n))的复杂度。
-
ST算法用O(log(n))的复杂度dp预处理数组,查询复杂度O(log(1))
3、预处理:f[i][j]表示从第i个数开始的2^j个数的最值。
f[i][0]=a[i](初值)
f[i][2]=max(a[i],a[i+1],a[i+2],a[i+3])。
动态转移方程:f[i][j]=f[i][j-1]+f[i+2^(j-1)][j-1]
将区间(i,i+2^j-1) 分解成(I,i+2^(j-1)-1)和( i+2^(j-1), i+2^j ),注意这个动态转移方程是由j-1的状态转移到j转态
代码:
void RMQ(){
inti,j;
for(i=1;i<=n;i++)
f[i][0]=a[i];
for(j=1;j<=20;j++)
for (i=1;i<=n;i++)
if (i+(1<<j)-1<=n)
f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1];
}
4、查询
查询区间(l,r)之间最值,区间可重叠,故可以分解成(l,l+2^k-1)和(r-2^k+1,r),其中k=int (log2(r-l+1)),ans=max(f[l][k],f[r-(1<<k)+1][r]);