iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
自我挑戰組

30天不怕演算法:白話文版系列 第 22

Day 22:貪婪演算法(2)

  • 分享至 

  • xImage
  •  

上一回寫到大部分貪婪演算法並非永遠正確,那哪些問題適合用它來解呢?

最佳子結構

貪婪演算法既是在過程中不斷地尋求局部最佳解,換句話說,它也就適合解決有辦法透過局部最佳解推得整體最佳解的問題,或者稱為擁有最佳子結構(optimal substructure)的問題。

舉例來說,如果從A地到達C地的最短路徑會經過B地,那麼其中A到B和B到C的路,應該也都是各自之間的最短路徑,可以說A-B-C這條最短路徑是由A-B和B-C的最短路徑組成。

可是如果今天要找到最便宜的機票,從A地到C地最便宜的機票可能在B地轉機,可是不代表買A到B最便宜的機票,再買B到C最便宜的機票會得到一樣的結果,因為轉乘的機票未必會等於兩張單程機票錢加總。這裡可能就無法用局部最佳解得到整體最佳解。

看到這些路徑問題,可能覺得跟之前提到的Dijkstra演算法似曾相識。Dijkstra演算法確實就是運用了貪婪演算法的手法,透過每一次選擇最短的路徑,來找到整體的最短路徑。

因此,如果一個問題的子問題最佳解可以組成整個問題的最佳解,那麼這個問題可能就適合用貪婪演算法解決。

近似演算法

另外一個運用貪婪演算法的時機是面對特別困難問題的時候。現實中的很多問題其實並不像設計過的演算法例題,可以用一兩個演算法就快速又正確地解決。有很多問題是屬於「困難」,必須花多到難以想像的資源(時間、空間)才有辦法解決,也就是追求正確解是很不且實際的。

這時候可能就需要仰賴近似演算法(approximation algorithm),這類演算法雖然未必能得到最佳解,但是能以合理的成本得到可以接受的近似解。而通常容易建構、執行速度快的貪婪演算法就可以是用來設計近似演算法的一種方式。

也可以說,在問題極其困難或不一定要絕對精確答案的時候,簡單、快速、能得到近似解的貪婪演算法也可以是不錯的選項。


上一篇
Day 21:貪婪演算法(greedy algorithm)
下一篇
Day 23:最小生成樹(MST)
系列文
30天不怕演算法:白話文版30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言