概念
RMQ 是英文 Range Maximum/Minimum Query 的缩写,表示区间最大(最小)值。
解决 RMQ 问题的主要方法有两种,分别是 ST 表和线段树。本文主要讲 ST 表。
ST表
$ST$ 表,即 $Sparse-Table$ 算法,它预处理的时间是 $O(nlogn)$,但是查询时间只需要 $O(1)$,且常数非常小。但是不支持修改操作。最重要的是,这个算法非常好写,并且不容易出错。
$ST$ 表是基于倍增思想,令 $d(i, j)$ 表示从 $i$ 开始的,长度为 $2^j$的一段元素中的最小值,则可以用推递的方式计算 $d(i, j)$:$d(i, j) = max\{d(i,j-1), d(i + 2^{j-1}, j-1) \}$,$f[i][0] = a[i]$,即把待查询区间平均分成了两部分。
注意 $2^j \leq n$,因此 $d$ 数组中的元素个数不超过 $n log n$,而每一项都可以在常数时间内计算完成,故总时间为 $O(n log n)$。