Skip to content

最近公共祖先

Lowest common ancestor · LCA

有根树中同时为两个顶点祖先且深度最大的唯一顶点及其查询问题。

条目类型
定义

形式陈述

(T,r) 是有根树。顶点 u,v 的公共祖先集合为

C(u,v)={x:xru  xrv}.

由于根 rC(u,v),该集合非空;又因为任一顶点的祖先沿唯一根路径全序排列,C(u,v) 按深度也全序排列。最近公共祖先定义为其中深度最大的唯一顶点:

LCAr(u,v)=argmaxxC(u,v)depthr(x).

“最近”指相对根的深度最大,不是图距离最小、编号接近或平面几何位置接近。根属于问题实例的一部分;换根可能改变答案。

静态 LCA 问题给定一棵固定有根树,预处理后回答多次 (u,v) 查询。离线版本可一次看到全部查询,动态版本还允许插入、删除或换根;这些模型的可用算法与复杂度不同。

直觉

uv 各自沿父亲链向根移动,两条链最终汇合;第一次汇合的位置就是 LCA。树的唯一根路径保证汇合后不会再次分叉,因此答案唯一。

定义本身只需要祖先偏序。二进制倍增、Euler Tour、RMQ 微块和 Tarjan 离线算法是不同实现,不应塞进 LCA 的定义。先固定问题对象,再比较预处理时间、查询时间、空间和在线性,才能避免把一种实现误当成概念本身。

深度对齐、同步上移与汇合点
例子与边界

若根为 12,3 是其孩子,4,52 的孩子,则

LCA(4,5)=2,LCA(4,3)=1.

u 本身是 v 的祖先,则

LCA(u,v)=u.

常见接口允许 u=v,此时答案就是 u

LCA 依赖根。对路径 123,以 1 为根时 LCA(2,3)=2;以 3 为根时答案变为 3。若输入是一般 DAG,两个节点可能存在多个互不比较的最低公共祖先;树上的唯一性证明不再适用。

动态链接或切断树边会使父亲、深度与祖先关系整体变化,静态预处理表可能失效。所谓“换根查询”也应区分:是永久改变根,还是用固定预处理回答假想根下的 LCA。

推论与应用

有根树与祖先关系提供定义和唯一性。LCA 可用于树上距离:

dist(u,v)=depth(u)+depth(v)2depth(LCA(u,v)).

它还支撑路径聚合、虚树、层级权限、系统发育树和树上差分。

常用实现包括:

  • 二进制倍增:通常 O(nlogn) 预处理、O(logn) 查询;
  • Euler Tour 加RMQ:把首次出现区间中的最小深度位置还原为 LCA;
  • 常数时间 RMQ:可把静态查询降到 O(1),同时保持线性级预处理与空间;
  • 离线并查集方法:适合查询全部预先给出的场景。

RMQ–LCA 等价说明两类静态查询可在线性规模下互相归约。这里的 equivalent_to 指问题级互归约与渐近数据结构能力,不表示一棵树和一个数组是同一种数学对象。

参考资料
  • Dov Harel and Robert E. Tarjan, “Fast Algorithms for Finding Nearest Common Ancestors,” SIAM Journal on Computing 13(2), 1984.
  • Michael A. Bender and Martín Farach-Colton, “The LCA Problem Revisited,” LATIN 2000, LNCS 1776, 2000.
  • Thomas H. Cormen et al., Introduction to Algorithms, 4th ed., MIT Press, 2022, Chapter 20.
关系图谱7 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

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