一、概述
1.設計思想
貪心算法通過一系列選擇來得到問題的解,所做的每個選擇都是當前狀態下局部最好選擇,即貪心選擇。
貪心算法並不從整體最優上加以考慮,所做的選擇只是在某種意義上的局部選擇,在一些情況下,即使貪心算法不能得到整體最優解,但其最終結果確實最優解的很好的近似解。
2.基本要素
(1)貪心選擇性質
貪心算法所做的選擇可以依賴以往所做過的選擇,但絕不依賴將來所做的選擇,也不依賴子問題的解。
(2)最優子結構性質
當一個問題的最優解中包含了子問題的最優解時,則稱該問題具有最優子結構特性。
3.存在的問題
(1)不能保證求得的最后解是最佳的;
(2)不能用來求最大或最小解問題;
(3)只能求滿足某些約束條件的可行解的范圍。
4.算法比較
名稱 | 同 | 異 |
貪心算法 | 都要求問題具有最優子結構性質 | 不依賴將來和子問題的解 自頂向下進行求解 具有貪心選擇性質 |
動態規划算法 | 往往依賴相關子問題的解 自底向上進行求解 具有重疊子問題性質 |
二、例題總結
1.活動安排問題
【問題描述】 設有n個活動的集合E={1,2,…,n},其中每個活動都要求使用同一資源(如演講會場等),而在同一時間內只有一個活動能使用這一資源。每個活動i都有一個要求使用該資源的起始時間si和結束時間fi,如果選擇了活動i,則它在半開區間[si,fi)與區間[sj,fj)內占用資源。若區間[si,fi)與區間[sj,fj)不相交,則稱活動i和j是相容的,也就是說,當si≥fj或sj≥fi時,活動i與活動j相容。
【算法設計】由於活動占用資源的時間沒有限制,因此,選擇最早結束時間作為貪心策略更加合理,目的是使剩余時間段最大化,以便安排盡可能多相容的活動。
【算法實現】
數組f中元素按結束時間非降序排列,若未按此序排列,可以用O(nlogn)做時間重排。
2.背包問題
【問題描述】 設背包容量為C,n個物品,物品價值和重量為v[i],w[i]。物品可以只裝一部分。
【算法設計】不存在0-1要求,先裝單價最貴的,再裝單價次貴的,依此貪心策略一直進行下去,直到背包裝滿。
【算法實現】 O(nlogn)
3.最優裝載問題
【問題描述】設有一輪船能裝載的貨物重量為C,有n個集裝箱,重量為w[i],問怎樣可以裝盡可能多的集裝箱。
【算法設計】先裝最輕的,再裝次輕的,依此貪心策略一直進行下去,直到輪船裝滿。
【算法實現】 O(nlogn)