代码与动画 DISJOINT SET UNION
并查集.
通过代表节点管理集合,使用按大小合并和路径压缩。
均摊 O(α(n))空间 O(n)固定元素 0–7
原理与执行逻辑
用父指针树表示不相交集合,根节点是集合代表。查找代表判断归属,合并根节点改变集合关系,并通过压缩路径与按大小合并控制树高。
执行步骤
- 每个元素初始化为自己的父节点。
- find 沿父指针到根,并把沿途节点直接连到根。
- union 先找两端代表,代表相同则无需合并。
- 将较小集合的根接到较大集合根下,更新大小;比较代表即可判断连通。
关键理解
父指针表示集合归属,不一定对应原图中的边。路径压缩只改变树形表示,不改变集合成员或连通结果。
简短示例
合并 1 与 2,再合并 2 与 3 后,三者代表相同;查找 3 可以缩短它到代表的路径,但仍属于同一集合。
代码与执行动画
STEP 0 / 0const parent = [0, 0, 2, 2, 4, 5, 6, 7], size = [2, 1, 2, 1, 1, 1, 1, 1];集合数 6
当前数据正在操作已访问 / 命中标记 / 指针
输出 / 辅助状态
parent = [0, 0, 2, 2, 4, 5, 6, 7]
0
当前结构
选择操作,观察对应代码和状态变化。
操作当前结构
操作结果会用于下一次操作;重置结构恢复初始数据。
并查集的操作规则
箭头由元素指向父节点。根节点是集合代表;合并时小集合接到大集合,find 会将路径直接连接到根。
对应题目与扩展练习
观察执行过程后,按题目约束调整输入、返回值与实现。链接打开官方题目页面。
- 对应题目547. 省份数量打开题目
合并相连城市,统计最终集合数量。