“对并查集(DSU),考虑 $n\ge1$ 及共 $m\ge n$ 次 Make Set、Union、Find,其中 $n$ 次 Make Set 创建 $n$ 个元素。若 Union 总把较…”
形式陈述
并查集维护一个只合并、不拆分的动态集合划分,支持 make-set(x) 建立新元素的单元素块、find(x) 返回所在块代表元、union(x,y) 合并两块。同一时刻两个元素属于同一块,当且仅当它们的 find 结果相等。合并已经相同的两块不改变划分,接口不要求代表元是最小元素。
常见实现用父指针树组成森林,让每个根满足 parent[r]=r,其他节点沿父指针最终到根。合并必须先找到两个根;按大小合并把节点较少的根挂到较多的根,按秩合并则比较秩,仅在相等时使胜出根的秩加一。路径压缩在查找时把经过节点直接连到根。按秩实现中,压缩后秩仍是高度的上界,通常不再等于真实高度,不能随手重算并降低它。按大小实现则只需让根保存整块的元素数;压缩改了树形,但不改变这个数。
对
直觉
并查集维护的是不断合并的集合划分,而不是支持任意拆分的通用集合容器。每个等价类由一棵父指针树表示,根是代表元;合并只需连接两个根,查找则沿父指针到根。路径压缩缩短查询经过的链,让以后访问几乎直接到达根;按秩或大小合并则避免小树吞并大树。两种启发式共同给出近乎常数的摊还复杂度,但单次操作仍可比常数长。
例子与边界
初始集合为
此时 find(4) 沿 union(2,4) 时,两端根都为
这个父指针森林不是原图的路径证书。上例中合并的是元素2和4,表示却新增了父指针 find(u)!=find(v),就加入原图的边并合并两分量;否则该边会成环。若还要输出原图路径,必须另存所选图边。代表元的具体编号没有持久语义,合并后可能改变,不能依赖“根一定是最小元素”或把根编号当作集合身份,除非额外维护。
路径压缩会修改结构,因此需要撤销时通常改用可回滚并查集的按秩/大小合并与操作栈;它牺牲路径压缩,换取可恢复历史。
严格持久化还要定义版本分叉后的共享与更新成本,并行版本则要处理并发 find/union 的竞争与原子性;二者都不能直接套用顺序实现及其摊还证明。离线动态连通性再把边的活跃区间分配到时间结构上,标准 DSU 本身仍不支持拆分或删除。
推论与应用
只做按大小合并而不压缩时,每当某节点深度增加,其所在块的大小至少翻倍,所以深度至多
并查集用于最小生成树、图像分割、等价约束和离线查询;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。