DFS ( 深度優先/回溯算法 ) 一


    深度優先搜索算法英語:Depth-First-Search,簡稱DFS)是一種用於遍歷或搜索算法。 沿着樹的深度遍歷樹的節點,盡可能深的搜索樹的分支。當節點v的所在邊都己被探尋過或者在搜尋時結點不滿足條件,搜索將回溯到發現節點v的那條邊的起始節點。整個進程反復進行直到所有節點都被訪問為止。屬於盲目搜索,最糟糕的情況算法時間復雜度為O(!n)。(Wiki)

   DFS在搜索過程常常伴隨許多優化策略,增加剪枝函數,或者和動態規划結合。

   讓我們用一道看似簡單的例子理解DFS。 = =

 

/*
**  將一個整數n分為k個加數相加,不能重復。e.g. n=7 k=2 -> (1,6) (2,5) (3,4)  // (4,3)等為重復項
**  求有多少種分法,並打印每種分法
**  0<n<=200 1<k<=7
*/

#include <iostream> using namespace std; int sum = 0; int finalExp[8]; void numDivision(int num,int parts,int curr = 1,int level = 1) { if ( parts == 1 ){ //搜尋結點到達末尾的條件 sum++; //獲得一種分法 int s = 0; int i; for ( i = 1; i < level; i++ ){ s += finalExp[i]; cout << finalExp[i] << " + "; } cout << num << " = " << num+s << endl; return ; } for ( int i = curr; i <= num/parts; i++ ){ finalExp[level] = i; //儲存結果 numDivision(num-i,parts-1,i,level+1); //核心回溯遞歸 } } int main() { numDivision(7,3); cout << sum << endl; return 0; } // Achieve

 

    例子顯示的正是多數DFS通用的框架。

                int arr[]   // 解集

                dfs() {

                         if (){  //搜尋是否到達末尾

                              //解集操作

                          }

                        if(){     //或者為 for() , while()

                                dfs()  //判斷后回溯遞歸

                         }

               }

      難點在於分析問題時,如何獲取搜尋結點的終結條件,應怎樣改變遞歸的參數.....

      回溯算法如百科所言是一種用於遍歷或搜索樹的算法。我們可以將問題分解繪成樹狀結構。

      

     DFS的簡單演示時間結束~  希望對你有幫助。

 


免責聲明!

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



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