第21章 用於不相交集合的數據結構
21.1 不相交集合的操作
用一個對象表示一個集合的每個元素,設x表示一個對象,希望支持以下三個操作:
- MAKE-SET(x):建立一個新的集合,它的唯一成員(因而爲代表)是x。因爲各個集合是不相交的,故x不會出現在別的某個集合中。
- UNION(x,y):將包含x和y的兩個動態集合(表示爲
Sx,Sy )合併成一個新的集合,即這兩個集合的並集。 - FIND-SET(x):返回一個指針,這個指針指向包含x的(唯一)集合的代表。
不相交集合數據結構的許多應用之一是確定無向圖的連通分量。下面僞代碼中,圖G的頂點集用G.V表示,邊集用G.E表示
CONNECTED-COMPONENTS(G){
for each vextex v in G.V
MAKE-SET(v)
for each edge(u,v) in G.E
if FIND-SET(u) != FIND-SET(v)
UNION(u,v)
}
SAME-COMPONENT(u,v){
if FIND-SET(u) == FIND-SET(v)
return TRUE
else
return FALSE
}
21.2 不相交集合的鏈表表示
每個集合用一個自己的鏈表來表示。每個集合的對象包含head屬性和tail屬性,head屬性指向表的第一個對象,tail屬性指向表的最後一個對象。鏈表中的每個對象都包括一個集合成員、一個指向鏈表中下一個對象的指針和一個指回到集合對象的指針。
21.3 不相交集合森林
MAKE-SET(v){
x.p = x
x.rank = 0
}
UNION(u,v){
LINK(FIND-SET(u),== FIND-SET(v))
}
LINK(x,y){
if x.rank > y.rank
y.p = x
else
x.p = y
if x.rank == y.rank
y.rank++
}
FIND-SET(x){
if x != x.p
x.p = FIND-SET(x.p)
return x.p
}