深度優先算法與廣度優先算法


  深度優先搜索和廣度優先搜索,都是圖形搜索算法,它兩相似,又卻不同,在應用上也被用到不同的地方。這里拿一起討論,方便比較。

一、深度優先搜索

        深度優先搜索屬於圖算法的一種,是一個針對圖和樹的遍歷算法,英文縮寫為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.



作者:安然若知
鏈接:https://www.jianshu.com/p/bff70b786bb6
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。

1. 深度優先搜索介紹

圖的深度優先搜索(Depth First Search),和樹的先序遍歷比較類似。

它的思想:假設初始狀態是圖中所有頂點均未被訪問,則從某個頂點v出發,首先訪問該頂點,然后依次從它的各個未被訪問的鄰接點出發深度優先搜索遍歷圖,直至圖中所有和v有路徑相通的頂點都被訪問到。 若此時尚有其他頂點未被訪問到,則另選一個未被訪問的頂點作起始點,重復上述過程,直至圖中所有頂點都被訪問到為止。

顯然,深度優先搜索是一個遞歸的過程。

2. 深度優先搜索圖解

2.1 無向圖的深度優先搜索

下面以"無向圖"為例,來對深度優先搜索進行演示。

對上面的圖G1進行深度優先遍歷,從頂點A開始。

第1步:訪問A。 
第2步:訪問(A的鄰接點)C。 
    在第1步訪問A之后,接下來應該訪問的是A的鄰接點,即"C,D,F"中的一個。但在本文的實現中,頂點ABCDEFG是按照順序存儲,C在"D和F"的前面,因此,先訪問C。 
第3步:訪問(C的鄰接點)B。 
    在第2步訪問C之后,接下來應該訪問C的鄰接點,即"B和D"中一個(A已經被訪問過,就不算在內)。而由於B在D之前,先訪問B。 
第4步:訪問(C的鄰接點)D。 
    在第3步訪問了C的鄰接點B之后,B沒有未被訪問的鄰接點;因此,返回到訪問C的另一個鄰接點D。 
第5步:訪問(A的鄰接點)F。 
    前面已經訪問了A,並且訪問完了"A的鄰接點B的所有鄰接點(包括遞歸的鄰接點在內)";因此,此時返回到訪問A的另一個鄰接點F。 
第6步:訪問(F的鄰接點)G。 
第7步:訪問(G的鄰接點)E。

因此訪問順序是:A -> C -> B -> D -> F -> G -> E

 

2.2 有向圖的深度優先搜索

下面以"有向圖"為例,來對深度優先搜索進行演示。

對上面的圖G2進行深度優先遍歷,從頂點A開始。

第1步:訪問A。 
第2步:訪問B。 
    在訪問了A之后,接下來應該訪問的是A的出邊的另一個頂點,即頂點B。 
第3步:訪問C。 
    在訪問了B之后,接下來應該訪問的是B的出邊的另一個頂點,即頂點C,E,F。在本文實現的圖中,頂點ABCDEFG按照順序存儲,因此先訪問C。 
第4步:訪問E。 
    接下來訪問C的出邊的另一個頂點,即頂點E。 
第5步:訪問D。 
    接下來訪問E的出邊的另一個頂點,即頂點B,D。頂點B已經被訪問過,因此訪問頂點D。 
第6步:訪問F。 
    接下應該回溯"訪問A的出邊的另一個頂點F"。 
第7步:訪問G。

因此訪問順序是:A -> B -> C -> E -> D -> F -> G

廣度優先搜索的圖文介紹

1. 廣度優先搜索介紹

廣度優先搜索算法(Breadth First Search),又稱為"寬度優先搜索"或"橫向優先搜索",簡稱BFS。

它的思想是:從圖中某頂點v出發,在訪問了v之后依次訪問v的各個未曾訪問過的鄰接點,然后分別從這些鄰接點出發依次訪問它們的鄰接點,並使得“先被訪問的頂點的鄰接點先於后被訪問的頂點的鄰接點被訪問,直至圖中所有已被訪問的頂點的鄰接點都被訪問到。如果此時圖中尚有頂點未被訪問,則需要另選一個未曾被訪問過的頂點作為新的起始點,重復上述過程,直至圖中所有頂點都被訪問到為止。

換句話說,廣度優先搜索遍歷圖的過程是以v為起點,由近至遠,依次訪問和v有路徑相通且路徑長度為1,2...的頂點。

2. 廣度優先搜索圖解

2.1 無向圖的廣度優先搜索

下面以"無向圖"為例,來對廣度優先搜索進行演示。還是以上面的圖G1為例進行說明。

第1步:訪問A。 
第2步:依次訪問C,D,F。 
    在訪問了A之后,接下來訪問A的鄰接點。前面已經說過,在本文實現中,頂點ABCDEFG按照順序存儲的,C在"D和F"的前面,因此,先訪問C。再訪問完C之后,再依次訪問D,F。 
第3步:依次訪問B,G。 
    在第2步訪問完C,D,F之后,再依次訪問它們的鄰接點。首先訪問C的鄰接點B,再訪問F的鄰接點G。 
第4步:訪問E。 
    在第3步訪問完B,G之后,再依次訪問它們的鄰接點。只有G有鄰接點E,因此訪問G的鄰接點E。

因此訪問順序是:A -> C -> D -> F -> B -> G -> E

2.2 有向圖的廣度優先搜索

下面以"有向圖"為例,來對廣度優先搜索進行演示。還是以上面的圖G2為例進行說明。

第1步:訪問A。 
第2步:訪問B。 
第3步:依次訪問C,E,F。 
    在訪問了B之后,接下來訪問B的出邊的另一個頂點,即C,E,F。前面已經說過,在本文實現中,頂點ABCDEFG按照順序存儲的,因此會先訪問C,再依次訪問E,F。 
第4步:依次訪問D,G。 
    在訪問完C,E,F之后,再依次訪問它們的出邊的另一個頂點。還是按照C,E,F的順序訪問,C的已經全部訪問過了,那么就只剩下E,F;先訪問E的鄰接點D,再訪問F的鄰接點G。

因此訪問順序是:A -> B -> C -> E -> F -> D -> G


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM