1. 程式人生 > >貪心演算法正確性證明

貪心演算法正確性證明

貪心演算法正確性證明

什麼是貪心演算法

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:貪心演算法天生就是為數學歸納法準備的,它自己的演算法思想幾乎就是證明過程。

反例:
在這裡插入圖片描述

我實在懶得打字+翻譯成中文了,各位看官自行閱覽吧,其實很容易就舉出反例了