深度優先搜索和廣度優先搜索都是圖的遍歷算法。
一、深度優先搜索(Depth First Search)
1、介紹
深度優先搜索(DFS),顧名思義,在進行遍歷或者說搜索的時候,選擇一個沒有被搜過的結點(一般選擇頂點),按照深度優先,一直往該結點的后續路徑結點進行訪問,直到該路徑的最后一個結點,然后再從未被訪問的鄰結點進行深度優先搜索,重復以上過程,直至所有點都被訪問,遍歷結束。
一般步驟:
- (1)訪問頂點v;
- (2)依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷;直至圖中和v有路徑相通的頂點都被訪問;
- (3)若此時圖中尚有頂點未被訪問,則從一個未被訪問的頂點出發,重新進行深度優先遍歷,直到圖中所有頂點均被訪問過為止。
可以看出,深度優先算法使用遞歸即可實現。
2、無向圖的深度優先搜索
下面以無向圖為例,進行深度優先搜索遍歷:
遍歷過程:
所以遍歷結果是:A→C→B→D→F→G→E。
3、有向圖的深度優先搜索
下面以有向圖為例,進行深度優先遍歷:
遍歷過程:
所以遍歷結果為:A→B→C→E→D→F→G。
二、廣度優先搜索(Breadth First Search)
1、介紹
廣度優先搜索(BFS)是圖的另一種遍歷方式,與DFS相對,是以廣度優先進行搜索。簡言之就是先訪問圖的頂點,然后廣度優先訪問其鄰接點,然后再依次進行被訪問點的鄰接點,一層一層訪問,直至訪問完所有點,遍歷結束。
2、無向圖的廣度優先搜索
下面是無向圖的廣度優先搜索過程:
所以遍歷結果為:A→C→D→F→B→G→E。
3、有向圖的廣度優先搜索
下面是有向圖的廣度優先搜索過程:
所以遍歷結果為:A→B→C→E→F→D→G。
三、兩者實現方式對比
深度優先搜索用棧(stack)來實現,整個過程可以想象成一個倒立的樹形:
- 把根節點壓入棧中。
- 每次從棧中彈出一個元素,搜索所有在它下一級的元素,把這些元素壓入棧中。並把這個元素記為它下一級元素的前驅。
- 找到所要找的元素時結束程序。
- 如果遍歷整個樹還沒有找到,結束程序。
廣度優先搜索使用隊列(queue)來實現,整個過程也可以看做一個倒立的樹形:
- 把根節點放到隊列的末尾。
- 每次從隊列的頭部取出一個元素,查看這個元素所有的下一級元素,把它們放到隊列的末尾。並把這個元素記為它下一級元素的前驅。
- 找到所要找的元素時結束程序。
- 如果遍歷整個樹還沒有找到,結束程序。
