【DFS】深度優先搜尋遞迴方式講解- IT閱讀 - ITREAD01.COM ...
文章推薦指數: 80 %
Depth First Search英文的縮寫,翻譯過來就是“深度優先搜尋”。
從名字上我們可以大概的看出,DFS主要是一種搜尋演算法,按照深度優先的方式. 深度優先搜尋 ...
【DFS】深度優先搜尋遞迴方式講解
首頁
最新
HTML
CSS
JavaScript
jQuery
Python3
Python2
Java
C
C++
Go
SQL
首頁
最新
Search
【DFS】深度優先搜尋遞迴方式講解
2019-01-31254
前言
記得第一次接觸到DFS還是在去年大概三四月份,當時也是在準備比賽的時候聽說DFS很重要(原諒我是個小白),然後就去Google了一波什麼叫做DFS,當時的我剛開始學習C++,還沒有學習資料結構,講道理當時我看懂了演算法原理,但是對於什麼圖呀,樹呀的還真是一竅不通。
後邊學習了資料結構後,對於DFS原理也是相當的瞭解(自我感覺),但從來沒有總結過,今天主要是進行DFS的演算法進行簡單的自我總結,一是準備比賽,二是也應該從現在開始正式的拿起資料結構了(原諒我花了半年時間搞web開發去了)。
———————————————-以上內容不重要(純屬我自己發牢騷)
初識DFS
什麼是DFS?DepthFirstSearch英文的縮寫,翻譯過來就是“深度優先搜尋”。
從名字上我們可以大概的看出,DFS主要是一種搜尋演算法,按照深度優先的方式
深度優先搜尋演算法(英語:Depth-First-Search,簡稱DFS)是一種用於遍歷或搜尋樹或圖的演算法。
沿著樹的深度遍歷樹的節點,儘可能深的搜尋樹的分支。
當節點v的所在邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。
這一過程一直進行到已發現從源節點可達的所有節點為止。
如果還存在未被發現的節點,則選擇其中一個作為源節點並重復以上過程,整個程序反覆進行直到所有節點都被訪問為止。
屬於盲目搜尋。
主要思想:不撞南牆不回頭。
深度優先遍歷的主要思想就是:首先以一個未被訪問過的頂點作為起始頂點,沿當前頂點的邊走到未訪問過的頂點;當沒有未訪問過的頂點時,則回到上一個頂點,繼續試探訪問別的頂點,直到所有的頂點都被訪問。
沿著某條路徑遍歷直到末端,然後回溯,再沿著另一條進行同樣的遍歷,直到所有的頂點都被訪問過為止。
【以上引用來自維基百科】
小結:
深度優先搜尋——類似於樹的先根遍歷,是樹的先根遍歷的推廣
簡述演算法過程
1、任選一頂點作始點v,訪問該頂點
2、沿深度方向,依次遍歷v的未訪問鄰接點——直到本次遍歷結束
3、一次遍歷完時,若有未訪問頂點:任選一個未訪問頂點作起始點,GOTO第二步
演算法演示
遞迴虛擬碼演示
DFS(dep,、、、)//dep代表目前DFS的深度
{
if(找到解||走不下去){
、、、//在此處進行相應的操作
return;
}
列舉下一種情況,DFS(dep+1,、、、)
}
遞迴虛擬碼演示(稍微詳細點,其實都是一樣的)
boolvisited[MAXNODE];//頂點的訪問標識陣列
voidDFSInit(GraphG){
for(i=0;i
如果沒有找到相應的結果狀態,那麼就回退一步(回溯),再進行下一步找路徑,再撞再回溯,一直到找到目標狀態或者所有情況都遍歷完,程式結束
DFS遞迴演算法框架
/*
該DFS框架以2D座標範圍為例,來體現DFS演算法的實現思想。
*/
#include
話不多說,我們進入實戰階段。
原題我記不清了,這邊就簡單的說下題意
【題目】在給定的一個二維陣列中找尋從起點(0,0)開始走,能到達哪些區域(真不記得題意了,大家自行腦補吧)
00110
10011
11000
10011
00100
我們假設上邊就是輸入資料(嘻嘻,將就一下),‘0’代表能夠走的,‘1’代表不能走的,可以理解為牆,同時只能在所給的地圖上走,也就是不能跳出去再調回來,求解區域
相信大家對於這個問題其實已經很明確了,其實就和“八連塊”問題是一個道理的
【分析】我們從起點開始走,一直沿著一條路走,一直走到最後走不動的時候,進行回溯,再找尋下一條路線,直到最後沒有路走,回到了起點位置(大家可以想想為什麼會回到起點位置)結束。
我們走過的地方其實就是題目的答案
原始碼
我建議先自己實現一波後再來看喲。
#include
延伸文章資訊
- 1【DFS】深度優先搜尋遞迴方式講解- IT閱讀 - ITREAD01.COM ...
Depth First Search英文的縮寫,翻譯過來就是“深度優先搜尋”。 從名字上我們可以大概的看出,DFS主要是一種搜尋演算法,按照深度優先的方式. 深度優先搜尋 ...
- 2[演算法] [C++ / Python] 深度優先搜尋Depth-First-Search - Part I
因為7 後面沒有節點了,所以回到4,再回到1,結果發現1 也沒了,因此,DFS 到此全部完畢。 程式碼實作- C++. void dfs ...
- 3DFS與BFS——理解簡單搜尋(中文虛擬碼+例題) | IT人
深度優先搜尋演算法(Depth First Search):一種用於遍歷或搜尋樹或圖的演算 ... 每個節點被訪問後被踹出,為了程式碼的簡潔易懂,使用了c++的stl。
- 4[演算法] 深度優先搜尋(Depth-first Search) - iT 邦幫忙
30天學演算法和資料結構系列第18 篇 ... 表示目前是否有使用此數字total = 0 #代表可行解總共有幾種def dfs(step, total, a, ... +i))==1: pri...
- 5圖的走訪— BFS, DFS(1). 之前有提到要怎麼建立一個圖 - Medium
以下的程式碼,使用的是C++。 主要在走訪有兩種方法:DFS(深度優先搜尋), BFS(廣度優先搜尋). 想必如果是一開始看到 ...