深度優先搜索算法(DFS)和廣度優先搜索算法(BFS)都是圖的搜索算法,放在一起研究比較容易發現他們的特點
一、深度優先搜索算法(DFS)
思想:前提是每個結點只能訪問一次,對每個分支深入到不能再深入爲止,再回退訪問另一個分支
- 可以用棧來實現DFS
- DFS可以判斷圖中是否有迴路。當前結點的下一步可以搜索到已經訪問過的結點,則說明有迴路
例:從結點1開始深搜
圖存儲在鄰接矩陣的搜索過程
鄰接矩陣如下,無向圖的鄰接矩陣是一個對稱矩陣
深搜從結點1出發,(1,2)的值爲1,說明結點1和結點2連通,以此類推,搜索過程爲
(1, 2)->(2, 3)->(3, 4)->(1,5)
- 時間複雜度:O(V^2)
V爲vertex即頂點數
圖存儲在鄰接表的搜索過程
鄰接表如下
深搜從結點1出發,與結點1鄰接的結點有2和5,遍歷結點2,與結點2鄰接的結點有3和4,以此類推
搜索順序爲:1->2->3->4->5
- 時間複雜度:O(V+E)
E爲edge即邊數
二、廣度優先搜索(BFS)
思想:從某一結點開始,沿着圖的寬度開始遍歷,完全遍歷完所有分支之後,再進入下一層深度,直到遍歷完所有連通的結點
- 用隊列來實現BFS
- BFS可以用於求最短路徑
例:從結點1開始廣搜
圖存儲在鄰接矩陣的搜索過程
搜索順序:
從結點1開始,查看鄰接表第1行值爲1的位置,(1, 2)、(1, 5)值爲1,遍歷結點2和5,然後從第二行開始,以此類推,知道所有結點都遍歷完。
(1, 2)->(1, 5)->(2, 3)->(2, 4)
- 時間複雜度:O(V^2)
圖存儲在鄰接表的搜索過程
與結點1鄰接的邊有(1,2)和(1,5),遍歷結點2和5,與結點2鄰接的邊有(2,3)和(2,4)遍歷結點3和4,以此類推知道遍歷完所有結點
搜索順序爲:1->2->5->3->4
- 時間複雜度:O(V+E)