定义
不相交集合数据结构支持以下操作:
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