范围最值查询(Range Minimum Query),是针对
数据集的一种条件
查询。若给定一个数组,范围最值查询指定一个范围条件,在满足这个条件的情况下要求取出给定数组中最大或最小的元素。
通常情况下,数组A是
静态的,即
元素不会变化,例如
插入、
删除和
修改等,而所有的查询是以
离线的方式给出的,即预先并不知道所有查询的
参数。在上述条件下,将数组以特定方式进行预处理即可以使范围最值查询在
常数时间内得到处理。
现有
算法可以通过以
线性时间对数组进行预处理以获得之后常数时间的范围最值查询处理,其
空间复杂度为。范围最值查询问题(RMQ)与最低公共祖先(LCA)问题有直接联系,它们可以互相转化。RMQ的算法常常应用在严格或者近似子串匹配等问题的处理中。
朴素算法就是每次查询都For一遍,时间复杂度。排序法就是新开一个数组记录数的位置,排序后每次查询从头到尾For一遍,找到第一个在区间中的数退出即可。编程复杂度低,但是实际效果可能并不好。最坏情况时间复杂度,但平均情况会比朴素快那么一点。倍增法请参见下面部分。线段树是最快的算法,但是编程复杂度非常高,因此除非数据很大极少使用。