《算法導論》第21章 用於不相交集合的數據結構 個人筆記

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