《算法圖解》——第八章 貪婪算法
第八章 貪婪算法
1 簡單的貪婪算法
每步都采取最優的做法,每步都選擇局部最優解。
2 背包問題
有些情況下,完美是優秀的敵人。如果你只需要找到一個大致解決問題的算法,貪婪算法挺不錯,因為實現容易,結果與正確結果相當接近。
練習
8.1 你在一家家具公司工作,需要將家具發往全國各地,為此你需要將箱子裝上卡車。每個箱子的尺寸各不相同,你需要盡可能利用每輛卡車的空間,為此你將如何選擇要裝上卡車的箱子呢?請設計一種貪婪算法。使用這種算法能得到最優解嗎?
選擇可以裝入卡車中最大的箱子,不斷重復,直到不能再裝,這種算法得不到最優解。
8.2 你要去歐洲旅行,總行程為7天。對於每個旅遊勝地,你都給它分配一個價值——表示你有多想去那裏看看,並估算出需要多長時間。你如何將這次旅行的價值最大化?請設計一種貪婪算法。使用這種算法能得到最優解嗎?
不斷地挑選可以在剩下的時間內完成的價值最大的活動,知道剩下的時間不能夠完成任何活動為止。同樣這種算法得不到最優解。
3 集合覆蓋問題
假設你辦了個廣播節目,要讓全美50個州的聽眾都收聽得到。為此,你需要決定在哪些廣播臺播出。在每個廣播臺播出都需要支付費用,因此你力圖在盡可能少的廣播臺播出。每個廣播臺都覆蓋特定的區域,不同廣播臺的覆蓋區域可能重疊。
具體方法如下:
①列出每個可能的廣播臺集合,這被稱為冪集(power set)。可能的子集有2**n個。
②在這些集合中,選出覆蓋全美50個州的最小集合。
由於可能的子集有2**n個,因此運行時間為O(2**n)。
用貪婪算法可得到非常接近的解:
①選出這樣一個廣播臺,它覆蓋了最多的未覆蓋的州。即使有重復的州也沒有關系
②重復第一步,直到覆蓋了所有的州
這是一種近似算法。判斷近似算法優劣的標準如下:
①速度有多快
②得到的近似解與最優解的接近程度。在這個例子中貪婪算法的運行時間為O(n**2)
《算法圖解》——第八章 貪婪算法