并查集详解

本文介绍了并查集数据结构,重点讲解了使用有根树表示集合的方法,包括初始化每个元素为自身、查找操作的带压缩路径实现以及合并操作的高效处理。通过预处理数组,合并操作可以快速进行,降低了时间复杂度。
摘要由CSDN通过智能技术生成

1.介绍

并查=合并+查找,集=集合。顾名思义并查集的优点在于将一堆数据按照特定条件分成n个集合,并且能够快速实现查找某一元素属于哪一个集合、将任意两个集合合并的操作。

2.实现方法

第一种实现方法是用最小的元素标记所在集合,此方法不常用,在合并两个集合时需要遍历整个数组,时间复杂度高。

本文重点讲解第二种方法:每一个集合用一棵有根树表示。

1.定义数组a[n]

   ·初始化数组:每个人都自成一个集合

for (i=1;i<=n;i++)
    a[i]=i;

2.判断数组下标与该下标对应的值是否相等

   ·若a[i]==i,则说明i表示本集合,i是该集合代表,即i是该树的根节点。

   ·若a[i]==j,则说明j是i的父节点,即j是i的上一级。

a[i]1232134334
i12345678910

3.查找与合并操作

(1)查找

int find(int x)
{
    if (a[x]==x) 
        return x;
    return a[x]=find(a[x]);
}

这是一种带压缩路径的查找操作,从待查节点开始,一直递归直到找到根节点,再逐步退出来,同时将从根节点到待查节点中间所有节点的数值全部修改为根节点的值。这种方法在当树的深度非常深,且需要多次查找时有显著的优化效果。

(2)合并

void join(int c1,int c2)
{
    int f1,f2;
    f1=find(c1),f2=find(c2);
    if (f1!=f2)
    a[c1]=a[c2];
}

以第二个标题“预处理(数组赋值)”中的表格为例,假设要把第二个集合合并到第一个集合中去,只需要将a[2]=2修改为a[2]=1即可,因为第二个集合下面的分支都是指向2,即根节点,因此只需改变根节点的值即可改变整棵树的归属,不用一个一个去修改树中每个节点的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值