并查集-入门

什么是“并查集”?

首先,并查集是一种(复合)数据结构

  1. 并:合并
  2. 查:查找
  3. 集:以字典为基础的数据结构

直观的例子

假设你有一个社交网络,其中每个人都有一个账号。这些账号可以归为若干个群组,比如同学、同事、朋友等等。现在你想要实现一个功能,让用户可以查找某个人是否属于某个群组,并且可以将两个群组合并成一个群组。这就是一个典型的并查集问题。

为了实现这个功能,你可以使用一个并查集。每个账号都是一个节点,初始时每个节点都是一个单独的集合。每个集合有一个代表元素,可以选择其中一个节点作为代表元素。

现在,当一个用户查询某个账号所属的群组时,你可以使用 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 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起