【数据结构与算法】广度优先遍历(BFS) 深度优先遍历(DFS)
生活随笔
收集整理的這篇文章主要介紹了
【数据结构与算法】广度优先遍历(BFS) 深度优先遍历(DFS)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、 搜索算法
深度優先搜索和廣度優先搜索是最暴力的圖的搜索算法。算法的目標是,給定一張圖,一對初始和終止節點,找到兩節點之間的節點路徑。(代碼均是找到兩個節點之間的路徑)
廣度優先搜索是一層一層搜索,深度優先搜索是搜到底,不能走了在回溯。
無向圖
public class Graph { // 無向圖private int v; // 頂點的個數private LinkedList<Integer> adj[]; // 鄰接表public Graph(int v) {this.v = v;adj = new LinkedList[v];for (int i=0; i<v; ++i) {adj[i] = new LinkedList<>();}}public void addEdge(int s, int t) { // 無向圖一條邊存兩次adj[s].add(t);adj[t].add(s);} }二、廣度優先遍歷
一種“地毯式”層層推進的策略搜索
各變量說明
- visited數組 記錄已經被訪問的頂點 避免頂點被重復訪問
- queue表示已訪問但未深入的節點(當前邊界)
- prev數組訪問節點的前驅
實現思路 - 準備部分:visited清零,prev置-1。queue加入s節點,visited s 置true。
- 開始循環,queue不為空,則取出隊頭,遍歷隊頭的鄰接鏈表中的節點,如果節點沒訪問過,將visited中對應位置置true,判斷其是否為t,是則打印路徑,退出。否則將prev對應位置置為它的前驅。queue中加入它的鄰接鏈表中的節點。
復雜度分析
E 邊的個數 V頂點個數
廣度的時間復雜度為O(v+E)但是連通圖E一定大于V所以O(E)。空間復雜度主要是節點的消耗O(V)。
三 、深度優先遍歷
“走迷宮” 回溯算法
實線 遍歷 虛線 回退
各變量說明
- visited數組 記錄已經被訪問的頂點 避免頂點被重復訪問
- found表 示已經找到
- pre表示訪問節點的前驅。
具體思路
1. 準備數據和廣度類似只不過不需要隊列queue,而是需要一個found(全局變量,因為所有的遞歸函數都是靠它判斷是否停止的,不是全局的話,回溯時這個變量無法更新)變量標識:found變量置為false。
2. 進入遞歸 深度優先搜索。先判斷found變量,true則返回 在判斷 s==t,true則found=true,返回。在進入循環遍歷s的鄰接表,對鄰接表內的每一個節點調用深度優先搜索。
復雜度
圖算法的復雜度都跟 邊和節點的數量有關。深度優先搜索的時間復雜度
主要訪問的是邊,所以時間復雜度O(E)。空間復雜度為O(V)
四、思考題
如何找出社交網絡種某個用戶的三度好友關系?
廣度優先搜索中,如果后繼節點的好友關系是3,不把它放入隊列中。
深度優先搜索時,如果visited數組中是3則不再往下深入遞歸。
筆記整理來源: 王爭 數據結構與算法之美
總結
以上是生活随笔為你收集整理的【数据结构与算法】广度优先遍历(BFS) 深度优先遍历(DFS)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何提升软件开发效能?企业级业务架构思考
- 下一篇: postgresql9.4.4中文手册笔