深度優先搜索和廣度優先搜索


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

一、深度優先搜索(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)來實現,整個過程可以想象成一個倒立的樹形:
  1. 把根節點壓入棧中。
  2. 每次從棧中彈出一個元素,搜索所有在它下一級的元素,把這些元素壓入棧中。並把這個元素記為它下一級元素的前驅。
  3. 找到所要找的元素時結束程序。
  4. 如果遍歷整個樹還沒有找到,結束程序。
  廣度優先搜索使用隊列(queue)來實現,整個過程也可以看做一個倒立的樹形:
  1. 把根節點放到隊列的末尾。
  2. 每次從隊列的頭部取出一個元素,查看這個元素所有的下一級元素,把它們放到隊列的末尾。並把這個元素記為它下一級元素的前驅。
  3. 找到所要找的元素時結束程序。
  4. 如果遍歷整個樹還沒有找到,結束程序。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM