范围最值查询(英语:Range Minimum Query),是针对数据集的一种条件查询。若给定一个数组
,范围最值查询指定一个范围条件 到 ,要求取出 中最大/小的元素。若
,条件为 的范围最值查询返回1,它是子数组 中最小的元素。通常情况下,数组A是静态的,即元素不会变化,例如插入、删除和修改等,而所有的查询是以在线的方式给出的,即预先并不知道所有查询的参数。
RMQ问题有预处理
之后每次查询 的算法。范围最值查询问题(RMQ)与最近公共祖先(LCA)问题有直接联系,它们可以互相转化。RMQ的算法常常应用在严格或者近似子串匹配等问题的处理中。
创建一个二维数组
的整数值。在这个数组中
表示范围 中的最大值(例如 中的最大值被计为 )。创建数组的过程可以在
时间内完成。具体算法类似于动态规划。以下是 C++ 语言描述的代码,数组约定从 0 开始:void Initialise(vector<int> &Array){ int Length = (int)Array.size(); // 长度为 0 时,表示数据自身。 for (int i = 0; i < Length; ++i) F = Array; for (int j = 1; (1 << j) <= Length; ++j) for (int i = 0; i + (1 << j) - 1 < Length; ++i) F = min( F, F ); // 分成长度相等的两段}