RMQ一点感悟
Posted 观稳769
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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这个坑改天再填
以上是关于RMQ一点感悟的主要内容,如果未能解决你的问题,请参考以下文章