深度優先搜索算法(英語: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的簡單演示時間結束~ 希望對你有幫助。