假如一系列的查询数组区间的最小值,使用暴力遍历的话,最坏情况是O(n^2),而RMQ算法运用动态规划以及位运算的方法,预处理的时间复杂度为O(nlogn),查询时间复杂度为O(1),代码如下:
//rmq算法是解决区间最小值问题的,预处理的时间复杂度是nlog(n),查询时间是O(1)
#include<iostream>
#include<vector>
#include<algorithm>
#define MAXSIZE 100
using namespace std;
int d[MAXSIZE][MAXSIZE]={0};//d[i][j] 指的是 i到i+2^j次方范围内的最小值,运用了动态规划的思想,
void RMQ_init(vector<int> &A);
int query(int l,int r);
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
vector<int> A(a,a+10);
RMQ_init(A);
cout<<query(1,9); //A[1]~A[9]之间的最小值为2
}
void RMQ_init(vector<int> &A)
{
int n=A.size();
for(int i=0;i<n;++i) d[i][0]=A[i];
for(int j=1;(1<<j)<<n;++j)
for(int i=0;i+(1<<(j-1))-1<n;++i)
d[i][j]=min(d[i][j-1],d[i+(1<<(j-1))][j-1]);
}
int query(int l,int r)
{
int k=0;
while((1<<(k+1))<=r-l+1)k++;
return min(d[l][k],d[r-(1<<k)+1][k]);
}