RMQ 与 LCA · 同一个问题的两种形态
两个看起来毫不相干的问题。一个在数组上:给定不再修改的 ,反复问「 的最小值是多少」,这是 RMQ(range minimum query)。另一个在树上:给定一棵有根树,反复问「 与 最深的那个公共祖先是谁」,这是 LCA(lowest common ancestor)。
本系列要说的是它们其实是一个问题。欧拉序把 LCA 变成 RMQ:把 DFS 的进入与回溯全都记下来,得到一条长 的序列,两点的 LCA 就是它们首次出现位置之间深度最小的那个节点。笛卡尔树把 RMQ 变成 LCA:按「中序是原下标、堆序是值」建树, 的最小值位置就是下标 与 在树上的 LCA。两条归约都是线性时间的,于是任一侧的解法都能拿去解另一侧。
路线是:先在静态数组上把 sparse table 讲透——预处理 、查询 ,代价是数组不能再改;再上树,倍增给出 的在线查询,欧拉序把它压到 ,Tarjan 用一遍 DFS 加并查集把全部询问离线做完;最后用笛卡尔树把圈闭上,并交代 – 的 ±1 分块是怎么来的。
静态数组:用空间换 O(1) 查询
sparse table 预先算好所有「长度为 2 的幂」的区间,查询时用两段长度相同的区间重叠覆盖 。它成立的前提是聚合运算 idempotent——,重叠算两次也无妨。求和不满足这一条,同一套查询法在它身上每一个区间都给错数。
idempotent 不是可有可无的细节
sparse table · 延伸阅读
- Sparse Table cp-algorithms.com 建表递推、两段覆盖的查询、idempotent 与非 idempotent 两类聚合的分别处理,以及不相交稀疏表 (disjoint sparse table) 变体。
- Range minimum query en.wikipedia.org RMQ 的问题定义与各解法的复杂度对照表,含 – 一路的历史脉络。
树上:三条通向 LCA 的路
倍增预存每个节点的第 级祖先,查询按二进制位跳,在线且实现最短。欧拉序把树摊平成序列,LCA 随即变成 RMQ,查询降到 。Tarjan 反其道而行:先收齐全部询问,一遍 DFS 配并查集把它们一次算完,代价是不接受「边问边答」。
树上倍增:按二进制位往上跳
预存每个节点的第 级祖先,任何一次上跳都能拆成若干次查表。LCA 查询分两个阶段:先把深的一方提到同深,再从高位到低位同步上跳,停在「跳一步就重合」的位置。
欧拉序:把 LCA 归约成区间最值
把 DFS 的每次进入与每次回溯都记一笔,得到一条长 2n−1 的序列。两点的 LCA 就是它们首次出现位置之间深度最小的那个节点,于是 LCA 整个变成了 RMQ。
Tarjan 离线:一遍 DFS 配并查集
先把全部询问收齐,再做一次 DFS。回溯时把子树并进父亲,某个节点被染黑之后,它所在集合的 ancestor 就是它与当前节点的 LCA。总代价随 n + q 线性,代价是不接受边问边答。
三种实现的分工判据
LCA 的三种实现 · 延伸阅读
- LCA with Binary Lifting cp-algorithms.com 倍增表的建法与查询的两个阶段,含「跳到仍不相同为止」这一写法为何比「跳到相同」更好实现。
- Tarjan, R. E. (1979). Applications of Path Compression on Balanced Trees dl.acm.org 离线 LCA 的出处,与并查集路径压缩的摊还分析同源。
- Tarjan's off-line LCA algorithm en.wikipedia.org 伪代码与不变量的简明陈述:处理到 时,已染黑的节点所在集合的 ancestor 就是它与 的 LCA。
闭环:两个问题互为对方
笛卡尔树给出反方向的归约,RMQ 由此变成 LCA。两条归约拼在一起,就有了 – 的可能:欧拉序的深度数组相邻差恒为 ,这条额外性质让块内形态只有 种,可以全部预先打表。
笛卡尔树:把 RMQ 变回 LCA
中序是原下标、堆序是值的那棵树,让区间最小值变成两个下标的 LCA。与欧拉序那条归约合起来,RMQ 与 LCA 互为对方;±1 性质再把预处理压到线性。
这套地基撑起了什么
LCA 一旦是常数或对数级的,树上距离、路径上的第 k 个点、虚树、树链剖分都随之成立。本页逐个交代这些出口,并说明各自依赖前面哪一条结论。
归约与 O(n)–O(1) · 延伸阅读
- Bender, M. A., & Farach-Colton, M. (2000). The LCA Problem Revisited cs.tau.ac.il 把 LCA 归约到 ±1 RMQ、再用块内打表做到 – 的标准讲法,本系列末两页依此组织。
- Cartesian tree en.wikipedia.org 定义、单调栈线性构造,以及与 treap、笛卡尔树排序、RMQ 的关系。
- Fischer, J., & Heun, V. (2006). Theoretical and Practical Improvements on the RMQ-Problem citeseerx.ist.psu.edu 不必显式建树的 方案,用笛卡尔树的形态编号做块内索引,实践中比 Bender–Farach-Colton 更省。