演算法基礎 貪心演算法

2021-06-28 15:03:56 字數 2634 閱讀 5951

貪心演算法是常見的基礎演算法,它在求解問題時總想用當前看來最好的方法去實現,而到了下一步,再用下一步時最好的方法來解決,因此有了貪心的名字。此方法不從整體去考慮,僅是在某種意義上的區域性最優求解。雖然貪心演算法不是對所有的問題都能得到整體最優解,但是面對範圍相當廣泛的很多問題時,能產生整體最優解或是整體最優解的高度近似解,因此可見貪心演算法只是追去一定範圍內的最優。

1.貪心演算法的基礎

貪心演算法在解決乙個問題時,通常會從某乙個初始解出發,逐步逼近給定的目標,以便盡快求出更好的解。

當達到演算法中的某一步不能在繼續進行下去的時候,就停止演算法,給出乙個近似解。由貪心演算法的特點和思路可以看出,貪心演算法存在以下3個問題。

(1).不保證最後得解是最優的(實際上它從不考慮最後得結果)

(2).不能用來求最大或最小解的問題

(3).只能滿足某些約束條件的可行解的範圍

而通常情況下,貪心演算法的思路如下:

(1).建立數學模型來描述問題

(2).將求解的問題分解為若干範圍較小的子問題

(3).對每一子問題求解,得到子問題的區域性最優解

(4).把子問題的區域性最優合併成原問題的區域性最優解

下面我們通過兩個例子來描述貪心演算法

1.找零方案

在現實生活中,我們買東西經常需要找零,而商店找零的方法通常是優先找面額大的,再找小面額的。因為我們永遠都不是商店的最後乙個顧客,因此商店為了保證下乙個顧客依然有零錢可以找,會盡可能的把面額大的找給我們,而把零錢留給自己。

人民幣有100、50、20、10、5、1、0.5、0.2、0.1(單位:元)等多種面額,設計乙個找零演算法,使得面值大的盡可能多的被找。

#include using namespace std ;

int main(void) ;

cin >> money ;

for(i = 0 ; i < 9 ; ++ i)

}return 0 ;

}

上面只是乙個簡單的例子,下面我們來詳細的討論一下裝箱問題

假設有編號為0,1,2.....n-1的n中物品,體積分別為v0,v1,v2......v(n-1),現需要將這些物品裝進容積為v的若干箱子中,且箱子的體積不會小於任一物品。不同的裝法可能。需要數量不同的箱子,現在我們需要用盡可能少的箱子裝下所有的物品。

例:箱子的容量為10,有四個物品,體積分別為6,7,4,3,如果按照6->7->4->3的順序,需要3個箱子,而如果按照6->4->7->3的順序,只需要兩個箱子。

選擇資料結構

資料結構的選擇關係到演算法的高效與否。

儲存鏈式結構,不涉及元素的進出,排除了棧和佇列。有陣列和鍊錶可供選擇,而我們在裝箱問題中選擇鍊錶的原因有一下兩點:

1.建立資料結構時,我們事先並不知道需要多少箱子,即無法確定元素的個數。

2.在演算法的執行中,我們一旦確定了物品裝進哪個箱子,就需要將物品和箱子建立某中記憶體上的聯絡,使得通過箱子可以找到其中的物品。

而陣列顯然不具備以上功能,因此我們選擇鍊錶。

typedef struct gnode gnode ;

typedef struct elemnode elemnode ;

typedef struct gbox gbox ;

最終程式執行時的資料結構應該是這樣

實際**如下:

#include #include const int maxv = 10 ;

typedef struct gnode gnode ;

typedef struct elemnode elemnode ;

typedef struct gbox gbox ;

gbox * pack(gbox * hb , gnode * hg , int num)

findend ->next = newnode ;

ibox ->v -= newnode ->gv ;}}

newbox = (gbox *)malloc(sizeof(gbox)) ; //如果當前所有箱子都不符合條件,建立乙個新的箱子節點

newbox ->v = maxv ; //並初始化

newbox ->nextnode = null ;

newbox ->nextbox = null ;

t = t ->nextbox = newbox ; //然後將新的箱子掛在箱子鏈的末尾

t ->nextnode = newnode ; //最後將新的物品掛在新的箱子上

}}void display(gbox * hbox)

printf("\n") ;

}}int main(void)

gbox * hbox = null ;

hbox = pack(hbox , hg , num) ;

display(hbox) ;

return 0 ;

}

基礎演算法 貪心演算法

概述 貪心演算法是從問題的初始狀態出發,通過若干次的貪心選擇而得到的最優值的一種求解策略,即貪心策略。簡單來說,貪心策略是一種在每次決策時採取當前意義下最優策略的演算法,做出的選擇至少在某種約束條件下的區域性最優解或較優解,並不一定是全域性的最優解或較優解,但在某些特定的情況下,可以利用貪心演算法來...

演算法基礎 貪心演算法

1.演算法思想 假設乙個問題比較複雜,暫時找不到全域性最優解,那麼我們可以考慮把原問題拆成幾個小問題 分而治之思想 分別求每個小問題的最優解,再把這些 區域性最優解 疊起來,就 當作 整個問題的最優解了。2.基本步驟 3.前提條件 4.問題分類 按序列任務分 按子任務來分解,即每一步都是在前一步的基...

演算法 貪心演算法

把乙個複雜問題分解為一系列較為簡單的區域性最優選擇,每乙個選擇都是對當前解的乙個擴充套件,知道獲得問題的完整解。在解決問題的策略上目光短淺,只根據當前已有的資訊做出選擇,而且一旦做出了選擇,不管將來有什麼結果這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域...