棧和深度優先搜尋(DFS)

2021-08-28 02:50:25 字數 512 閱讀 9777

如上圖:

使用 dfs 找出從根結點 a 到目標結點 g 的路徑

步驟如下:

1:從根節點a開始,選擇節點b的路徑,繼續深入,直到e,無法更進一步深入,此時棧內容為abe

依次退棧eb

2:回溯到a節點,選擇第二條路徑c入棧,e入棧,但e已被訪問過,彈出e,回溯到c節點;選擇另一條路徑

f入棧,g入棧。此時我們找到了g。此時棧內容(路徑)為acfg

總的來說,在我們到達最深的結點之後,我們只會回溯並嘗試另一條路徑。

注意:在 dfs 中找到的第一條路徑並不總是最短的路徑。例如,在上面的例子中,我們成功找出了路徑 a-> c-> f-> g 並停止了 dfs。但這不是從 a 到 g 的最短路徑。

結點的處理順序是完全相反的順序,就像它們被新增到棧中一樣,它是後進先出(lifo)。這就是我們在 dfs 中使用棧的原因。

深度優先搜尋DFS

作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...

深度優先搜尋 DFS

深度優先搜尋 縮寫dfs 有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v 0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。你可以跳過第二節先看第三節,還是引用上篇文章的樣例...

深度優先搜尋(dfs)

深度優先搜尋的一般步驟 1 從頂點v出發,訪問v。2 找出剛才訪問過的頂點的第乙個未被訪問的鄰接點,訪問該頂點。以該頂點為新頂點,重複此步驟,直到剛訪問的頂點沒有沒有未被訪問過的鄰接點為止。3 返回前乙個訪問過的仍有未被訪問過的鄰接點的頂點,找出該頂點的下乙個未被訪問過的鄰接點,訪問該頂點。4 重複...