RMQ算法总结

RMQ

RMQ 即范围最小值问题 ( R a n g e (Range (Range M i n i m u m Minimum Minimum Q u e r y ) Query) Query)
支持查询从 A l , A l + 1 , A l + 2 . . . , A r A_l, A_{l+1},A_{l+2}...,A_r Al,Al+1,Al+2...Ar中的极值 ( M a x (Max (Max o r or or M i n ) Min) Min)

算法思想

d p i , j dp_{i,j} dpi,j为左端点为 i i i, 右端点为 2 j ( 1 < < j ) 2^j(1 << j) 2j(1<<j)数组中的极值

可以画出图像:(如下图)
在这里插入图片描述

可以求出递推式:
d p i , j = ( m i n ∣ ∣ m a x ) ( d p i , j − 1 , d p i + 2 j − 1 , j − 1 ) dp_{i, j} = (min || max)(dp_{i, j-1}, dp_{i+2^{j-1}, j-1}) dpi,j=(minmax)(dpi,j1,dpi+2j1,j1)

预处理

void RMQ_intn() {
	for (int i = 1; i <= n; i++) {
		dp[i][0] = a[i];
	}
	int t = log(n) / log(2) + 1;
	for (int j = 1; j < t; j++) {
		for (int i = 1; i <= n - (1 << j) + 1; i++) {
			dp[i][j] = max(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);
		}
	}
} 

查询

int RMQ_query(int l, int r) {
	int k = log(r - l + 1) / log(2);
	return max(dp[l][k], dp[r - (1 << k) + 1][k]);
}
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页