深度優先搜尋演算法
(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...