【算法】深度優先和廣度優先

本文只是總結的相關概念,僅供自己複習,嚴禁轉載,文末附有本文內容涉及的文章鏈接,請點開鏈接查看原文!

(一)深度優先

      深度優先搜索屬於圖算法的一種,是一個針對圖和樹的遍歷算法,英文縮寫爲DFS(Depth First Search)。深度優先搜索利用深度優先搜索算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。一般用堆數據結構來輔助實現DFS算法。

      文字描述過程:廣度優先搜索在進一步遍歷圖中頂點之前,先訪問當前頂點的所有鄰接結點。

      a .首先選擇一個頂點作爲起始結點,並將其染成灰色,其餘結點爲白色。

      b. 將起始結點放入隊列中。

      c. 從隊列首部選出一個頂點,並找出所有與之鄰接的結點,將找到的鄰接結點放入隊列尾部,將已訪問過結點塗成黑色,沒訪問過的結點是白色。如果頂點的顏色是灰色,表示已經發現並且放入了隊列,如果頂點的顏色是白色,表示還沒有發現

      d. 按照同樣的方法處理隊列中的下一個結點。 基本就是出隊的頂點變成黑色,在隊列裏的是灰色,還沒入隊的是白色。

      其過程簡要來說是沿着樹的深度遍歷樹的節點,對每一個可能的分支路徑深入到不能再深入爲止,而且每個節點只能訪問一次。沒次選擇一個未被發現的節點作爲源節點並重復以上過程,整個進程反覆進行直到所有節點都被訪問爲止

 

                                          

    對於上圖的樹而言,DFS方法首先從根節點1開始,其搜索節點順序是1,2,3,4,5,6,7,8假定左分枝和右分枝中優先選擇左分枝。訪問順序如下:

(二)廣度優先

      廣度優先搜索/寬度優先搜索,縮寫BFS,是連通圖的一種遍歷算法這一算法也是很多重要的圖的算法的原型。Dijkstra單源最短路徑算法和Prim最小生成樹算法都採用了和寬度優先搜索類似的思想。

     文字描述過程:深度優先搜索在搜索過程中訪問某個頂點後,需要遞歸地訪問此頂點的所有未訪問過的相鄰頂點。 初始條件下所有節點爲白色,選擇一個作爲起始頂點,按照如下步驟遍歷:

      a. 選擇起始頂點塗成灰色,表示還未訪問

      b. 從該頂點的鄰接頂點中選擇一個,繼續這個過程(即再尋找鄰接結點的鄰接結點),一直深入下去,直到一個頂點沒有鄰接結點了,塗黑它,表示訪問過了

      c. 回溯到這個塗黑頂點的上一層頂點,再找這個上一層頂點的其餘鄰接結點,繼續如上操作,如果所有鄰接結點往下都訪問過了,就把自己塗黑,再回溯到更上一層。

     d. 上一層繼續做如上操作,知道所有頂點都訪問過。

      屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜索整張圖,直到找到結果爲止。基本過程,BFS是從根節點開始,沿着樹(圖)的寬度遍歷樹(圖)的節點。如果所有節點均被訪問,則算法中止。一般用隊列數據結構來輔助實現BFS算法。

                                            

     對於上圖的樹而言,從1到7的最短路徑用BFS求最短路徑,首先從根節點1開始訪問順序如下,每走一步記錄步數,最短路徑爲1-》4-》7:

(三)區別

      深度優先搜索是每次從中彈出一個元素,搜索所有在它下一級的元素,把這些元素壓入棧中。並把這個元素記爲它下一級元素的前驅,找到所要找的元素時結束程序。

      從一個頂點v出發,選擇鄰接於v的尚未達到的頂點u,如果這樣的u不存在,則搜索終止。如果u存在,那麼從u又開始一個新的DFS,也就是遞歸。

     廣度優先搜索是每次從隊列的頭部取出一個元素,查看這個元素所有的下一級元素,把它們放到隊列的末尾。並把這個元素記爲它下一級元素的前驅,找到所要找的元素時結束程序。

     廣度優先的搜索方式就是從一個頂點v出發,先搜索所有鄰接於頂點v的頂點集合,這算一回搜索,第二回搜索以鄰接於頂點v的集合點出發,開始搜索所有鄰接於這些頂點的鄰接點。

注:在談論兩者的適用情況可以通過一下方面探討

      1: 空間複雜度:廣優的話,佔內存多,能找到最優解,必須遍歷所有分枝. 廣優的一個應用就是迪科斯徹單元最短路徑算法.深優的話,佔內存少,能找到最優解(一定條件下),但能很快找到接近解(優點),可能不必遍歷所有分枝(也就是速度快), 深優的一個應用就是連連看遊戲.

     2: 時間複雜度:最差情形下,BFS必須查找所有到可能節點的所有路徑。

     3:完全性:廣度優先搜索算法具有完全性。這意指無論圖形的種類如何,只要目標存在,則BFS一定會找到。然而,若目標不存在,且圖爲無限大,則BFS將不收斂(不會結束)。

    4:最佳解:若所有邊的長度相等,廣度優先搜索算法是最佳解——亦即它找到的第一個解,距離根節點的邊數目一定最少;但對一般的圖來說,BFS並不一定回傳最佳解。這是因爲當圖形爲加權圖(亦即各邊長度不同)時,BFS仍然回傳從根節點開始,經過邊數目最少的解;而這個解距離根節點的距離不一定最短。這個問題可以使用考慮各邊權值,BFS的改良算法成本一致搜索法來解決。然而,若非加權圖形,則所有邊的長度相等,BFS就能找到最近的最佳解。

參考文章:

https://www.jianshu.com/p/bff70b786bb6

https://zhidao.baidu.com/question/468967354.html

https://blog.csdn.net/Jeff_Winger/article/details/80911480

https://www.jianshu.com/p/b086986969e6

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章