貪心演算法正確性證明
wiki定義:貪心演算法(英語:greedy algorithm),又稱貪婪演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是最好或最優的演算法。比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市,那這就是一種貪心演算法。
用大白話說:我每一步都選擇當下的最好選擇,這樣做下去我的最終結果就是最好的。
貪心演算法是一種漂亮的演算法設計思路,有很多應用,比如prim演算法。貪心演算法在很多情況下可以得到最優解。(並不適用於所有情況,文章最後會給出反例)
貪心演算法正確性證明
和這世界上大部分演算法相同,貪心演算法可以由數學歸納法證明其正確性。下面以prim演算法為例子給出證明過程:
對於乙個給的的圖g,其最小生成樹集合為t*(乙個圖可以有多個最小生成樹),由演算法求出的最小生成樹為t,我們只需要在prim演算法的每一步得出的樹t一直是t*的子集即可。
1.basecase: t是空樹,因此t當然是t*的子集,basecase成立。
2.inductive: t是t的子集,下一步要將一條邊e加到t中,求證t+e依舊是t的子集
圖中e』是屬於t的一條邊
第一種情況:e = e』,說明我們加入的邊e是最小生成樹中的一條邊,t+e自然是t的子集,證明完畢。
第二種情況:e != e』,這時根據prim演算法規則(或者說根據貪心演算法原理),e一定小於等於e』,即w(e) <= w(e』),因此t+e』依舊是t*的乙個子集,證明完畢。
有的讀者可能會說這是prim演算法的證明過程,並不是貪心演算法的證明。但是其實所有貪心演算法都可以用這種方法證明,因為貪心演算法的理念都是一樣的,就是每一步時選擇當下最優解可以得出最優結果,均可以由數學歸納法快速證明。
btw:貪心演算法天生就是為數學歸納法準備的,它自己的演算法思想幾乎就是證明過程。
我實在懶得打字+翻譯成中文了,各位看官自行閱覽吧,其實很容易就舉出反例了
貪心演算法的正確性證明
貪心演算法最難的部分就是正確性的證明,常用的方法有歸納法 對演算法步數歸納 對問題歸納 和交換論證法 從最優解出發,不變壞地替換,得到貪心策略的解 下面以三個例子說明這些正確性證法。活動選擇問題 對演算法步數歸納 最優裝載問題 對問題規模歸納 最小延遲排程 交換論證 s s s 為n項活動的集合,s...
Dijkstra演算法正確性證明
問題 求圖中點1到其他各點的最短距離 演算法描述 設初始時圖的所有點的集合u 把起點s放入初始集合set中 u u set set 找s經過集合set中的點,能達到的距離最短的點k k in u 將k併入set 言外之意k的前乙個點必然屬於set u u set set 由於每次引入的只有乙個點k,...
Dijkstra演算法正確性證明
問題 求圖中點1到其他各點的最短距離 策略 1.把起點1放入初始集合set中,從剩餘的點中,選取到set 此時set中只有1個點 距離最近的點,併入集合set中,2.從剩餘的點中,找經過集合set,到起點1的最短距離,將最短邊併入set集合 3.依次迴圈,直到所有的邊都併入set 變數的命名 set...