《算法導論》第23章 最小生成樹 個人筆記


第23章 最小生成樹

23.1 最小生成樹的形成

本章所討論的兩種算法都使用貪心策略,但兩者使用的貪心策略有所不同。這個貪心策略可以由下面的通用方法來表達,該通用方法在每個時刻生長最小生成樹的一條邊,並在整個策略的實施過程中,管理一個遵守下述循環不變式的邊集合A:在每遍循環之前,A是某棵最小生成樹的一個子集。

23.2 Kruskal算法和Prim算法

1、Kruskal算法

  • FIND-SET(u)是否等於FIND-SET(v)來判斷結點u和結點v是否屬於同一棵樹
  • 使用UNION過程來對兩棵樹進行合併。
  • 時間複雜度爲O(ElgV)
MST-KRUSKAL(G,w){
    A = new Set()
    for v in G.V
        MAKE-SET(v)
    sort the edges of G.E into nondecreasing order by weight w
    for edge(u,v) in G.E, take in nondecreasing order by weight
        if FIND-SET(u) != FIND-SET(v)
            A = A + {(u,v)}
            UNION(u,v)
}

2、 Prim算法

  • 所有不在樹A中的結點都存放在一個基於key屬性的最小優先隊列Q中。
  • 對於每個結點v,屬性v.key保存的是連接v和樹中結點的所有邊中最小邊的權重。我們約定,若不存在這樣的邊,則v.key = inf。
  • 屬性v.p給出的是結點v在樹中的父結點
  • 時間複雜度爲O(ElgV)
MST-PRIM(G,w,r){ //隨機選擇的一個開始結點r
    for u in G.V
        u.key = inf
        u.p = NIL
    r.key = 0
    Q = G.V
    while(!Q.isEmpty){
        u = EXRACT-MIN(Q)
        for v in G.Adj[u]
        if v in G && w(u,v)<v.key
            v.p = u
            v.key = w(u,v)
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章