1. 程式人生 > >【演算法分析與設計】最小生成樹

【演算法分析與設計】最小生成樹

一、理論知識

1、 優先佇列

  • 特點:插入元素和查詢最值時間複雜度都是log(n)。
  • 實現思路:使用完全二叉樹,所有操作保證父節點大於子節點(僅父子節點大小關係,沒有其他要求),這樣最大值就是樹根。
  • 具體細節:
    由於父節點必須大於子節點,所以在插入或者刪除的時候要進行順序調整,調整方法如下:
    在這裡插入圖片描述
  • 插入時,直接把元素插到陣列最後一個位置,這樣在樹中也就是最下層的最右葉節點(圖右上1)。然後比較葉節點和它父節點的大小關係,如果父節點小於它,那麼交換他們的位置,以此類推,直到父節點大於它,就找到了正確位置。由於它最糟糕的情況就是從葉節點一直換到樹根,假設樹的層數從0開始計,總共有h層。那麼他就換了h次。而這裡h = log(n),n為節點總數。所以其時間複雜度也是log(n).
  • 刪除時,將樹的最後一個葉節點放到刪除位置,然後看該位置和其父子的大小關係,進行移動。最糟糕的情況就是刪除樹根,然後移動的時候又從樹根移到了最下層的葉子結點,那麼它和插入時最糟糕的情況相同,都是交換了h次。

2、kruskal演算法

  • 說白了,就是在所有剩餘的邊中找到權值最小的邊,然後看如果把它加進去,會不會構成環,如果不構成環就加進去,如果構成環,就直接扔了。看完所有的邊,最小生成樹也就有了。

3、prim演算法

  • 這個要用到割線。從一個節點開始,選權值最小的邊,加進來,然後畫個圈,圈住已經加進來的元素。然後再看被這個圈割了的那些邊,從他們中找一條最短的,加進來。然後再畫圈圈主,以此類推,直到所有的頂點都進來了的時候,最小生成樹也就有了。具體如下圖。
    在這裡插入圖片描述

    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

  1. 圖取自劉巨集老師PPT ↩︎