并查集详解
并查集(Union-Find Set)是一种树型的数据结构,用于处理一些不交集的合并及查询问题。
概念
并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题。
工作原理
graph TB
A["初始状态
每个元素独立"] --> B["Union 操作
合并两个集合"]
B --> C["Find 操作
查找根节点"]
C --> D["路径压缩
优化查找效率"]
style A fill:#e1f5ff
style B fill:#e8f5e9
style C fill:#fff3e0
style D fill:#f3e5f5
核心思想
- 父节点数组:
parent[i]表示元素 i 的父节点 - 路径压缩: 在查找根节点时,将路径上的所有节点直接连接到根节点
- 按秩合并: 将小树合并到大树下,保持树的平衡
实现示例
Go 语言实现
1 | package main |
合并过程示例
graph TB
subgraph Init["初始状态"]
I0["0"]
I1["1"]
I2["2"]
I3["3"]
I4["4"]
end
subgraph Step1["Union(0,1)"]
S1_0["0"] --> S1_1["1"]
S1_2["2"]
S1_3["3"]
S1_4["4"]
end
subgraph Step2["Union(2,3)"]
S2_0["0"] --> S2_1["1"]
S2_2["2"] --> S2_3["3"]
S2_4["4"]
end
subgraph Step3["Union(1,2)"]
S3_0["0"] --> S3_1["1"] --> S3_2["2"] --> S3_3["3"]
S3_4["4"]
end
Init --> Step1
Step1 --> Step2
Step2 --> Step3
style Init fill:#e1f5ff
style Step1 fill:#e8f5e9
style Step2 fill:#fff3e0
style Step3 fill:#f3e5f5
优化技巧
1. 路径压缩
graph LR
A["查找前
1→2→3→4"] --> B["查找 1 的根"]
B --> C["路径压缩后
1→4, 2→4, 3→4"]
style A fill:#ffebee
style C fill:#e8f5e9
2. 按秩合并
graph TB
A["小树合并到大树"] --> B["保持树的平衡"]
B --> C["减少查找深度"]
style A fill:#e1f5ff
style B fill:#e8f5e9
style C fill:#fff3e0
应用场景
- 连通性问题: 判断图中两个节点是否连通
- 朋友圈问题: 找出有多少个独立的朋友圈
- 岛屿数量: 计算二维矩阵中的连通区域数量
- 最小生成树: Kruskal 算法中使用并查集
复杂度分析
- 空间复杂度: O(n)
- 初始化时间复杂度: O(n)
- Find 操作(带路径压缩): 平均 O(α(n)),其中 α 是阿克曼函数的反函数,实际应用中接近 O(1)
- Union 操作(按秩合并): 平均 O(α(n))
完整应用示例:朋友圈问题
1 | package main |