并查集

什么是查并集

并查集实际上是数据结构树的简单应用,是一种用树来表示集合的数据结构,比如集合A和集合B,如图所示:

集合A和集合B

 

我们可以用一个数组来顺序表示一个树形集合中的各个结点,如图所示:

用数组来表示集合A和集合B

 

除0号位置外,数组中的每个位置的内容,是其对应结点的双亲结点的下标;第0号位置,也就是对应着根结点,储存的是这个集合中结点个数的相反数。



查并集的应用

并查集的“查”,判断两个结点是否属于同一个(树形)集合

要查询任意两个结点是否属于同一个(树形)集合,只需要分别查寻这两个结点对应的数组内容,得到其双亲结点所在的位置下标,以此来查双亲结点的双亲结点,即由数组底部一直往上查询,直到查到两个结点各自的根结点。如果这两个结点的根结点是相同的,则说明它们在同一个集合中,换句话说,这两个结点是相连通的。

实现代码:

int find(int *parent, int x) { //查询元素x在集合中的根结点
    while(parent[x] > = 0) 
        x = parent[X]; //循环寻找x的根
                        //根的parent小于0
    return x;
}

 

在一个树形集合中,如果将任意两个结点直接相连,那么集合中就会形成回路。以集合A为例,将A中的2,3结点相连,就形成了1\rightarrow2\rightarrow3\rightarrow1回路:

连接结点2和结点3

 

可以利用这一特性来辅助构建最小生成树(卡鲁思卡尔算法)。

 

并查集的“并”,将多个(树形)集合合并:

要将多个(树形)集合合并为一个集合,只需要将一个集合的根结点作为另一个集合的根结点的子孩子就可以了。比如将上述的集合A和集合B合并为一个集合,如图所示:

合并集合A和集合B

 

反应在数组上:

用数组来表示合并后的集合A和集合B

 

只需要修改集合B的根结点对应的数组值,将其改为0即可。

 

实现代码:

void Union(int parent, int root1, int root2) {
    parent[root2] = root1;
}

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值