并查集-入门
什么是“并查集”?
首先,并查集是一种(复合)数据结构
- 并:合并
- 查:查找
- 集:以字典为基础的数据结构
直观的例子
假设你有一个社交网络,其中每个人都有一个账号。这些账号可以归为若干个群组,比如同学、同事、朋友等等。现在你想要实现一个功能,让用户可以查找某个人是否属于某个群组,并且可以将两个群组合并成一个群组。这就是一个典型的并查集问题。
为了实现这个功能,你可以使用一个并查集。每个账号都是一个节点,初始时每个节点都是一个单独的集合。每个集合有一个代表元素,可以选择其中一个节点作为代表元素。
现在,当一个用户查询某个账号所属的群组时,你可以使用 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数组记录各个元素为根节点的树的高度,在做合并操作时,==将高度较小的根节点连接到高度较大的根节点上
实现
本文作者:YaosGHC
本文链接:https://www.cnblogs.com/yaocy/p/16480985.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)