分治法是基於多項分支遞歸的一種很重要的算法範式。字面上的解釋是「分而治之」,就是把一個複雜的問題分紅兩個或更多的相同或類似的子問題,直到最後子問題能夠簡單的直接求解,原問題的解即子問題的解的合併。算法
例子:快排、歸併排序、MapReduce數組
貪心算法就是在每一步的選擇中都按照當前最優的選擇,從而但願最終結果獲得最優解。貪心算法在有最優子結構的問題中尤其有效。最優子結構的意思是局部最優解能決定全局最優解。簡單地說,問題可以分解成子問題來解決,子問題的最優解能遞推到最終問題的最優解。
貪心算法與動態規劃的不一樣在於它對每一個子問題的解決方案都作出選擇,不能回退。動態規劃則會保存之前的運算結果,並根據之前的結果對當前進行選擇,有回退功能。數據結構
例子:最小生成樹、哈夫曼編碼函數
動態規劃經過把原問題分解爲相對簡單的子問題的方式求解複雜問題的方法。經常適用於有重疊子問題和最優子結構性質的問題。
若要解一個給定問題,咱們須要解其不一樣部分(即子問題),再根據子問題的解以得出原問題的解。一般許多子問題很是類似,爲此動態規劃法試圖僅僅解決每一個子問題一次,從而減小計算量:一旦某個給定子問題的解已經算出,則將其記憶化存儲,以便下次須要同一個子問題解之時直接查表。這種作法在重複子問題的數目關於輸入的規模呈指數增加時特別有用。優化
遞歸+記憶=遞推
適用狀況:編碼
例子:揹包問題人工智能
回溯法(backtracking) 設計
回溯法採用試錯的思想,它嘗試分步的去解決一個問題。在分步解決問題的過程當中,當它經過嘗試發現現有的分步答案不能獲得有效的正確的解答的時候,它將取消上一步甚至是上幾步的計算,再經過其它的可能的分步解答再次嘗試尋找問題的答案。回溯法一般用最簡單的遞歸方法來實現,在反覆重複上述的步驟後可能出現兩種狀況:排序
在最壞的狀況下,回溯法會致使一次複雜度爲指數時間的計算。遞歸
例子:八皇后問題
與貪婪算法同樣,這種方法也是用來爲組合優化問題設計求解算法的,所不一樣的是它在問題的整個可能解空間搜索,所設計出來的算法雖其時間複雜度比貪婪算法高,但它的優勢是與窮舉法相似,都能保證求出問題的最佳解,並且這種方法不是盲目的窮舉搜索,而是在搜索過程當中經過限界,能夠中途中止對某些不可能獲得最優解的子空間進一步搜索(相似於人工智能中的剪枝),故它比窮舉法效率更高。
例子: 數值隨機化算法 蒙特卡羅(Monte Carlo)算法 拉斯維加斯(Las Vegas)算法 舍伍德(Sherwood)算法