不相交集合的数据结构和操作

不相交集合是一种动态维护不相交元素集合的数据结构,支持Make-Set、Union和Find-Set操作。链表表示下,Make-Set和Find-Set操作时间为O(1),但Union操作效率较低。通过按秩合并和路径压缩两种策略可以优化运行时间,按秩合并依据结点秩进行合并,路径压缩则将查找路径上所有结点直接指向根结点。
摘要由CSDN通过智能技术生成

什么是不🍌集合

不相交集合维护了一个不相交动态集的集合,选用一个代表元素来标识每个集合,并不关心哪个元素作为代表(当然,还是有一定的选取规则)。

动态集合支持的操作:

  • Make-Set(x) 建立一个新的集合,它的成员唯一且仅出现在此集合中(因为不相交)。
  • Union(x,y)将包含x和y的两个动态集合(不一定是单一成员集合)合并成一个新的集合,选取两个集合中的任意元素作为代表。
  • Find-Set(x) 返回一个指针,这个指针指向包含x的集合的代表。(这个集合是唯一的)

不相交集合的链表表示

每个集合都有自己的一个链表。每个集合包含head和tail属性,head指向第一个对象,tail指向最后一个对象。链表的每个对象都有一个集合成员(也就是本身),一个指向下一个对象的指针,一个回到集合对象的指针。代表是链表中的第一个对象。

链表表示下Make-Set(x)和Find-Set(x)都是O(1)的复杂度,但Union操作会随着链表的增长消耗大量时间。

改进方法是用一种所谓加权合并启发式策略,在每个链表上维护一个长度变量,合并时总是把短的链表合并到长链表的后面,这样Union操作的时间成本会降低。

更快的实现

用树来表示集合,每棵树的根就是集合的代表,而且根是自己的父节点,每个成员仅指向自己的父节点。
在这种实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值