“对并查集(DSU),从 $n$ 个单元素集合开始,执行 $m\ge n$ 次 Make Set、Union、Find。若 Union 总把较低 rank 根挂到较高 rank 根,同 ran…”
形式陈述 ​
并查集维护一个动态划分,支持 make-set(x)、find(x) 返回所在块代表元、union(x,y) 合并两块。森林实现让每个集合是一棵根树;按秩或大小合并把浅树挂到深树,路径压缩在查找时把经过节点直接连到根。对
直觉
并查集维护的是不断合并的集合划分,而不是支持任意拆分的通用集合容器。每个等价类由一棵父指针树表示,根是代表元;合并只需连接两个根,查找则沿父指针到根。路径压缩缩短查询经过的链,让以后访问几乎直接到达根;按秩或大小合并则避免小树吞并大树。两种启发式共同给出近乎常数的摊还复杂度,但单次操作仍可比常数长。
例子与边界
初始集合为
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。