不相交集合

定义

不相交集合数据结构支持以下操作:

1.MakeSet(x):创建一个单元素集合{x}
2.Find(x):返回包含元素x的集合的ID号
3.Union(x, y):融合包含x元素的集合和包含y元素的集合

一般实现

为了简单起见,假定我们的n个对象全都是整数1,2,3,4,…,n

1.使用最小元素当做集合的ID号
2.使用smallest[1…n]数组:smallest[i]存储i所属集合里的最小元素

伪代码实现

MakeSet(i)
smallest[i] = i
Find(i)
return smallest[i]
Union(x,y)
x_id <--- Find(x)
y_id <--- Find(y)
if x_id = y_id 
    return 
m <--- min(x_id, y_id)
for k from 1 to n
    if smallest[k] in {x_id, y_id}
        smallest[k] = m

该算法的瓶颈:Union操作的时间复杂度为O(n)

高效实现

1.每个集合均用树表示
2.树的根节点为集合的ID号
3.使用数组parent[1…n]:parent[i]是i的父母节点,或者当i是跟结点时parent[i]为i本身
伪代码实现

MakeSet(i)

parent[i] <--- i

时间复杂度为O(1)

Find(i)

while i != parent[i]
    i <--- parent[i] 
return i

时间复杂度为O(tree height)

Union(i, j)

Union(i, j)函数的实现分析
把高度较小的树挂在另一棵树的根节点下,因为这样可以使得融合后的树高度最短。

i_id <--- Find(i)
j_id <--- Find(j)
if i_id = j_id
    return
if Rank[i_id] > Rank[j_id]
    Rank[i_id] <--- j_id
else
    Rank[j_id] <--- i_id
    if Rank[i_id] = Rank[j_id]
        Rank[j_id] <--- Rank[j_id] + 1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值