【RMQ】一点感悟

RMQ算法全称为(Range Minimum/Maximum Query)【区间最值】

主要是这两种算法解决区间最值问题:线段树和稀疏表(Sparse Table)

ST算法是解决RMQ(区间最值)问题,它能在O(nlogn)的时间预处理,然后O(1)回答。

其原理是倍增,f[i][j]表示从i位起的2^j个数中的最大数,即[i,i+2^j-1]中的最大值,从其定义中可以看出来

思想是动态规划

设二维数组dp[i][j]表示从第i位开始连续j个数中的最小值。

求 dp[i][j] 的时候把它分成两部分,第一部分是从 i到 i+2^(j-1)-1第二部分从2^(j-1)到2^(j)

得到转移方程:dp[i][j] = min(dp [i][j - 1], dp [i + (1 << j - 1)][j - 1])

 意思很明显,就是前半段和后半段的最大值,[i ,2^(j-1)-1], [2^(j-1),j]的最大值.

void init()
{
    for(int i=1;i<=N;i++)
        dp[i][0]=arr[i];
    for(int j=1;(1<<j)<=N;j++)
        for(int i=1;i+(1<<j)<=N+1;i++)
            dp[i][j]=min(dp[i][j-1],dp[i+(1<<j-1)][j-1]);
}

查询的时候 取k=⌊log2( r-l+1)⌋  即左右区间范围的log2并向下取整

int queryST(int l,int r){
    int k=log(r-l+1)/log(2); //保证k满足 2^k<r+l-1<=2^(k+1)
    return max(f[l][k],f[r-(1<<k)+1][k]);
}

参考:

https://blog.csdn.net/qq_41311604/article/details/79900893

https://www.cnblogs.com/zyf0163/p/4782133.html

https://blog.csdn.net/fanyiningHH/article/details/78392587#%E4%B8%BB%E8%A6%81%E6%80%9D%E8%B7%AF-1

LCA这个坑改天再填

原文地址:https://www.cnblogs.com/guanwen769aaaa/p/11328323.html