可用貪心算法解決的幾個基本問題

可用貪心算法解決的幾個基本問題

?關鍵:看問題有沒有貪心選擇性質和最優子結構性質。有些問題看似是可以用貪心算法,但是實際用貪心算法卻得不到最優解。構造貪心算法后,需要一定的證明來確定它的正確性。常用證明方法:反證法、調整法。

幾個基本問題:

1. 活動安排問題。

設有n個活動的集合e={1,2,…,n},其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有一個活動能使用這一資源。每個活動i都有一個要求使用該資源的起始時間si和一個結束時間fi,且si<fi。如果選擇了活動i,則它在區間[si,fi]內占用資源。若區間[si,fi]與區間[sj,fj]不相交,則稱活動i與活動j是相容的。也就是說,當sj≥fi或si≥fj時,活動i與活動j相容。活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合。

解決方法:先選擇結束時間最早的那一個活動,然后往后依次查找結束時間最近的不沖突的活動加入。

2. 可以解決背包問題,不能解決0-1背包問題。

0-1背包問題:

給定n種物品和一個背包。物品i的重量是Wi,其價值為Vi,背包的容量為C。應如何選擇裝入背包的物品,使得裝入背包中物品的總價值最大?

在選擇裝入背包的物品時,對每種物品i只有2種選擇,即裝入背包或不裝入背包。不能將物品i裝入背包多次,也不能只裝入部分的物品i。

背包問題:

與0-1背包問題類似,所不同的是在選擇物品i裝入背包時,可以選擇物品i的一部分,而不一定要全部裝入背包,1≤i≤n。

解決方法:求每個物品的價值重量比,即價值/重量。然后添加價值重量比最大的物品,添加結束如果未達到重量上限,再添加價值重量比次大的。

3. 最優裝載問題

有一批集裝箱要裝上一艘載重量為c的輪船。其中集裝箱i的重量為Wi。最優裝載問題要求確定在裝載體積不受限制的情況下,將盡可能多的集裝箱裝上輪船。

解決方法:每次裝重量最輕者。

4. 哈夫曼編碼

給出現頻率高的字符較短的編碼,出現頻率較低的字符以較長的編碼。對每一個字符規定一個0,1串作為其代碼,并要求任一字符的代碼都不是其它字符代碼的前綴。這種編碼稱為前綴碼。

5.?Dijkstra算法

給定帶權有向圖G =(V,E),其中每條邊的權是非負實數。另外,還給定V中的一個頂點,稱為源。現在要計算從源到所有其它各頂點的最短路長度。這里路的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題。

基本思想是,設置頂點集合S并不斷地作貪心選擇來擴充這個集合。一個頂點屬于集合S當且僅當從源到該頂點的最短路徑長度已知。

6. 求最小生成樹的Prim算法和Kruskal算法。

7. 多機調度問題。

要求給出一種作業調度方案,使所給的n個作業在盡可能短的時間內由m臺機器加工處理完成。

這個問題是NP完全問題,到目前為止還沒有有效的解法。采用最長處理時間作業優先的貪心選擇策略可以設計出解多機調度問題的較好的近似算法。

解決方案:當n>m時,首先將n個作業依其所需的處理時間從大到小排序。然后依此順序將作業分配給空閑的處理機。算法所需的計算時間為O(nlogn)。

8. 埃及分數問題。

設a、b為互質正整數,a<b 分數a/b 可用以下的步驟分解成若干個單位分數之和:

步驟一: 用b 除以a, 得商數q1 及余數r1。 (r1=b - a*q1)

步驟二:把a/b 記作:a/b=1/(q1+1)+(a-r)/b(q1+1)

步驟三:重復步驟2,直到分解完畢

例:3/7=1/3+2/21=1/3+1/11+1/231

13/23=1/2+3/46=1/2+1/16+1/368

思路:也是貪心思維,以 b/a取整+1 作為一個分解因子,其實是選取了值最大的分子為1的分解

http://wenku.baidu.com/link?url=lrTeMKQu1gvlI5QNMak_21dwMWWcREZce5n1npojbNtIGu4LBV50V00dR4yAHOL-NTUmGLIEpwiVmyRU2FfgFaZqtxRTjCUEvJv3rwJdR_C

?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容