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

2022-03-05 01:43:03 字數 989 閱讀 5066

深度優先搜尋和廣度優先搜尋都是圖的遍歷演算法。

深度優先搜尋(dfs),顧名思義,在進行遍歷或者說搜尋的時候,選擇乙個沒有被搜過的結點(一般選擇頂點),按照深度優先,一直往該結點的後續路徑結點進行訪問,直到該路徑的最後乙個結點,然後再從未被訪問的鄰結點進行深度優先搜尋,重複以上過程,直至所有點都被訪問,遍歷結束。

一般步驟:

可以看出,深度優先演算法使用遞迴即可實現。

下面以無向圖為例,進行深度優先搜尋遍歷:

遍歷過程:

所以遍歷結果是:a→c→b→d→f→g→e。

下面以有向圖為例,進行深度優先遍歷:

遍歷過程:

所以遍歷結果為:a→b→c→e→d→f→g。

廣度優先搜尋(bfs)是圖的另一種遍歷方式,與dfs相對,是以廣度優先進行搜尋。簡言之就是先訪問圖的頂點,然後廣度優先訪問其鄰接點,然後再依次進行被訪問點的鄰接點,一層一層訪問,直至訪問完所有點,遍歷結束。

下面是無向圖的廣度優先搜尋過程:

所以遍歷結果為:a→c→d→f→b→g→e。

下面是有向圖的廣度優先搜尋過程:

所以遍歷結果為:a→b→c→e→f→d→g。

深度優先搜尋用棧(stack)來實現,整個過程可以想象成乙個倒立的樹形:

把根節點壓入棧中。

每次從棧中彈出乙個元素,搜尋所有在它下一級的元素,把這些元素壓入棧中。並把這個元素記為它下一級元素的前驅。

找到所要找的元素時結束程式。

如果遍歷整個樹還沒有找到,結束程式。

廣度優先搜尋使用佇列(queue)來實現,整個過程也可以看做乙個倒立的樹形:

把根節點放到佇列的末尾。

每次從佇列的頭部取出乙個元素,檢視這個元素所有的下一級元素,把它們放到佇列的末尾。並把這個元素記為它下一級元素的前驅。

找到所要找的元素時結束程式。

如果遍歷整個樹還沒有找到,結束程式。

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

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

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

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

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

定義 圖 graph 是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為 g v,e 其中,g表示乙個圖,v是圖g中頂點的集合,e是圖g中邊的集合.簡單點的說 圖由節點和邊組成。乙個節點可能與眾多節點直接相連,這些節點被稱為鄰居。如二叉樹就為乙個簡單的圖 廣度優先搜尋演算法 breadth f...