五類常見算法小記 (遞歸與分治,動態規划,貪心,回溯,分支界限法)


近日復習了一些算法知識,小記於此

  • 遞歸與分治法

直接或間接地調用自身的算法稱為遞歸算法。 遞歸是算法設計與分析中經常使用的一種技術,描寫敘述簡單且易於理解。

分治法的設計思想是將一個規模為n難以解決的問題分解為k個規模較小的子問題,這些子問題 相互獨立與原問題同樣
遞歸地解這些子問題,然后將各子問題的解合並得到原問題的解。

典型樣例:Fibonacci數列,階乘,Hanoi塔; 二分法搜索、高速排序、合並排序。

  • 動態規划法

 

動態規划過程是:依據當前(階段)狀態,採取對應的決策,引起狀態的轉移。例如以下圖,一個決策序列就是在變化的狀態中產生出來的,這樣的多階段最優化決策解決這個問題的過程就稱為動態規划。


 初始狀態→│決策1│→│決策2│→…→│決策n│→結束狀態

                      圖1 動態規划決策過程示意圖


動態規划算法與分治法類似,其思想也是將待求解問題分解成若干個子問題(一般每一個問題相應一個階段), 按順序求解子階段,前一子問題的解,為后一子問題的求解提供了實用的信息。在求解任一子問題時,列出各種可能的局部解,通過決策保留那些有可能達到最優的局部解,丟棄其它局部解。依次解決各子問題,最后一個子問題就是初始問題的解。

    因為動態規划解決的問題多數有重疊子問題這個特點,為降低反復計算,對每個子問題僅僅解一次,將其不同階段的不同狀態保存在一個二維數組中。

    與分治法最大的區別是:適合於用動態規划法求解的問題,經分解后得到的子問題往往不是互相獨立的(即下一個子階段的求解是建立在上一個子階段的解的基礎上,進行進一步的求解)

典型樣例:最長公共子序列; 最大連續子序列和( 最大m子段和)。


  • 貪心算法

貪心算法在策略的運行過程中,總是做出對當前看來是最好的選擇。也就是說貪心算法並不從整理最優上進行考慮,它所做出的選擇僅僅是在某種意義上的局部最優選擇。

貪心算法不能保證找到的解是最優解,但在某些情況下能夠是最優解的近似解,甚至是最優解。

典型樣例:哈夫曼編碼;單源最短路徑(Dijkstra算法);最小生成樹(Prim和Kruskal算法)


  • 回溯法 (DFS搜索解空間)

回溯法是以深度優先方式搜索問題解的算法,它適用於組合數較大的問題,能系統地搜索到一個問題的全部解惑任一解。
回溯法解題通常包括3個步驟:①針對所給的問題,定義問題的解空間;  ②確定易於搜索的解空間的結構; ③ 以DFS搜索解空間,並在搜索過程中用剪枝函數(約束條件)避免無效搜索。

解空間樹
①子集樹:當所給問題是從n個元素的結合S中找出滿足某種性質的子集時,對應的解空間樹稱為子集樹。比如n個物品的0-1背包問題。這類子集樹通常有2^n個葉節點,其節點總個數為為2^(n+1)-1。遍歷子集樹的不論什么算法均需O(2^n)的計算時間
②排列樹:當所給問題是確定n個元素滿足某種性質的排列時,對應的解空間樹成為排列樹。比如旅行售貨員問題。排列樹通常有n!個葉節點,因此遍歷排列樹須要O(n!)的計算時間。

搜索實現能夠遞歸,也能夠用樹的非遞歸深度優先遍歷算法來實現(用到 棧Stack)。

典型樣例:八皇后(找出全部的解), N 皇后

  • 分支界限法(BFS搜索解空間)

分支界限法的求解目標是找出滿足約束條件的一個解,或是在滿足約束條件的解中找出使某一目標函數值達到極大或極小的解,即在某種意義下的最優解。(分支界限法與回溯法求解目標不同)

分支界限法以廣度優先或以最小耗費(最大收益)優先的方式搜索解空間。所謂“分支”就是在擴展節點處,先生成其全部兒子節點(分支),然后在從當前的活結點表中選擇下一個擴展節點,繼續搜索。過程中能夠用約束條件,進行剪枝。
常見的擴展節點的常見方式: 先進先出FIFO隊列 優先隊列分支界限法

典型樣例:單源最短路徑



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM