您的位置:首页 > 其它

ST算法

2015-07-27 15:31 260 查看


概论

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]);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: