Skip to content

模型Model

并查集

施工中 · 内容逐步修订

Disjoint-set union · Union-find

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

形式陈述 ​

并查集维护一个只合并、不拆分的动态集合划分,支持 make-set(x) 建立新元素的单元素块、find(x) 返回所在块代表元、union(x,y) 合并两块。同一时刻两个元素属于同一块,当且仅当它们的 find 结果相等。合并已经相同的两块不改变划分,接口不要求代表元是最小元素。

常见实现用父指针树组成森林,让每个根满足 parent[r]=r,其他节点沿父指针最终到根。合并必须先找到两个根;按大小合并把节点较少的根挂到较多的根,按秩合并则比较秩,仅在相等时使胜出根的秩加一。路径压缩在查找时把经过节点直接连到根。按秩实现中,压缩后秩仍是高度的上界,通常不再等于真实高度,不能随手重算并降低它。按大小实现则只需让根保存整块的元素数;压缩改了树形,但不改变这个数。

对 n≥1,若 m 次操作包含全部 n 次初始化,按秩或大小合并与路径压缩合用的总时间为 O(mα(n));其中 α 是增长极慢的反 Ackermann 函数;这是摊还分析给出的操作序列界,按秩版本直接应用并查集摊还界中的定理。若另行计入初始化,则应写成 O(n+mα(n)),避免把创建全部元素的成本漏掉。空操作序列不需要求值 α(0),直接保留空划分。

直觉

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

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

初始集合为 {1},{2},{3},{4},约定等大时保留第一个参数所在块的根。前两次合并 union(1,2)、union(3,4) 后,父链接为 2→1、4→3,两根大小均为 2。执行 union(2,4) 先查得根 1,3,再令 3→1,根 1 的大小变为 4。

此时 find(4) 沿 4→3→1 查到代表元,然后把 4 直接连接到 1。改变的是表示中的路径,抽象划分完全不变。随后再次 union(2,4) 时,两端根都为 1,应立即结束;若仍把大小相加,就会错误地把同一块重复计数。

这个父指针森林不是原图的路径证书。上例中合并的是元素2和4,表示却新增了父指针 3→1;这条父指针不必是输入图的一条边。Kruskal 中若 find(u)!=find(v),就加入原图的边并合并两分量;否则该边会成环。若还要输出原图路径,必须另存所选图边。代表元的具体编号没有持久语义,合并后可能改变,不能依赖“根一定是最小元素”或把根编号当作集合身份,除非额外维护。

路径压缩会修改结构,因此需要撤销时通常改用可回滚并查集的按秩/大小合并与操作栈;它牺牲路径压缩,换取可恢复历史。

严格持久化还要定义版本分叉后的共享与更新成本,并行版本则要处理并发 find/union 的竞争与原子性;二者都不能直接套用顺序实现及其摊还证明。离线动态连通性再把边的活跃区间分配到时间结构上,标准 DSU 本身仍不支持拆分或删除。

推论与应用

只做按大小合并而不压缩时,每当某节点深度增加,其所在块的大小至少翻倍,所以深度至多 ⌊log2⁡n⌋。这给出单次查找的对数界,也解释为什么“把小根挂到大根”是必要规则。路径压缩的更强总界则需要独立的摊还证明。

并查集用于最小生成树、图像分割、等价约束和离线查询;Karger 收缩算法也反复合并随机边端点,但其目标是随机保持一个最小割,成功概率来自收缩过程,而不是 DSU 的复杂度保证。共享 union 操作不意味着两种算法解决同一问题。

参考资料
  • Robert Sedgewick、Kevin Wayne,Algorithms,第 4 版,2011,§1.5 Case Study: Union-Find:加权合并、路径压缩与接口。

  • Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest、Clifford Stein,Introduction to Algorithms,第3版,MIT Press,2009,Ch. 21:不交集合森林与启发式合并。

  • Robert E. Tarjan, Data Structures and Network Algorithms, SIAM, 1983,Chs. 1–6。

关系图谱17 个相邻概念 · 4 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

上位 / 更一般

暂未标注直接上位概念。

下位 / 直接特例

类型化关系