RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干次询问RMQ(i,j),返回数列A中下标在区间[i,j]中的最小/大值。
存在一种比较高效的ST算法解决这个问题。ST(Sparse Table)算法可以在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询。
java代码:
`int[] A = new int[] {1, 2 ,3 ,6, 5, 5 ,5 ,5, 5, 10};
int[][] dp = ST(A);
System.out.println(RMQ(dp,7,8));
static int[][] ST(int[] A) {
int log = 0;
int l = A.length;
while((l>>=1)!=0) {
++log;
}
int[][] dp = new int[A.length][log+1];
for (int i = 0; i <A.length; i++)
dp[i][0] = A[i];
for (int j = 1; j <= log; j++) {
for (int i = 0; i + (1 << j) - 1 < A.length; i++) {
dp[i][j] = Math.max(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);
}
}
return dp;
}
static int RMQ(int[][] dp, int l, int r) {
int k = 0;
while ((1 << (k + 1)) <= r - l + 1)
k++;
return Math.max(dp[l][k], dp[r - (1 << k) + 1][k]);
}
文本内容参考https://blog.csdn.net/qq_31759205/article/details/75008659