并查集-入门
什么是“并查集”?
首先,并查集是一种(复合)数据结构
- 并:合并
- 查:查找
- 集:以字典为基础的数据结构
直观的例子
假设你有一个社交网络,其中每个人都有一个账号。这些账号可以归为若干个群组,比如同学、同事、朋友等等。现在你想要实现一个功能,让用户可以查找某个人是否属于某个群组,并且可以将两个群组合并成一个群组。这就是一个典型的并查集问题。
为了实现这个功能,你可以使用一个并查集。每个账号都是一个节点,初始时每个节点都是一个单独的集合。每个集合有一个代表元素,可以选择其中一个节点作为代表元素。
现在,当一个用户查询某个账号所属的群组时,你可以使用 Find 操作来找到该账号所在的集合,并返回该集合的代表元素。如果两个账号属于同一个集合,那么它们就属于同一个群组;如果两个账号属于不同的集合,那么它们就属于不同的群组。
当一个用户想要将两个群组合并时,你可以使用 Union 操作。选择一个集合的代表元素作为新集合的代表元素,并将另一个集合的所有节点都添加到新集合中。
能用来
解决连接性问题,如连通性、最小生成树等。
相关题目
- 200 岛屿数量
- 128 最长连续序列
- 721 账户合并
- 990 等式方程地可满足性
伪代码
主要包含了5大方法,最核心的是find和union
public int find(int x){}// 查找某个元素的根节点public void union(int x,int y){}// 为x和y建立联系
另外还有两个辅助方法public boolean connected(int x,int y){}// 判断x和y是否相连public int count(){}// 返回连通分量的个数,也就是有多少棵树
优化
路径压缩
优化场景是,多次union后导致树的高度会很高,那么查找效率就会大大降低
具体分两种

按秩合并
秩——指树的高度
具体实现是新增一个ranks数组记录各个元素为根节点的树的高度,在做合并操作时,==将高度较小的根节点连接到高度较大的根节点上
实现

浙公网安备 33010602011771号