演算法 深度優先和廣度優先

2021-10-01 02:14:14 字數 2720 閱讀 1846

深度優先搜尋屬於圖演算法的一種,是乙個針對圖和樹的遍歷演算法,英文縮寫為dfs(depth first search)。深度優先搜尋利用深度優先搜尋演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。一般用堆資料結構來輔助實現dfs演算法。

文字描述過程:廣度優先搜尋在進一步遍歷圖中頂點之前,先訪問當前頂點的所有鄰接結點。

a .首先選擇乙個頂點作為起始結點,並將其染成灰色,其餘結點為白色。

b. 將起始結點放入佇列中。

c. 從佇列首部選出乙個頂點,並找出所有與之鄰接的結點,將找到的鄰接結點放入佇列尾部,將已訪問過結點塗成黑色,沒訪問過的結點是白色。如果頂點的顏色是灰色,表示已經發現並且放入了佇列,如果頂點的顏色是白色,表示還沒有發現

d. 按照同樣的方法處理佇列中的下乙個結點。 基本就是出隊的頂點變成黑色,在佇列裡的是灰色,還沒入隊的是白色。

其過程簡要來說是沿著樹的深度遍歷樹的節點,對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。沒次選擇乙個未被發現的節點作為源節點並重複以上過程,整個程序反覆進行直到所有節點都被訪問為止

對於上圖的樹而言,dfs方法首先從根節點1開始,其搜尋節點順序是1,2,3,4,5,6,7,8假定左分枝和右分枝中優先選擇左分枝。訪問順序如下:

廣度優先搜尋/寬度優先搜尋,縮寫bfs,是連通圖的一種遍歷演算法這一演算法也是很多重要的圖的演算法的原型。dijkstra單源最短路徑演算法和prim最小生成樹演算法都採用了和寬度優先搜尋類似的思想。

文字描述過程:深度優先搜尋在搜尋過程中訪問某個頂點後,需要遞迴地訪問此頂點的所有未訪問過的相鄰頂點。 初始條件下所有節點為白色,選擇乙個作為起始頂點,按照如下步驟遍歷:

a. 選擇起始頂點塗成灰色,表示還未訪問

b. 從該頂點的鄰接頂點中選擇乙個,繼續這個過程(即再尋找鄰接結點的鄰接結點),一直深入下去,直到乙個頂點沒有鄰接結點了,塗黑它,表示訪問過了

c. 回溯到這個塗黑頂點的上一層頂點,再找這個上一層頂點的其餘鄰接結點,繼續如上操作,如果所有鄰接結點往下都訪問過了,就把自己塗黑,再回溯到更上一層。

d. 上一層繼續做如上操作,知道所有頂點都訪問過。

屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜尋整張圖,直到找到結果為止。基本過程,bfs是從根節點開始,沿著樹(圖)的寬度遍歷樹(圖)的節點。如果所有節點均被訪問,則演算法中止。一般用佇列資料結構來輔助實現bfs演算法。

對於上圖的樹而言,從1到7的最短路徑用bfs求最短路徑,首先從根節點1開始訪問順序如下,每走一步記錄步數,最短路徑為1-》4-》7:

深度優先搜尋是每次從中彈出乙個元素,搜尋所有在它下一級的元素,把這些元素壓入棧中。並把這個元素記為它下一級元素的前驅,找到所要找的元素時結束程式。

從乙個頂點v出發,選擇鄰接於v的尚未達到的頂點u,如果這樣的u不存在,則搜尋終止。如果u存在,那麼從u又開始乙個新的dfs,也就是遞迴。

廣度優先搜尋是每次從

佇列的頭部取出乙個元素,檢視這個元素所有的下一級元素,把它們放到佇列的末尾。並把這個元素記為它下一級元素的前驅,找到所要找的元素時結束程式。

廣度優先的搜尋方式就是從乙個頂點v出發,先搜尋所有鄰接於頂點v的頂點集合,這算一回搜尋,第二回搜尋以鄰接於頂點v的集合點出發,開始搜尋所有鄰接於這些頂點的鄰接點。

注:在談論兩者的適用情況可以通過一下方面**

1: 空間複雜度:廣優的話,佔記憶體多,能找到最優解,必須遍歷所有分枝. 廣優的乙個應用就是迪科斯徹單元最短路徑演算法.深優的話,佔記憶體少,能找到最優解(一定條件下),但能很快找到接近解(優點),可能不必遍歷所有分枝(也就是速度快), 深優的乙個應用就是連連看遊戲.

2: 時間複雜度:最差情形下,bfs必須查詢所有到可能節點的所有路徑。

3:完全性:廣度優先搜尋演算法具有完全性。這意指無論圖形的種類如何,只要目標存在,則bfs一定會找到。然而,若目標不存在,且圖為無限大,則bfs將不收斂(不會結束)。

4:最佳解:若所有邊的長度相等,廣度優先搜尋演算法是最佳解——亦即它找到的第乙個解,距離根節點的邊數目一定最少;但對一般的圖來說,bfs並不一定回傳最佳解。這是因為當圖形為加權圖(亦即各邊長度不同)時,bfs仍然回傳從根節點開始,經過邊數目最少的解;而這個解距離根節點的距離不一定最短。這個問題可以使用考慮各邊權值,bfs的改良演算法成本一致搜尋法來解決。然而,若非加權圖形,則所有邊的長度相等,bfs就能找到最近的最佳解。

深度優先演算法和廣度優先演算法

圖形的深度優先搜尋法 void dfs int current 主程式 建立圖形後,將遍歷內容印出.void main 邊線陣列 int i for i 1 i 8 i creategraph node,20 建立圖形 printf 圖形的鄰接鍊錶內容 n for i 1 i 8 i printf ...

演算法 廣度優先演算法和深度優先演算法

廣度 bfs 和深度 dfs 優先演算法這倆個演算法是圖論裡面非常重要的兩個遍歷的方法。下面乙個例子迷宮計算,如下圖 解釋 所謂廣度,就是一層一層的,向下遍歷,層層堵截,看下面這幅圖,我們如果要是廣度優先遍歷的話,我們的結果是v1 v2 v3 v4 v5 v6 v7 v8。廣度優先搜尋的思想 訪問頂...

深度優先和廣度優先

在爬蟲系統中,待抓取url佇列是很重要的一部分,待抓取url佇列中的url以什麼樣的順序排隊列也是乙個很重要的問題,因為這涉及到先抓取哪個頁面,後抓取哪個頁面。而決定這些url排列順序的方法,叫做抓取策略。下面是常用的兩種策略 深度優先 廣度優先 注 scrapy預設採用的是深度優先演算法 這裡是深...