五大常用演算法之貪心演算法

2021-09-29 04:59:12 字數 2369 閱讀 9313

五大常用演算法之貪心演算法

貪心演算法(貪婪演算法)指的是:在對問題求解過程中,總是做出在當前看來是最好的選擇。不從整體最優上加以考慮,所做出的是在某種意義上的區域性最優解。

貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。

貪心選擇

貪心選擇是指所求問題整天最優解可以通過一系列區域性最優的選擇,即通過貪心演算法可行的第乙個基本要素。也是貪心演算法與動態規劃演算法的主要區別。貪心選擇是採用自頂向下(將大型的數位電路設計分割成大小不一的小模組來實現特定的功能,最後通過由頂層模組呼叫子模組來實現整體功能)、以迭代(迭代函式是重複的與自身復合的函式)的方法做出相繼選擇,每做一步貪心選擇就將所求問題簡化為乙個更下的子問題。對於具體問題,要明確它是否具有貪心選擇的性質,必須能夠證明每一步所作的貪心選擇最終能夠得到問題的最優解。通常可以首先證明乙個整體最優解,從貪心選擇開始,而且作了貪心選擇後,原問題簡化乙個規模更小的類似子問題,然後再用數學歸納法證明,通過每一步貪心選擇,最終可以得到問題的乙個整體最優解。

最優子結構

當乙個問題最優解包含其子問題的最優解時,稱此問題具有最優子結構性質。貪心策略在每一次轉化時都取得了最優解。最優子結構性質是該問題可用貪心演算法或動態規劃演算法求解的關鍵特徵。貪心演算法的每一次操作都對結果產生直接影響,而動態規劃則不是。貪心演算法對每個子問題的解決方案都做出選擇,不能回退;動態規劃則會根據以前的選擇結果對當前進行選擇,有回退功能。動態規劃主要運用於二維或三維問題,而貪心一般是一維問題。

求解

貪心演算法不是對所有問題都能得到整體最優解,但對許多問題它能產生整體最優解。如單源最短路徑問題,最小生成樹問題等。在一些情況下,即使貪心演算法不能得到整體最優解,其最終結果卻是最優解的很好近似。由於貪心法的高效性以及其所求得的答案比較接近最優結果,貪心法也可以用作輔助演算法或者直接解決一些要求結果不特別精確的問題。

貪心基本思想與過程:

貪心演算法基本思想是從問題某乙個初始解出發一步一步地進行,根據某個優化測度,每一步都要確保能獲得區域性最優解,每一步只考慮乙個資料,他的選取應該滿足區域性優化的條件。若下乙個資料和部分最優解連在一起不再是可行解時,就不把該資料新增到部分解中,直到把所有資料列舉完,或者不能再新增演算法停止。

過程:

建立數學模型來描述問題。

把求解的問題分成若干個子問題。

對每一子問題求解,得到子問題的區域性最優解。

把子問題的解區域性最優解合成原來解問題的乙個解。

貪心演算法存在問題:

不能保證求得的最後解是最佳的

不能用來求最大或者最小解問題

只能求滿足某些約束條件的可行解範圍

貪心策略適用的前提是:區域性最優策略能導致產生全域性最優解。

實際上,貪心演算法適用的情況很少。一般,對乙個問題分析是否適用於貪心演算法,可以先選擇該問題下的幾個實際資料進行分析,就可做出判斷。

貪心演算法實現的框架:

從問題某一初始解出發;

while(總目標前進)a[10];

bool cmp(data x,data y)

int main()

cout<0&&i<=n),其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有乙個活動能使用這一資源。

每個活動 i 都有乙個要求使用該資源的起始時間 si 和乙個結束時間 fi,且 si < fi。如果選擇了活動i,則它在半開時間區間 [si ,fi ) 內占用資源。若區間 [si , fi )與區間 [sj, fj ) 不相交,則稱活動i與活動j是相容的。當 si ≥ fj 或 sj ≥ fi 時,活動 i 與活動 j 相容。

活動安排問題就是在所給的活動集合中選出最大的相容活動子集合。

#includeusing namespace std;

#define num 50

void greedyselector(int n,int s,int f,bool b)else

b[i]=false; }}

int main(); //儲存活動開始時間

int f = ; //儲存活動結束時間

bool b[num];

int n=(sizeof(s)/sizeof(s[0]))-1;

greedyselector(n,s,f,b);

for(int i=1;i<=n;i++){

if(b[i])

cout<

五大常用演算法 貪心演算法

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

五大常用演算法 貪心演算法

貪心演算法是指 在每一步求解的步驟中,它要求 貪婪 的選擇最佳操作,並希望通過一系列的最優選擇,能夠產生乙個問題的 全域性的 最優解。貪心演算法每一步必須滿足一下條件 1 可行的 即它必須滿足問題的約束。2 區域性最優 他是當前步驟中所有可行選擇中最佳的區域性選擇。3 不可取消 即選擇一旦做出,在演...

五大演算法之貪心演算法

貪心演算法是指對子問題取最值,從而求得區域性最優解,並以此求得全域性最優解。貪心演算法可以認為是動態規劃的乙個特例,同樣是需要將問題分解為子問題,避免了子問題的重複計算,只不過在子問題的處理上貪心演算法更加簡單直接。貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無後效性,即某個狀...