一些應用涉及將n個不同的元素分成一組不相交的集合。這些應用經常需要進行兩種特別的操作:尋找包含給定元素的唯一集合和合並兩個集合。用並查集即可實現。
一個不相交集合數據結構維護了一個不相交動態集的集合S={S1,S2,... ,Sk}。我們用一個代表來標識每個集合,它是這個集合的某個成員。
我們希望支持以下三種操作:
MAKE-SET(x):建立一個新的集合,它的唯一成員(因而爲代表)是x。因爲各個集合是不相交的,故x不會出現在別的集合中。
UNION(x,y):將包含x和y的兩個動態集合(表示爲Sx和Sy)合併成一個新的集合,即這兩個集合的並集。同時還要消除Sx和Sy。
FIND-SET(x):返回一個指針,這個指針指向包含x的(唯一)集合的代表。
應用:確定無向圖的連通分量。
CONNECTED-COMPONENTS(G)
for each vextex v∈G.V
MAKE-SET(v)
for each edge(u,v)∈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
不相交集合的鏈表表示(略)
不相交集合森林
在森林中,每棵有根樹代表一個集合,樹中的每個結點包含一個成員,每個成員僅僅指向它的父結點。每棵樹的根包含集合的代表,並且是其自己的父結點。
MAKE-SET操作簡單地創建一顆只有一個結點的數,FIND-SET操作通過沿着指向父結點的指針找到樹的根。這一通向根結點的簡單路徑上所訪問的結點構成了查找路徑(find path)。UNION操作得到一棵樹的根指向另外一棵樹的根。
僞代碼如下(其中FIND-SET帶有路徑壓縮):
MAKE-SET(x)
x.p=x
x.rank=0
UNION(x,y)
LINK(FIND-SET(x),FIND-SET(y))
LINK(x,y)
if x.rank>y.rank
y.p=x
else x.p=y
if x.rank==y.rank
y.rank=y.rank+1
FIND-SET(x)
if x≠x.p
x.p=FIND-SET(x.p)
return x.p