RMQ算法总结

RMQ算法总结

代码功能:

给定一个数组,查找数组给定范围内的最值。

代码模版:

void RMQ(int num) //预处理->O(nlogn) //算法主体:

{

   for(int j = 1; j < 20; ++j)

       for(int i = 1; i <= num; ++i)

           if(i + (1 << j) - 1 <= num)

           {

                maxsum[i][j] = max(maxsum[i][j- 1], maxsum[i + (1 << (j - 1))][j - 1]);

                minsum[i][j] = min(minsum[i][j- 1], minsum[i + (1 << (j - 1))][j - 1]);

           }

}

k=(int)log2(b-a+1);            //b-a+1为区间长度;

max(maxsum[a][k],maxsum[b-(1<

min(minsum[a][k],minsum[b-(1<

Maxsum 数据内容:

以数组:3 2 4 5 6 8 1 2 9 7为例

横坐标为i纵坐标为j

I== : 1 2 3 4 5 6 7 8 910            //i的坐标值;

J==0:3 2 4 5 6 8 1 2 9 7

J==1:3 4 5 6 8 8 2 9 9

J==2:5 6 8 8 8 9 9

J==3:8 8 9 9

可以自己找一些区间带入看看取值范围就好了。

对RMQ算法的理解:

根据这个计算公式,可以将给定数组区间的最值存到相应的二维数组中,输入区间之后,只需要算出区间长度以2为底的对数,这就是最值二维数组中的j坐标,然后找出相应长度内的最值(一个是以区间前值为起点一定长度内的最值,一段是以区间后值为起点在区间内一段长度的最值),取这两个最值就好。

你可能感兴趣的:(ACM比赛)