1. 程式人生 > >演算法設計與分析(三)之貪心演算法

演算法設計與分析(三)之貪心演算法

前面兩篇:

貪心演算法的特點

設計要素:

  1. 貪心法適用於組合優化問題。

  2. 求解過程是多不判斷過程,最終的判斷序列對應於問題的最優解。

  3. 依據某種“短視的”貪心選擇性質判斷,性質好壞決定演算法的成敗。

  4. 貪心法必須進行正確性證明。

  5. 證明貪心法不正確的技巧:舉反例。

貪心法的優勢:演算法簡單,時間和空間複雜性低

最優裝載問題

問題:

n個集裝箱1,2,3,…..,n裝上輪船,集裝箱i的重量wi,輪船裝載重量限制為C,無體積限制。問如何裝是的上船的集裝箱最多?不妨設每個箱子的重量Wi<=C.

該問題是0-1揹包問題的子問題,集裝箱相當於物品,物品重量是Wi,價值Vi都等於1,輪船載重限制C相當於揹包重量限制b。

建模:

設 < x1,x2,x3,x4….,xn >表示解向量,Xi=0,1,Xi=0當且僅當第i個集裝箱裝上船

演算法設計

  • 貪心策略:輕者優先

  • 演算法設計: 
    將集裝箱排序,使得 
    W1<=W2<=…<=Wn 
    按照標號從小到大裝箱,直到裝入下一個箱子將使得集裝箱 總重超過輪船裝載重量限制,則停止。

正確性證明思路

  • 命題:對裝載問題任何規模為n的輸入例項,演算法得到最優解。

  • 設集裝箱從輕到中記為1,2,3…,n

  • 歸納基礎:證明對任何只含1個箱子的輸入例項,貪心法得到最優解。顯然正確

  • 歸納步驟: 證明:假設對於任何n個箱子的輸入例項貪心法都能得到最優解,那麼對任何n+1個箱子的輸入例項貪心法也得到最優解。

小結

  • 裝載問題是0-1揹包問題的子問題(每件物品重量為1),NP難的問題存在多項式時間可解的子問題

得不到最優解的問題的處理方法

找零錢問題

最小生成樹

Prim演算法

Kruskal演算法

單源最短路徑問題及演算法

Dijkstra演算法

貪心法小結

  • 貪心法適用於組合優化問題

  • 求解過程是多步判斷過程,最終的判斷序列對應於問題的最優解

  • 判斷依據某種“短視的”貪心選擇性質,性質的好壞決定了演算法的正確性。貪心性質的選擇往往依賴於直覺或經驗。

  • 貪心法正確性證明方法: 
    1).直接結算優化函式,貪心法的解恰好取得最優值 
    2).數學歸納法(對演算法步數或者問題規模歸納) 
    3). 交換論證

  • 證明貪心策略不對:舉反例

  • 對於某些不能保證對所有的例項都得到最優解的貪心演算法(近似演算法),可做引數化分析或者誤差分析

  • 貪心法的優勢:演算法簡單,時間和空間複雜性低

  • 幾個著名的貪心演算法 
    最小生成樹的Prim演算法 
    最小生成樹的Kruskal演算法 
    單源最短路的Dijkstra演算法

大資料學習交流QQ群:374038693

更多關於hadoop,spark和機器學習,資料結構與演算法文章請關注本文公眾號: