算法導論--廣度優先搜索和深度優先搜索

廣度優先搜索html

在給定圖G=(V,E)和一個特定的源頂點s的狀況下,廣度優先搜索系統地探索G中的邊,以期「發現」可從s 到達的全部頂點,並計算s 到全部這些可達頂點之間的距離(即最少的邊數)。該搜索算法同時還能生成一棵根爲s、且包括全部s 的可達頂點的廣度優先樹。對從s 可達的任意頂點v,廣度優先樹中從s 到v 的路徑對應於圖G中從s 到v 的一條最短路徑,即包含最少邊數的路徑。該算法對有向圖和無向圖一樣適用。算法

 具體算法詳情見 算法—12.廣度優先搜索函數

算法分析:測試

如今分析一下該算法在輸入圖G=(V,E)上的運行時間。此處採用彙集分析技術,在初始化後,再沒有任何頂點被置爲白色。所以,第13行中的測試保證了每一個頂點至多隻進入隊列一次,於是至多隻從隊列中出來一次。入隊和出隊操做須要O(1)的時間,所以隊列操做所需的所有時間爲O(V)。由於只有當每一個頂點將出隊時,纔會掃描其鄰接表,於是每一個頂點的鄰接表至多被掃描一次。因爲全部鄰接表的長度和爲O(E),故掃描全部鄰接表所花費的所有時間爲O(E)。初始化操做的開銷爲O(V),因而,過程BFS的總運行時間爲O(V+E)。因而可知,廣度優先搜索的運行時間是圖G的鄰接表大小的一個線性函數。spa

深度優先搜索htm

正如「深度優先搜索」這一名稱所暗示的那樣,這種搜索算法所遵循的搜索策略是儘量「深」地搜索一個圖。在深度優先搜索中,對於最新發現的頂點,若是它還有以此爲起點而未探測到的邊,就沿此邊繼續探測下去。當頂點v的全部邊都已被探尋事後,搜索將回溯到發現頂點v 有起始點的那些邊。這一過程一直進行到已發現從源頂點可達的全部頂點時爲止。若是還存在未被發現的頂點,則選擇其中一個做爲源頂點,並重復以上過程。整個過程反覆進行,直到全部的頂點都已被發現時爲止。blog

算法—11.深度優先搜索隊列

算法分析:get

DFS中第1~3行和第5~7行中的循環佔用的時間爲O(V),這不包括調用DFS-VISIT的時間。就像咱們在處理廣度優先搜索時同樣,採用彙集分析。對於每一個頂點vΕV,過程DFS-VISIT僅被調用一次,由於只有對白色頂點纔會調用該過程,且該過程所作的第一件事就是將頂點置爲灰色。在DFS-VISIT(v)的一次執行過程當中,第4~7行中的循環被執行了| Adj[v] |次。由於有搜索

故執行過程DFS-VISIT中第4~7行的總代價爲O(E)。所以,DFS的運行時間爲O(V+E)。

相關文章
相關標籤/搜索