Skip to content

并查集

Disjoint-set union · Union-find

维护不交集合划分并支持合并与代表元查询的数据结构。

条目类型
模型

形式陈述

并查集维护一个动态划分,支持 make-set(x)find(x) 返回所在块代表元、union(x,y) 合并两块。森林实现让每个集合是一棵根树;按秩或大小合并把浅树挂到深树,路径压缩在查找时把经过节点直接连到根。对 m 次操作和 n 个元素,两种优化合用的总时间为 O(mα(n));这是操作序列上的摊还界,其证明由并查集摊还界专页承担,本页只记录接口与实现不变量。

直觉

并查集维护的是不断合并的集合划分,而不是支持任意拆分的通用集合容器。每个等价类由一棵父指针树表示,根是代表元;合并只需连接两个根,查找则沿父指针到根。路径压缩缩短查询经过的链,让以后访问几乎直接到达根;按秩或大小合并则避免小树吞并大树。两种启发式共同给出近乎常数的摊还复杂度,但单次操作仍可比常数长。

并查集的按大小合并与路径压缩
例子与边界

初始集合为 {1},{2},{3},{4}。执行 union(1,2)union(3,4)union(2,4) 后四个元素同属一类;一次 find(1) 可把沿途节点直接连到最终根。

Kruskal 中若 find(u)!=find(v),就加入边并合并两分量;否则该边会成环。代表元的具体编号没有持久语义,合并后可能改变,不能依赖“根一定是最小元素”或把根编号当作集合身份,除非额外维护。路径压缩会修改结构,因此需要撤销时通常改用可回滚并查集的按秩/大小合并与操作栈;它牺牲路径压缩,换取可恢复历史。严格持久化还要定义版本分叉后的共享与更新成本,并行版本则要处理并发 find/union 的竞争与原子性;二者都不能直接套用顺序实现及其摊还证明。离线动态连通性再把边的活跃区间分配到时间结构上,标准 DSU 本身仍不支持拆分或删除。

推论与应用

集合划分给出抽象语义,父指针给出表示,摊还分析说明一串操作的总成本。并查集用于最小生成树、图像分割、等价约束和离线查询;Karger 收缩算法也反复合并随机边端点,但其目标是随机保持一个最小割,成功概率来自收缩过程,而不是 DSU 的复杂度保证。共享 union 操作不意味着两种算法解决同一问题。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Parts I–VI。
  • Robert E. Tarjan, Data Structures and Network Algorithms, SIAM, 1983,Chs. 1–6。
关系图谱12 个相邻概念 · 4 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

上位 / 更一般

暂未标注直接上位概念。

下位 / 直接特例

类型化关系