RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。
方法一:
蛮力搜索,时间时间复杂度 O( n )。
方法二:O(N^2), O(1)
利用动态规划进行预处理,计算出M:
M[ i ][ j-1 ] 为 i 到 j-1 最小值索引,则M[i][j] = A[j] < A[ M[ i ][ j-1] ] ? j : M[ i ][ j - 1 ]。
方法三:O(NlogN), O(1)
Sparse Table (ST) algorithm
预处理RMQ 是对2k 的长度的子数组进行动态规划。我们将使用数组M[0, N-1][0, logN]进行保存,其中M[i][j]是以i 开始,长度为 2j的子数组的最小值的索引。
查找算法:Q(i, j)
寻找一个k = log( j-i + 1 ), 然后寻找 区间(i, i+2^k)即M[i, k] 及 区间(j-2^k+1, k)即M[j-2^k+1][k]的最小值。