深度優先遍歷和廣度優先遍歷思考

2021-07-03 14:30:44 字數 1037 閱讀 4073

原位址

在說兩種演算法之前先說說什麼叫「搜尋」:

可能很多人對搜尋的想法有點不對,很多人認為搜尋是對已知的一棵樹或者是已知的圖進行搜尋,所以我們常常把搜尋和遍歷給搞混了,但是其實搜尋針對的並不是已知的,這並不代表搜尋不能用於已知的,搜尋一般用於未知的樹,或者未知的圖,而我們僅僅是知道這個樹或圖的產生規則。這個時候才會產生深度優先搜尋和廣度優先搜尋。

然後說一下深度優先搜尋和廣度優先搜尋的區別以及適用範圍:

廣度優先搜尋:

廣度優先搜尋是按照樹的層次進行的搜尋,如果此層沒有搜尋完成的情況下不會進行下一層的搜尋。

深度優先搜尋:

深度優先搜尋是按照樹的深度進行搜尋的,所以又叫縱向搜尋,在每一層只擴充套件乙個節點,直到為樹的規定深度或葉子節點為止。這個便稱為深度優先搜尋。

我先來說說兩種演算法的不同點。廣度優先搜尋,適用於所有情況下的搜尋,但是深度優先搜尋不一定能適用於所有情況下的搜尋。因為

由於乙個有解的問題樹可能含有無窮分枝,深度優先搜尋如果誤入無窮分枝(即深度無限),則不可能找到目標節點。所以,深度優先搜尋策略是不完備的。

適用範圍:這點很重要,因為知道兩者的適用範圍對於程式設計人員很有好處,至少可以少走彎路。(這些都是開個人觀點,有缺少的歡迎補充)

廣度優先搜尋適用範圍:在未知樹深度情況下,用這種演算法很保險和安全。在樹體系相對小不龐大的時候,廣度優先也會更好些。

深度優先搜尋適用範圍:剛才說了深度優先搜尋又自己的缺陷,但是並不代表深度優先搜尋沒有自己的價值。在樹深度已知情況下,並且樹體系相當龐大時,深度優先搜尋往往會比廣度優先搜尋優秀,因為比如8*8的馬踏棋盤中,如果用廣度搜尋,必須要記錄所有節點的資訊,這個儲存量一般電腦是達不到的。然而如果用深度優先搜尋的時候卻能在乙個棋盤被判定出來後釋放之前的節點記憶體。

當讓具體情況還是根據具體的實際問題而定,並沒有哪種絕對的好。所以,理解這兩種演算法的本質是關鍵。

最後我說說關於找最優解的問題,這種問題如果不依靠其他的輔助演算法來說,其實對於廣度優先搜尋和深度優先搜尋來說是一樣的,說白了找最優解就是個遍歷過程,所以沒有哪種演算法找最優解更好。但是如果有輔助的啟發式演算法或者別的演算法就另當別論了。

深度優先遍歷 和 廣度優先遍歷

圖的廣度優先搜尋是樹的按層次遍歷的推廣,它的基本思想是 首先訪問初始點vi,並將其標記為已訪問過,接著訪問vi的所有未被訪問過的鄰接點 vi1,vi2,vi t,並均標記已訪問過,然後再按照vi1,vi2,vi t的次序,訪問每乙個頂點的所有未被訪問過的鄰接點,並均標記為已訪問過,依次類推,直到圖中...

廣度優先遍歷和深度優先遍歷

深度優先遍歷 廣度優先遍歷是圖的一種遍歷方式,它的思想就是遍歷這個點相鄰的所有的點,再對這些點進行廣度優先遍歷.如下圖所示 首先我們從a點開始遍歷,然後遍歷所有和a相鄰的點f和點g 然後對f和點g進行遍歷進行遍歷,得到點e,h,k和b 然後再繼續,知道所有的點都遍歷完成 首先,我們先定義圖graph...

廣度優先遍歷和深度優先遍歷

1.1 概念 以初始節點v0作為第一層節點,接著訪問它。然後迭代第一層節點即v0,訪問它相鄰接的沒有訪問過的節點比如v1,v2,v1,v2加入到第二層節點 迭代第二層節點v1,v2,v1,v2依次訪問相鄰接的沒有訪問過的節點,重複上述步驟直至所有節點都被訪問過為止。如圖所示首先訪問根節點v0,並將v...