【RMQ算法】

来源:互联网 发布:免费网站源码 编辑:程序博客网 时间:2024/06/16 10:57

 RMQ算法

一、概述

       RMQ算法是一种快速的从一段区间中查找最值的算法。每次查询时间可以为O(1)(主要时间在预处理上为O(n*log(n)))。

二、实现

        在RMQ算法中我们用一个数组f[i][j]来表示区间[i,i+2^j-1]的最值。这个区间长度为2^j。可以通过递推关系得到 ( f[i][j]=max/min(f[i][j-1],f[i+2^(j-1)][j-1] (对应的区间分别为[i ,i+2^(j-1)-1] 和[2^(j-1) ,2^(j-1)+2^(j-1)-1]刚好为f[i][j].然后就是查询过程对于区间[x,y],要找到一个k使得2^(k+1)>=(y-x+1)&&2^(k)<(y-x+1).  k=log2(y-x+1);

 然后区间[x,y]最值即为max/min(f[x][k],f[y-2^k+1][k] ).

代码:


void rmq_init(){    for(int i=1;i<=n;i++)        f[i][0]=val[i];        m=0;    while(n>(1<<m))m++;    for(int j=1;j<=20;j++)    {        for(int i=1;i+(1<<j)-1<=n;i++)        {            f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);        }    }}int rmq(int x,int y){    int k=(int)log(y-x+1)/log(2);    return max(f[x][k],f[y-(1<<k)+1][k]);}