https://blog.csdn.net/beyond59241/article/details/50728614
https://blog.csdn.net/changyuanchn/article/details/51476281
據說有人歸納了計算機的五大常用算法,它們是貪婪算法,動態規划算法,分治算法,回溯算法以及分支限界算法。雖然不知道為何要將這五個算法歸為最常用的算法,但是毫無疑問,這五個算法是有很多應用場景的,最優化問題大多可以利用這些算法解決。算法的本質就是解決問題。當數據量比較小時,其實根本就不需要什么算法,寫一些for循環完全就可以很快速的搞定了,但是當數據量比較大,場景比較復雜的時候,編寫for循環就是一個很不明智的方式了。一是耗時,二是寫出的代碼絕對是天書。當然還有第三點,這點也是最重要的,寫代碼是一種藝術,而不是搬磚。前面的文章里對這五種算法都已經做了詳細的講解和歸納,本文主要是一個總結,將這五種算法整理到一起來對比,分析一下。
0) 窮舉法
窮舉法簡單粗暴,沒有什么問題是搞不定的,只要你肯花時間。同時對於小數據量,窮舉法就是最優秀的算法。就像太祖長拳,簡單,人人都能會,能解決問題,但是與真正的高手過招,就頹了。
1) 貪婪算法
貪婪算法可以獲取到問題的局部最優解,不一定能獲取到全局最優解,同時獲取最優解的好壞要看貪婪策略的選擇。特點就是簡單,能獲取到局部最優解。就像打狗棍法,同一套棍法,洪七公和魯有腳的水平就差太多了,因此同樣是貪婪算法,不同的貪婪策略會導致得到差異非常大的結果。
具體的詳細解析請參見下面的文章:
http://blog.csdn.net/changyuanchn/article/details/51417211
2) 動態規划算法
當最優化問題具有重復子問題和最優子結構的時候,就是動態規划出場的時候了。動態規划算法的核心就是提供了一個memory來緩存重復子問題的結果,避免了遞歸的過程中的大量的重復計算。動態規划算法的難點在於怎么將問題轉化為能夠利用動態規划算法來解決。當重復子問題的數目比較小時,動態規划的效果也會很差。如果問題存在大量的重復子問題的話,那么動態規划對於效率的提高是非常恐怖的。就像斗轉星移武功,對手強它也會比較強,對手若,他也會比較弱。
具體的詳細解析請參見下面的文章:
http://blog.csdn.net/changyuanchn/article/details/51420028
http://blog.csdn.net/changyuanchn/article/details/51429979
3)分治算法
分治算法的邏輯更簡單了,就是一個詞,分而治之。分治算法就是把一個大的問題分為若干個子問題,然后在子問題繼續向下分,一直到base cases,通過base cases的解決,一步步向上,最終解決最初的大問題。分治算法是遞歸的典型應用。
具體的詳細解析請參見下面的文章:
http://blog.csdn.net/changyuanchn/article/details/17150109
http://blog.csdn.net/changyuanchn/article/details/51465175
4) 回溯算法
回溯算法是深度優先策略的典型應用,回溯算法就是沿着一條路向下走,如果此路不同了,則回溯到上一個
分岔路,在選一條路走,一直這樣遞歸下去,直到遍歷萬所有的路徑。八皇后問題是回溯算法的一個經典問題,還有一個經典的應用場景就是迷宮問題。
具體的詳細解析請參見下面的文章:
http://blog.csdn.net/changyuanchn/article/details/17354461
5) 分支限界算法
回溯算法是深度優先,那么分支限界法就是廣度優先的一個經典的例子。回溯法一般來說是遍歷整個解空間,獲取問題的所有解,而分支限界法則是獲取一個解(一般來說要獲取最優解)。
具體的詳細解析請參見下面的文章:
http://blog.csdn.net/changyuanchn/article/details/17102037
分治法
- 基本思想
- 將一個問題,分解為多個子問題,遞歸的去解決子問題,最終合並為問題的解
- 適用情況
- 問題分解為小問題后容易解決
- 問題可以分解為小問題,即最優子結構
- 分解后的小問題解可以合並為原問題的解
- 小問題之間互相獨立
- 實例
- 二分查找
- 快速排序
- 合並排序
- 大整數乘法
- 循環賽日程表
動態划分算法
- 基本思想
- 將問題分解為多個子問題(階段),按順序求解,前一個問題的解為后一個問題提供信息
- 適用情況
- 最優化原理:問題的最優解所包含的子問題的解也是最優的,即最優子結構
- 無后效性:某個狀態一旦確定,就不受以后決策的影響
- 有重疊子問題
- 說明
- 遞推關系是從次小的問題開始到較大問題的轉化,往往可以用遞歸來實現,可以利用之前產生的子問題的解來減少重復的計算
回溯法
- 基本思想
- 選優搜索法,走不通就退回重選,按照深度優先搜索的策略,從根節點出發,深度搜索解空間
- 步驟
- 確定解空間
- 確定節點的擴展搜索規則
- 深度優先方式搜索解空間,用剪枝法避免無效搜索
分支界限法
- 基本思想
- 與回溯法類似,也是在解空間里搜索解得算法,不同點是,回溯法尋找所有解,分支界限法搜索一個解或者最優解
- 分支:廣度優先策略或者最小耗費(最大效益)優先
- 分支搜索方式:FIFO、LIFO、優先隊列式、分支界限搜索算法
貪心算法
- 基本思想
- 不從總體最優考慮,僅考慮局部最優解,問題必須具備后無效性
- 步驟
- 將問題分解為多個子問題
- 得到問題的局部最優解
- 合並子問題的局部最優解
- 適用情況
- 局部最優策略能導致全局最優解
- 子問題后無效性