入門四種演算法思想之一——貪心演算法

首先我們應該知道,貪心演算法和分治演算法、回溯演算法、動態規劃四種演算法。只能說是幾種是演算法思想,而並不是具體的演算法,我們學會他們的目的是來指導我們設計具體的演算法和編碼等。

貪心演算法

,又稱為

貪婪法

,即在對問題進行求解時,總是考慮當前情況下的最優解(如同人一樣,在面對一些情況時,總是選擇當前情況的最優解),而不是全域性考慮下的最優解。

這種方法就是將整個事件分為若干個步驟,每一個步驟都按照貪心的策略,選取當前情況下的最優的選擇(區域性最優),然後希望這所有最優解堆疊出來的結果也是最優解。

基本步驟

將一個大的問題分解為若干步(比如去走親戚要走n段路)

每一步都使用貪婪演算法,找到每一步的最優解(如果每段路都有n種走法,則選取最優的路段)

將所有部分的最優解構成為大的問題的一個解(將n段路合到一塊)

貪心演算法存在的問題

因為每一步都僅僅按照當前情況的最優解來選擇,所以當按照全域性考慮時,並不一定是最優解

不能用來求最大最小問題,因為結果本來就不一定是最優解

適用物件

區域性最優解合起來也是全域性的最優解

再舉上面走路的問題,進行分析,當我們面對如何走路時,當不知道整體情況如何時,該怎樣選擇路程呢。即每走到一個路口都選擇當前情況下的最短路徑。

入門四種演算法思想之一——貪心演算法

入門四種演算法思想之一——貪心演算法

第一步:

整段路程可以分為n段

第二步:

每個分叉即為不同的選擇,紅色即為每一段的最優解

當在A時,有AC,AB兩條路,選擇短的AB。

在B點時有BD,BE選擇最優解BE。

在E點時,有EF,EG,選擇最優解EG。

在G點時,無法選擇,則只能走G->AA這條路。

第三步:

將每一段的最優解合併起來,即為這段路程的一種解決方法(A->B->E->G->AA)

實際情況

如上圖從A點走到AA點,看似紅線是每一步的都是當前情況下的最優解,但是從整體來看A->C->AA才是整體情況下的最優解,所以貪心演算法也存在很大問題,使用貪心演算法,儘管每一步得到的結果都是最優解;但是從整體來看,得到的並非最優解。

或者另一個例子

現在有重為100千克,80千克和1千克的石頭,當需要總重量一定時,如何選擇才能使石頭數量最少。

分析:

如果按照貪心演算法來寫的話,若要使石頭數量最少,則需要先選擇重量最大的石頭,然後在往下找。

此時若需要240千克石頭,按照貪心演算法則石頭組成為2*100千克+40*1千克,42塊石頭

而實際最少方案為3*80千克,3塊石頭。

所以在使用時,一定要分析好貪心演算法的思想是否適用,從而再確定出最好的思想方法。