并查集(Union-Find Algorithm),看这一篇就够了

本文详细介绍了动态连接问题,并重点讲解了并查集(Union-Find Algorithm)的三种实现:Quick find、Quick union和Weighted Quick Union with Path Compression。讨论了它们的数据结构、算法、时间复杂度分析以及Java实现,特别指出Weighted Quick Union with Path Compression通过优化树形结构,实现了近乎线性的操作时间复杂度。
摘要由CSDN通过智能技术生成

动态连接(Dynamic connectivity)的问题

所谓的动态连接问题是指在一组可能相互连接也可能相互没有连接的对象中,判断给定的两个对象是否联通的一类问题。这类问题可以有如下抽象:

  • 有一组构成不相交集合的对象
  • union: 联通两个对象
  • find: 返回两个对象之间是否存在一条联通的通路

在使用union-find处理动态连接的问题时,我们一般将这一组对象抽象为一个数组。

对于这组对象,其中相互连接的一些对象构成的子集称为联通集。

算法目的:能够在如下条件下高效解决动态连接的问题

  • Union命令和Find命令可能交替被调用
  • 操作的总数M可能很大
  • 集合中的对象数目N可能很大

Quick find

数据结构:

  • 输入数组id[]的长度为N。且每一个对象最初的id都为其本身。
  • 当且仅当pq具有相同的idpq才是联通的。
  • id[]数组中存储对应对象所属的联通集的root的id。

算法:

  • Union:欲将pq相连,相当于合并包含p的联通集和包含q的联通集,也就是将所有idid[p]相同的对象的id改为id[q]
  • Find:检查pqid是否相同即可。

示例:

对于下表所示的对象集合,如果我们调用union(1,3),则需要将所有id2的对象的id改为4。经过这个操作之后,原先的两个联通集[1,2][3,4]如今成为了一个联通集。

|  i    | 0 | 1 | 2 | 3 | 4 |
| id[i] | 0 | 2 | 2 | 4 | 4 |

==> 

|  i    | 0 | 1 | 2 | 3 | 4 |
| id[i] | 0 | 4 | 4 | 4 | 4 |

Quick find的Java实现

public class QuickFind {
    int[] id;
    public QuickFind(int n) {
        id
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

耀凯考前突击大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值