廣度(bfs)和深度(dfs)優先演算法這倆個演算法是圖論裡面非常重要的兩個遍歷的方法。
下面乙個例子迷宮計算,如下圖
解釋:
所謂廣度,就是一層一層的,向下遍歷,層層堵截,看下面這幅圖,我們如果要是廣度優先遍歷的話,我們的結果是v1 v2 v3 v4 v5 v6 v7 v8。
廣度優先搜尋的思想:
① 訪問頂點vi ;
② 訪問vi 的所有未被訪問的鄰接點w1 ,w2 , …wk ;
③ 依次從這些鄰接點(在步驟②中訪問的頂點)出發,訪問它們的所有未被訪問的鄰接點; 依此類推,直到圖中所有訪問過的頂點的鄰接點都被訪問;
說明:為實現③,需要儲存在步驟②中訪問的頂點,而且訪問這些頂點的鄰接點的順序為:先儲存的頂點,其鄰接點先被訪問。 這裡我們就想到了用標準模板庫中的queue佇列來實現這種先進現出的服務。
步驟:1.將v1加入佇列,取出v1,並標記為true(即已經訪問),將其鄰接點加進入佇列,則區別:2.取出v2,並標記為true(即已經訪問),將其未訪問過的鄰接點加進入佇列,則
3.取出v3,並標記為true(即已經訪問),將其未訪問過的鄰接點加進入佇列,則
4.取出v4,並標記為true(即已經訪問),將其未訪問過的鄰接點加進入佇列,則
5.取出v5,並標記為true(即已經訪問),因為其鄰接點已經加入佇列,則
6.取出v6,並標記為true(即已經訪問),將其未訪問過的鄰接點加進入佇列,則
7.取出v7,並標記為true(即已經訪問),將其未訪問過的鄰接點加進入佇列,則
8.取出v8,並標記為true(即已經訪問),將其未訪問過的鄰接點加進入佇列,則
深度優先遍歷:對每乙個可能的分支路徑深入到不能再深入為止,而且每個結點只能訪問一次。不全部保留結點,占用空間少;有回溯操作(即有入棧、出棧操作),執行速度慢。
廣度優先遍歷:又叫層次遍歷,從上往下對每一層依次訪問,在每一層中,從左往右(也可以從右往左)訪問結點,訪問完一層就進入下一層,直到沒有結點可以訪問為止。保留全部結點,占用空間大; 無回溯操作(即無入棧、出棧操作),執行速度快。
時間複雜度:
深度優先
陣列表示:查詢所有頂點的所有鄰接點所需時間為o(n2),n為頂點數,演算法時間複雜度為o(n2)
廣度優先
陣列表示:查詢每個頂點的鄰接點所需時間為o(n2),n為頂點數,演算法的時間複雜度為o(n2)
深度優先演算法和廣度優先演算法
圖形的深度優先搜尋法 void dfs int current 主程式 建立圖形後,將遍歷內容印出.void main 邊線陣列 int i for i 1 i 8 i creategraph node,20 建立圖形 printf 圖形的鄰接鍊錶內容 n for i 1 i 8 i printf ...
演算法 深度優先和廣度優先
深度優先搜尋屬於圖演算法的一種,是乙個針對圖和樹的遍歷演算法,英文縮寫為dfs depth first search 深度優先搜尋利用深度優先搜尋演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。一般用堆資料結構來輔助實現dfs演算法。文字描述...
廣度優先演算法,深度優先演算法和DijKstra演算法
我們經常會碰到最短路徑問題,而最短路徑問題的解決方法多種多樣,廣度優先搜尋 bfs 深度優先搜尋 dfs 和dijkstra演算法貌似都能解決這個問題,這裡就簡單介紹一下這些演算法,分析一下它們的適用範圍。一 原理剖析 1 廣度優先搜尋 bfs 廣度優先搜尋依賴的是佇列解決問題。佇列中的每乙個節點需...