区间最大最小值(RMQ)问题的算法整理
Range Minimum/Maximum Query,简称RMQ,求给定数列的某个范围内的极值

RMQ问题是算法竞赛中常见的题目类型。

题目模型一般是这样的,给定一个数列A,定义操作query(l, r),求A[l…r]中的最大或者最小值。求最大和求最小其实本质上是一样的(将元素转化为其相反数,即可转化该问题),下文就主要以求最小为例来展开讨论。

这篇博文主要对RMQ问题的思路和算法进行整理,以及RMQ问题相关题目的解题思路。

思路和算法

Sparse-Table算法

该算法的时间复杂度为O(nlogn), 思路简单,编码难度低。

定义s(i, j)为,从数组下标i开始,长度为2^j的范围内的最小值。

很容易可以推出s(i, j) = min{ s(i, j-1), s(i+2^j-1, j-1) }

在处理问题时,可以先将s数组初始化,然后对于query(l, r)的查询可通过计算 min{ s(l, k), s(r-2^k, k) }, 其中k是满足2^k <= r-l+1的最大整数,而来。

相关题目整理

…待续

*****
Written by Prince Laharl on 08 December 2015