并查集简单介绍

并查集是一种用于动态维护不重叠集合的数据结构,支持查询元素归属和合并操作。其内部采用树形结构,每个元素对应节点,每个组对应一棵树。初始化时,每个点都是独立集合。查询操作通过寻找元素的根节点来判断归属,合并操作连接两个集合的根节点。为了提高效率,引入了路径压缩和按秩合并的优化策略,防止树退化导致的性能下降。
摘要由CSDN通过智能技术生成

定义

并查集(Disjoint-Set)是一种可以动态维护若干个不重叠的集合,并支持合并与查询两种操作的一种数据结构。并查集可以高效地进行如下操作。

  • 查询元素a和元素b是否属于同一组
  • 合并元素a和元素b所在的组

:::hljs-center
在这里插入图片描述
:::

并查集的结构

并查集也是使用树形结构实现的,不过不是二叉树。每个元素对应一个节点,每个组对应一棵树。在并查集中,哪个节点是哪个节点的父亲以及树的形状等信息无需多家关注,整体组成一个树形结构才是重要的。
:::hljs-center
在这里插入图片描述
:::

具体实现

我们建立一个数组或parent[]表示一个并查集,parent[i]表示i的父节点。

1. 初始化:

每一个点都是一个集合,因此自己的父节点就是自己fa[i]=i

for(int i = 1; i <= maxn; i++)
        fa[i] = i;

2. 查询

每一个节点不断寻找自己的父节点,若此时自己的父节点就是自己,那么该点为集合的根结点,返回该点。

int Find(int x){
   
    if(x==pre[x]) 
        return x;
    return 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值