RMQ算法:区间最小值

假如一系列的查询数组区间的最小值,使用暴力遍历的话,最坏情况是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]);
}

猜你喜欢

转载自blog.csdn.net/qq_36353434/article/details/81414540
今日推荐