基本演算法——深度優先搜尋(DFS)和廣度優先搜尋(BFS)
深度優先搜尋和廣度優先搜尋,都是圖形搜尋演算法,它兩相似,又卻不同,在應用上也被用到不同的地方。這裡拿一起討論,方便比較。
一、深度優先搜尋
深度優先搜尋屬於圖演算法的一種,是一個針對圖和樹的遍歷演算法,英文縮寫為DFS即Depth First Search。深度優先搜尋是圖論中的經典演算法,利用深度優先搜尋演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。一般用堆資料結構來輔助實現DFS演算法。其過程簡要來說是對每一個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。
基本步奏
(1)對於下面的樹而言,DFS方法首先從根節點1開始,其搜尋節點順序是1,2,3,4,5,6,7,8(假定左分枝和右分枝中優先選擇左分枝)。
(2)從stack中訪問棧頂的點;
(3)找出與此點鄰接的且尚未遍歷的點,進行標記,然後放入stack中,依次進行;
(4)如果此點沒有尚未遍歷的鄰接點,則將此點從stack中彈出,再按照(3)依次進行;
(5)直到遍歷完整個樹,stack裡的元素都將彈出,最後棧為空,DFS遍歷完成。
二、廣度優先搜尋
廣度優先搜尋(也稱寬度優先搜尋,縮寫BFS,以下采用廣度來描述)是連通圖的一種遍歷演算法這一演算法也是很多重要的圖的演算法的原型。Dijkstra單源最短路徑演算法和Prim最小生成樹演算法都採用了和寬度優先搜尋類似的思想。其別名又叫BFS,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜尋整張圖,直到找到結果為止。基本過程,BFS是從根節點開始,沿著樹(圖)的寬度遍歷樹(圖)的節點。如果所有節點均被訪問,則演算法中止。一般用佇列資料結構來輔助實現BFS演算法。
基本步奏
(1)給出一連通圖,如圖,初始化全是白色(未訪問);
(2)搜尋起點V1(灰色);
(3)已搜尋V1(黑色),即將搜尋V2,V3,V4(標灰);
(4)對V2,V3,V4重複以上操作;
(5)直到終點V7被染灰,終止;
(6)最短路徑為V1,V4,V7.
作者:安然若知
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4830/viewspace-2804526/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- bfs廣度優先搜尋
- DFS(深度優先搜尋)
- python 二叉樹深度優先搜尋和廣度優先搜尋Python二叉樹
- 圖的廣度優先搜尋和深度優先搜尋Python實現Python
- 【演算法】深度優先搜尋(DFS)演算法
- 【演算法】廣度/寬度優先搜尋(BFS)演算法
- 深度和廣度優先搜尋演算法演算法
- 圖的遍歷:深度優先搜尋與廣度優先搜尋
- 演算法競賽——BFS廣度優先搜尋演算法
- 廣度優先搜尋(BFS)思路及演算法分析演算法
- 深度優先搜尋演算法(DFS)講解演算法
- 深度優先搜尋演算法-dfs講解演算法
- ybtoj:廣度優先搜尋
- 深度優先搜尋
- LeetCode演算法練習——深度優先搜尋 DFSLeetCode演算法
- 深度優先搜尋(DFS)思路及演算法分析演算法
- 啟發式搜尋的方式(深度優先,廣度優先)和 搜尋方法(Dijkstra‘s演算法,代價一致搜尋,貪心搜尋 ,A星搜尋)演算法
- 深度DFS 和 廣度BFS搜尋演算法學習演算法
- c++ 廣度優先搜尋(寬搜)C++
- ybtoj:深度優先搜尋
- 演算法筆記(廣度優先搜尋)演算法筆記
- 深度優先搜尋 (Depth First Search 簡稱:DFS)
- 0演算法基礎學演算法 搜尋篇第二講 BFS廣度優先搜尋的思想演算法
- js版本的(廣、深)度優先搜尋JS
- 【程式碼隨想錄】廣度優先搜尋
- 演算法(三):圖解廣度優先搜尋演算法演算法圖解
- 學習資料結構 - 深度優先搜尋 DFS 記錄資料結構
- leetcode 刷題之深度優先搜尋LeetCode
- 0基礎學演算法 搜尋篇第一講 深度優先搜尋演算法
- dfs深度優先搜尋解決迷宮類問題(遍歷)
- 「Golang成長之路」迷宮的廣度優先搜尋Golang
- 【知識點】深度優先搜尋 Depth First Search
- golang學習筆記——迷宮的廣度優先搜尋Golang筆記
- POJ1915,雙向寬度優先搜尋
- 從1到n的全排列(深度優先搜尋)
- 遞迴——深度優先搜尋(DFS)——以滑雪問題為例(自頂而下)遞迴
- 深度優先與廣度優先
- 十、深度優先 && 廣度優先