一、深度優先搜尋(dfs)的特點是:
(1)深度優先搜尋法有遞迴以及非遞迴兩種設計方法。一般的,當搜尋深度較小、問題遞迴方式比較明顯時,用遞迴方法設計好,它可以使得程式結構更簡捷易懂。當資料量較大時,由於系統堆疊容量的限制,遞迴容易產生溢位,用非遞迴方法設計比較好。
(2)深度優先搜尋方法有廣義和狹義兩種理解。廣義的理解是,只要最新產生的結點(即深度最大的結點)先進行擴充套件的方法,就稱為深度優先搜尋方法。在這種理解情況下,深度優先搜尋演算法有全部保留和不全部保留產生的結點的兩種情況。而狹義的理解是,僅僅只保留全部產生結點的演算法。本書取前一種廣義的理解。不保留全部結點的演算法屬於一般的回溯演算法範疇。保留全部結點的演算法,實際上是在資料庫中產生乙個結點之間的搜尋樹,因此也屬於圖搜尋演算法的範疇。
(3)不保留全部結點的深度優先搜尋法,由於把擴充套件望的結點從資料庫中彈出刪除,這樣,一般在資料庫中儲存的結點數就是深度值,因此它占用的空間較少,所以,當搜尋樹的結點較多,用其他方法易產生記憶體溢位時,深度優先搜尋不失為一種有效的演算法。
(4)不一定會得到最優解,這個時候需要修改原演算法:把原輸出過程的地方改為記錄過程,即記錄達到當前目標的路徑和相應的路程值,並與前面已記錄的值進行比較,保留其中最優的,等全部搜尋完成後,才把保留的最優解輸出。
二、廣度優先搜尋法的顯著特點是:
(1)在產生新的子結點時,深度越小的結點越先得到擴充套件,即先產生它的子結點。為使演算法便於實現,存放結點的資料庫一般用佇列的結構。
(2)無論問題性質如何不同,利用廣度優先搜尋法解題的基本演算法是相同的,但資料庫中每一結點內容,產生式規則,根據不同的問題,有不同的內容和結構,就是同一問題也可以有不同的表示方法。
(3)當結點到跟結點的費用(有的書稱為耗散值)和結點的深度成正比時,特別是當每一結點到根結點的費用等於深度時,用廣度優先法得到的解是最優解,但如果不成正比,則得到的解不一定是最優解。這一類問題要求出最優解,一種方法是使用後面要介紹的其他方法求解,另外一種方法是改進前面深度(或廣度)優先搜尋演算法:找到乙個目標後,不是立即退出,而是記錄下目標結點的路徑和費用,如果有多個目標結點,就加以比較,留下較優的結點。把所有可能的路徑都搜尋完後,才輸出記錄的最優路徑。
(4)廣度優先搜尋演算法,一般需要儲存產生的所有結點,佔的儲存空間要比深度優先大得多,因此程式設計中,必須考慮溢位和節省記憶體空間得問題。
(5)比較深度優先和廣度優先兩種搜尋法,廣度優先搜尋法一般無回溯操作,即入棧和出棧的操作,所以執行速度比深度優先搜尋演算法法要快些。
總之,一般情況下,深度優先搜尋法占記憶體少但速度較慢,廣度優先搜尋演算法佔記憶體多但速度較快,在距離和深度成正比的情況下能較快地求出最優解。因此在選擇用哪種演算法時,要綜合考慮。決定取捨。
dfs和bfs的應用
dfs 能找到可行的路徑,所需時間長,需要標記位置 bfs 能找到最短的路徑,所需空間長,需要出入佇列 兩個搜尋的相同點是都利用了二維陣列的圖,有的時候都用了標記方法。但是dfs,我覺得沒什麼變化,就這樣了。但是bfs,1.可以用stl的queue,但是,沒辦法對付路徑記錄。2.可以用自己寫的結構體...
dfs和bfs的總結
dfs dfs演算法是乙個對連通圖進行遍歷的演算法。它的思想是從乙個被選定的點出發一條路走到底,如果得不到目的解,那就返回到上乙個節點,然後換一條路繼續走到底,直到找到目的解返回或者全部遍歷完返回乙個事先定好的值。dfs一般借用遞迴完成整個演算法的構造。dfs演算法的一般框架經我總結大致為下 int...
DFS和BFS的總結
如果我們使用 dfs bfs 只是為了遍歷一棵樹 一張圖上的所有結點的話,那麼 dfs 和 bfs 的能力沒什麼差別,我們當然更傾向於更方便寫 空間複雜度更低的 dfs 遍歷。不過,某些使用場景是 dfs 做不到的,只能使用 bfs 遍歷。這就是本文要介紹的兩個場景 層序遍歷 最短路徑 還有寫 df...