RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n)),查询O(1),所以是一个很快速的算法,当然这个问题用线段树同样能够解决。
在给出N个数据快速,通过预处理。快速的求出最值。
主要是dp+位运算。
预计算:
void rmq_isit(){
for(int i=1;i<=m;i++) {
dp[i][0]=a[i];
}
for(int i=1;(1<<i)<=m;i++){
for(int j=1;j+(1<<i)-1<=m;j++){
dp[j][i]=min(dp[j][i-1],dp[j+(1<<(i-1))][i-1]);
}
}
}
1<<x等于2的x次方;
每层转移的核心:
dp [ i ] [ j ] = max ( dp [ i ] [ j - 1 ] , dp [ i + ( 1 << ( j - 1 ) ) ] [ j - 1 ] );
dp [ i ] [ j ] = min ( dp [ i ] [ j - 1 ] , dp [ i + ( 1 << ( j - 1 ) ) ] [ j - 1 ] );
查阅的核心:
**int rmq_1 ( int l , int r){
int k = 0;
while( ( 1 << ( k ) ) <= ( r - l + 1 ) ) k++;
k --;
int ans1 = min ( dp [ l ] [ k ] , dp [ r - ( 1 << k ) + 1 ] [ k ] ) ;
return ans1;
}**
结合图片就很好理解了。。。