跳至內容

英文维基 | 中文维基 | 日文维基 | 草榴社区

貪心算法

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
一般人換零錢的時候也會應用到貪心算法。把$36換散︰$20 > $10 > $5 > $1

貪心算法(英語:greedy algorithm),又稱貪心算法,是一種在每一步選擇中都採取在當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是最好或最優的算法[1]比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市,那這就是一種貪心算法。

貪心算法在有最優子結構的問題中尤為有效。最優子結構的意思是局部最優解能決定全局最優解。簡單地說,問題能夠分解成子問題來解決,子問題的最優解能遞推到最終問題的最優解。

貪心算法與動態規劃的不同在於它對每個子問題的解決方案都做出選擇,不能回退。動態規劃則會保存以前的運算結果,並根據以前的結果對當前進行選擇,有回退功能。

貪心法可以解決一些最優化問題,如:求中的最小生成樹、求哈夫曼編碼……對於其他問題,貪心法一般不能得到我們所要求的答案。一旦一個問題可以通過貪心法來解決,那麼貪心法一般是解決這個問題的最好辦法。由於貪心法的高效性以及其所求得的答案比較接近最優結果,貪心法也可以用作輔助算法或者直接解決一些要求結果不特別精確的問題。在不同情況,選擇最優的解,可能會導致辛普森悖論(Simpson's Paradox),不一定出現最優的解。

貪心算法在數據科學領域被廣泛應用,特別是金融工程。其中一個貪心算法例子就是Ensemble method。

細節

[編輯]
  1. 建立數學模型來描述問題。
  2. 把求解的問題分成若干個子問題
  3. 對每一子問題求解,得到子問題的局部最優解。
  4. 把子問題的解局部最優解合成原來解問題的一個解。

實現該算法的過程:
從問題的某一初始解出發;while 能朝給定總目標前進一步 do,求出可行解的一個解元素;
最後,由所有解元素組合成問題的一個可行解。

應用

[編輯]
  • 對於大部分的問題,貪心法通常都不能找出最佳解(不過也有例外),因為他們一般沒有測試所有可能的解。貪心法容易過早做決定,因而沒法達到最佳解。例如,所有對圖著色問題
  • 貪心法在系統故障診斷策略生成乃至高校的排課系統中都可使用。[2][1]

舉例

[編輯]

最小生成樹的算法如Prim算法Kruskal算法均為貪心算法,其中Prim算法是對圖上的節點貪心,而Kruskal算法是對圖上的邊貪心。

參見

[編輯]

參考文獻

[編輯]
  1. ^ 1.0 1.1 曦輝, 鄧. 浅谈贪心算法在排课系统中的应用. 電腦與電信 (廣東省廣州市: 廣東省對外科技交流中心). 2011. ISSN 1008-6609. (原始內容存檔於2021-04-11) (中文(簡體)). 
  2. ^ 孫煜; 劉松風; 馬力. 贪心算法在系统故障诊断策略生成中的应用. 計算機系統應用 (北京市: 中國科學院軟件研究所). 2011. ISSN 1003-3254. (原始內容存檔於2021-04-11) (中文(簡體)). 

外部連結

[編輯]