1. 程式人生 > >《算法圖解》——第八章 貪婪算法

《算法圖解》——第八章 貪婪算法

http 箱子 n) 分配 .com color 判斷 set 設計

       第八章 貪婪算法

1  簡單的貪婪算法

每步都采取最優的做法,每步都選擇局部最優解。


2  背包問題

有些情況下,完美是優秀的敵人。如果你只需要找到一個大致解決問題的算法,貪婪算法挺不錯,因為實現容易,結果與正確結果相當接近。

練習
8.1 你在一家家具公司工作,需要將家具發往全國各地,為此你需要將箱子裝上卡車。每個箱子的尺寸各不相同,你需要盡可能利用每輛卡車的空間,為此你將如何選擇要裝上卡車的箱子呢?請設計一種貪婪算法。使用這種算法能得到最優解嗎?

選擇可以裝入卡車中最大的箱子,不斷重復,直到不能再裝,這種算法得不到最優解。

8.2 你要去歐洲旅行,總行程為7天。對於每個旅遊勝地,你都給它分配一個價值——表示你有多想去那裏看看,並估算出需要多長時間。你如何將這次旅行的價值最大化?請設計一種貪婪算法。使用這種算法能得到最優解嗎?

不斷地挑選可以在剩下的時間內完成的價值最大的活動,知道剩下的時間不能夠完成任何活動為止。同樣這種算法得不到最優解。


3  集合覆蓋問題

假設你辦了個廣播節目,要讓全美50個州的聽眾都收聽得到。為此,你需要決定在哪些廣播臺播出。在每個廣播臺播出都需要支付費用,因此你力圖在盡可能少的廣播臺播出。每個廣播臺都覆蓋特定的區域,不同廣播臺的覆蓋區域可能重疊。

具體方法如下:

①列出每個可能的廣播臺集合,這被稱為冪集(power set)。可能的子集有2**n個。

②在這些集合中,選出覆蓋全美50個州的最小集合。

由於可能的子集有2**n個,因此運行時間為O(2**n)。

技術分享圖片

用貪婪算法可得到非常接近的解:

①選出這樣一個廣播臺,它覆蓋了最多的未覆蓋的州。即使有重復的州也沒有關系

②重復第一步,直到覆蓋了所有的州

這是一種近似算法。判斷近似算法優劣的標準如下:

①速度有多快

②得到的近似解與最優解的接近程度。在這個例子中貪婪算法的運行時間為O(n**2)

《算法圖解》——第八章 貪婪算法