演算法之深度優先搜尋和廣度優先搜尋

2021-07-12 02:36:31 字數 2734 閱讀 2884

深度優先搜尋演算法

(depth-first-search),是搜尋演算法的一種。

它沿著 樹的深度 遍歷樹的節點,盡可能深的 搜尋樹的分支。

當節點v的所有邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。

這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中乙個作為源節點並重複以上過程,整個程序反覆進行直到所有節點都被訪問為止。

dfs屬於盲目搜尋。

深度優先搜尋是圖論中的經典演算法,利用深度優先搜尋演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。一般用堆資料結構來輔助實現dfs演算法。

深度優先遍歷圖演算法步驟:

1. 訪問頂點v;

2. 依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷;直至圖中和v有路徑相通的頂點都被訪問;

3. 若此時圖中尚有頂點未被訪問,則從乙個未被訪問的頂點出發,重新進行深度優先遍歷,直到圖中所有頂點均被訪問過為止。

上述描述可能比較抽象,舉個例項:

dfs 在訪問圖中某一起始頂點 v 後,由 v 出發,訪問它的任一鄰接頂點 w1;再從 w1 出發,訪問與 w1鄰 接但還沒有訪問過的頂點 w2;然後再從 w2 出發,進行類似的訪問,… 如此進行下去,直至到達所有的鄰接頂點都被訪問過的頂點 u 為止。

接著,退回一步,退到前一次剛訪問過的頂點,看是否還有其它沒有被訪問的鄰接頂點。如果有,則訪問此頂點,之後再從此頂點出發,進行與前述類似的訪問;如果沒有,就再退回一步進行搜尋。重複上述過程,直到連通圖中所有頂點都被訪問過為止。

下面以"無向圖"為例,來對深度優先搜尋進行演示。

對上面的圖g1進行深度優先遍歷,從頂點a開始。

第1步:訪問a。 

第2步:訪問(a的鄰接點)c。 

在第1步訪問a之後,接下來應該訪問的是a的鄰接點,即"c,d,f"中的乙個。但在本文的實現中,頂點abcdefg是按照順序儲存,c在"d和f"的前面,因此,先訪問c。 

第3步:訪問(c的鄰接點)b。 

在第2步訪問c之後,接下來應該訪問c的鄰接點,即"b和d"中乙個(a已經被訪問過,就不算在內)。而由於b在d之前,先訪問b。 

第4步:訪問(c的鄰接點)d。 

在第3步訪問了c的鄰接點b之後,b沒有未被訪問的鄰接點;因此,返回到訪問c的另乙個鄰接點d。 

第5步:訪問(a的鄰接點)f。 

前面已經訪問了a,並且訪問完了"a的鄰接點b的所有鄰接點(包括遞迴的鄰接點在內)";因此,此時返回到訪問a的另乙個鄰接點f。 

第6步:訪問(f的鄰接點)g。 

第7步:訪問(g的鄰接點)e。

因此訪問順序是:

下面以"有向圖"為例,來對深度優先搜尋進行演示。

第1步:訪問a。 

第2步:訪問b。 

在訪問了a之後,接下來應該訪問的是a的出邊的另乙個頂點,即頂點b。 

第3步:訪問c。 

在訪問了b之後,接下來應該訪問的是b的出邊的另乙個頂點,即頂點c,e,f。在本文實現的圖中,頂點abcdefg按照順序儲存,因此先訪問c。 

第4步:訪問e。 

接下來訪問c的出邊的另乙個頂點,即頂點e。 

第5步:訪問d。 

接下來訪問e的出邊的另乙個頂點,即頂點b,d。頂點b已經被訪問過,因此訪問頂點d。 

第6步:訪問f。 

接下應該回溯"訪問a的出邊的另乙個頂點f"。 

第7步:訪問g。

因此訪問順序是:a -> b -> c -> e -> d -> f -> g

下面介紹廣度優先搜尋

廣度優先搜尋演算法(breadth-first-search),是一種圖形搜尋演算法。

簡單的說,bfs是從根節點開始,沿著樹(圖)的寬度遍歷樹(圖)的節點。

如果所有節點均被訪問,則演算法中止。bfs同樣屬於盲目搜尋。一般用佇列資料結構來輔助實現bfs演算法。

演算法步驟:

1. 首先將根節點放入佇列中。

2. 從佇列中取出第乙個節點,並檢驗它是否為目標。

3. 若隊列為空,表示整張圖都檢查過了——亦即圖中沒有欲搜尋的目標。結束搜尋並回傳「找不到目標」。

4. 重複步驟2。

下面以"無向圖"為例,來對廣度優先搜尋進行演示。還是以上面的圖g1為例進行說明。

深度優先遍歷 遞迴 深度優先搜尋和廣度優先搜尋

對於搜尋來說,我們絕大多數情況下處理的都是叫 所謂的暴力搜尋 或者是說比較簡單樸素的搜尋,也就是說你在搜尋的時候沒有任何所謂的智慧型的情況在裡面考慮,很多情況下它做的一件事情就是把所有的結點全部遍歷一次,然後找到你要的結果。基於這樣的乙個資料結構,如果這個資料結構本身是沒有任何特點的,也就是說是乙個...

深度優先搜尋和廣度優先搜尋

深度優先的思想是先記住當前的起點,然後選定乙個方向一條道走到黑,若失敗則回到起點再選定另外乙個方向走到黑。廣度優先的思想是記住當前的起點,然後選定各個方向的相鄰點作為新的起點,再繼續。可以看出,深度優先和廣度優先都需要記住當前的起點,不同的是深度優先每次只需要記住乙個方向的相鄰點,廣度優先則要記住所...

廣度優先搜尋和深度優先搜尋

dbf深度優先搜尋,最經典的方法,可以使用遞迴來實現。結構體定義 typedef char vertextype typedef int edgetype define maxvex 100 define infinite 65535 typedef struct mgraph 測試函式如下 mgr...