常用演算法之貪心演算法

2022-09-09 15:30:34 字數 1398 閱讀 5409

一、什麼是貪心演算法?

貪心演算法指對問題求解時,總是做出在當前看來是最好的選擇,期望通過所做的區域性最後選擇來產生出乙個全域性最優解。

二、貪心演算法的適用場景

首先,在利用貪心演算法求解問題之前,我們需要清楚什麼樣的問題適合用貪心演算法求解。一般而言,能夠利用貪心演算法求解的問題都會具備以下兩點性質:

貪心選擇

最優子結構。

如果我們能夠證明問題具備這兩個性質,那麼就可以設計出它的乙個貪心演算法。

2.1 貪心選擇性質

乙個全域性最優解可以通過可以通過區域性最優選擇來達到。

換句話說,當考慮如何做選擇時,我們只考慮對當前問題最佳的選擇、而不考慮子問題的結果。

在貪心演算法中,我們所做的總是當前看似最佳的選擇,然後再解決選擇之後所出現的子問題。貪心演算法所做的當前選擇可能要依賴於已經做出的所有選擇,但不依賴於有待於做出的選擇或子問題的解。

我們必須證明在每一步所做的貪心選擇最終能產生乙個全域性最優解。

2.2 最優子結構

對於乙個問題來說,如果它的乙個最優解包含了其子問題的最優解,則稱該問題具有最優子結構。

假設在原問題中做了乙個貪心選擇而得到了乙個子問題,真正要做的是證明將此問題的最優解與所做的貪心選擇合併後,的確可以得到原問題的乙個最優解。這個方案意味著要對子問題採用歸納法,來證明每個步驟中所做的貪心選擇最終會產生出乙個最優解。

貪心演算法與動態規劃的不同在於他對每個子問題的解決方案都是區域性最優選擇,不能回退。

動態規劃則會儲存以前的運算結果,並根據以前的結果對當前進行選擇,有回退功能。

以活動選擇問題為例, 活動集合s=。

現在要證明的是,如果每一步都進行貪心選擇,執行到第k步時,選擇的k項活動為i1, i2, ..., ik,那麼存在乙個最優解包含活動i1,i2, ... ik。根據上述命題,對於任何k,演算法前k步的選擇都將導致最優解,至多到第n步將得到問題例項的最優解。

當k = 1時,設最優解為a = , 如果i1不等於1, 因為活動1結束的時間最早,那麼用1替換i1後得到的a'也是問題的乙個最優解;

假設對於任意的正整數k,命題正確, 即存在乙個全域性最優解a=∪b,其中b為全域性最優解a中除了i1, i2,...,ik以外的部分。

記s中除了剩下部分中與i1, i2, ..., ik相容的活動集合為s', 那麼b必然是s'的乙個最優解。

反證法證之:

假設b不是s'的最優解,即存在最優解b'的活動比b多, 那麼∪b' > ∪b, 與a是全域性最優解矛盾。

既然b是s'的乙個最優解。根據1的結論,s'中結束時間最早的活動(ik+1)總會導致乙個最優解,如果b中包含ik+1, 那麼就說明最優解a中包含ik+1;

如果b中不包含ik+1, 那麼一定存在s'的另外乙個最優解b'包含ik+1, 即:

∪b = ∪b', 其中b'=

因此一定出現在乙個最優解集合中。

命題得證。

常用演算法之貪心演算法

一 基本概念 所謂貪心演算法是指,在對問題求解時,總是做出在 當前看來是最好的選擇 也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的 區域性最優解 貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略...

常用演算法三(貪心演算法)

一 基本概念 所謂貪心演算法是指,在對問題求解時,總是做出在 當前看來是最好的選擇 也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的 區域性最優解 貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略...

常用演算法三(貪心演算法)

一 基本概念 所謂貪心演算法是指,在對問題求解時,總是做出在 當前看來是最好的選擇 也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的 區域性最優解 貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略...