演算法設計與分析(三)之貪心演算法
前面兩篇:
貪心演算法的特點
設計要素:
貪心法適用於組合優化問題。
求解過程是多不判斷過程,最終的判斷序列對應於問題的最優解。
依據某種“短視的”貪心選擇性質判斷,性質好壞決定演算法的成敗。
貪心法必須進行正確性證明。
證明貪心法不正確的技巧:舉反例。
貪心法的優勢:演算法簡單,時間和空間複雜性低
最優裝載問題
問題:
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和機器學習,資料結構與演算法文章請關注本文公眾號: