RMQ演算法總結

2021-08-01 08:48:47 字數 774 閱讀 8388

給定乙個陣列,查詢陣列給定範圍內的最值。

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橫座標為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

可以自己找一些區間帶入看看取值範圍就好了。

根據這個計算公式,可以將給定陣列區間的最值存到相應的二維陣列中,輸入區間之後,只需要算出區間長度以2為底的對數,這就是最值二維陣列中的j座標,然後找出相應長度內的最值(乙個是以區間前值為起點一定長度內的最值,一段是以區間後值為起點在區間內一段長度的最值),取這兩個最值就好。

再談RMQ演算法

大家知道rmq演算法就是求乙個區間裡的任意區間的最大值和最小值的高效演算法,因為只需要乙個預處理就可以在o 1 的時間裡算出任意區間的最值。所以當遇到在乙個區間裡求最值之差不超過某乙個數的最長子區間問題就可以利用該方法,當然還需要用到二分演算法。舉個例子 在8,4,2,4,3,2,4,5,2,6這個...

RMQ演算法詳解

下面我們從乙個實際問題來解釋rmq 我們假設陣列arr為 1,3,6,7,4,2,5 我們設二維陣列dp i j 表示從第i位開始連續2 j個數中的最小值。例如dp 2 1 就表示從第二位數開始連續兩個數的最小值 也就是從第二位數到第三位數的最小值 即3,6中的最小值,所以dp 2 1 3 其實我們...

RMQ演算法題目

pku 3264 題意 給定n個奶牛的高度,求區間 s,e 中最高與最低高度的差值。rmq模板題目 求出最高最低然後求差。注意這裡f i j 表示從j開始的2 i次方個數的最值。view code include include include include define maxn 50007 d...