Skip to content

模型Model

静态区间最值查询(RMQ)

施工中 · 内容逐步修订

Range minimum query · RMQ

预处理静态数组后,返回区间最小元素的位置并固定并列规则。

形式陈述 ​

静态查询接口 ​

给定全序集合上的静态数组 A[0…n−1],区间最小值查询接收满足 0≤l<r≤n 的半开区间 [l,r),返回

RMQA(l,r)=min{i∈[l,r):A[i]=minl≤j<rA[j]}.

外层的最小值固定“并列时返回最左索引”。若应用只需要最小值,可以再读取 A[RMQA(l,r)];反过来只返回数值会丢掉位置,无法区分相同最小值的多个元素,也会让基于索引的归约失去确定性。

以下数据结构成本采用键比较、下标运算与数组访问均为常数时间的模型;若键比较需要处理变长表示,其成本应另计。

“静态”表示预处理完成后数组不再修改。输入若允许点更新、区间更新或版本切换,就已经成为不同问题,不能直接继承静态 RMQ 的复杂度。

直觉

RMQ 预处理的是区间之间大量重叠的比较信息,而不是每次重新求最小值。不同结构在预处理时间、额外空间与查询时间之间分配这份信息;稳定的端点与并列规则让所有表项、笛卡尔树归约和返回位置具有同一语义。

RMQ 半开端点与最左并列规则
例子与边界

一个带并列值的查询 ​

取 A=(4,2,5,2,7)。在本页的半开区间约定下,

RMQA(1,4)=1,

因为位置 1 与 3 的值同为 2,最左规则选择位置 1。查询 [2,5) 则返回位置 3。如果另一资料使用闭区间 [l,r],同样写成 RMQ(1,4) 会包含不同元素;比较算法或测试数据前必须先统一端点约定。

朴素基线逐项扫描查询区间,预处理为 O(1),额外空间为 O(1),单次查询为 O(r−l)。它虽然不快,却完整实现了接口,也说明 RMQ 问题本身不依赖任何高级数据结构。

三维成本 ​

静态 RMQ 解法至少要同时报告:预处理时间、额外空间和最坏查询时间。只写“O(1) 查询”会隐藏可能很大的表,也无法说明一次性查询是否值得预处理。

Sparse Table利用最小运算的幂等性,让两个可能重叠的二次幂区间覆盖查询;它以 O(nlog⁡n) 预处理和空间换取 O(1) 查询。线段树通常给出线性空间与 O(log⁡n) 查询,同时更容易支持更新。基于笛卡尔树、LCA 与微块分类的结构还能达到线性预处理、线性空间和常数查询。三条路线解决同一接口,但不共享同一表示或证明。

问题边界 ​

RMQ 的最小运算具有幂等性,重叠覆盖不会改变答案。区间和却会把重叠部分重复计数,所以 Sparse Table 的同一查询公式不能原样迁移到任意区间聚合问题。

点更新也会使覆盖该位置的许多预计算区间同时过期。若题目要求更新后的查询,应在问题定义中写出操作序列和两类操作的成本,而不是把动态能力当成某个静态实现的附加优化。

RMQ 与最近公共祖先之间存在经典归约,但归约依赖 Euler tour、深度数组和稳定的并列规则。从数组到树与从树到深度序列的两个方向,分别把区间最小值和祖先查询转成彼此的接口。

推论与应用

线性预处理常数时间 RMQ通过笛卡尔树、Euler tour 与微块表等结构,把静态数组的比较信息组织成线性空间索引,每次查询用 O(1) 时间返回最小值位置。这使大量重复查询能够分摊预处理成本。

后缀数组中,两后缀的最长公共前缀长度可由它们之间 LCP 数组的最小值求得;简洁树导航也会把部分树上查询转成区间最小值。

参考资料
  • Bender, Farach-Colton, “The LCA Problem Revisited,” 2000.
  • Fischer, Heun, “Space-Efficient Preprocessing Schemes for RMQ,” 2011.
关系图谱12 个相邻概念 · 4 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系