用於不相交集合的數據結構(算法導論第21章-並查集)

       一些應用涉及將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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章