深度優先和廣度優先區別

2021-06-25 23:19:15 字數 1280 閱讀 3002

(一)深度優先搜尋的特點是:

1.深度優先搜尋法有遞迴以及非遞迴兩種設計方法。一般的,當搜尋深度較小、問題遞迴方式比較明顯時,用遞迴方法設計好,它可以使得程式結構更簡捷易懂。

當資料量較大時,由於系統堆疊容量的限制,遞迴容易產生溢位,用非遞迴方法設計比較好。

2.深度優先搜尋方法有廣義和狹義兩種理解。廣義的理解是,只要最新產生的結點(即深度最大的結點)先進行擴充套件的方法,就稱為深度優先搜尋方法。在這種理解情況下,深度優先搜尋演算法有全部保留和不全部保留產生的結點的兩種情況。而狹義的理解是,僅僅只保留全部產生結點的演算法。本書取前一種廣義的理解。不保留全部結點的演算法屬於一般的回溯演算法範疇。保留全部結點的演算法,實際上是在資料庫中產生乙個結點之間的搜尋樹,因此也屬於圖搜尋演算法的範疇。

3.不保留全部結點的深度優先搜尋法,由於把擴充套件望的結點從資料庫中彈出刪除,這樣,一般在資料庫中儲存的結點數就是深度值,因此它占用的空間較少,所以,當搜尋樹的結點較多,用其他方法易產生記憶體溢位時,深度優先搜尋不失為一種有效的演算法。

4.不一定會得到最優解,這個時候需要修改原演算法:把原輸出過程的地方改為記錄過程,即記錄達到當前目標的路徑和相應的路程值,並與前面已記錄的值進行比較,保留其中最優的,等全部搜尋完成後,才把保留的最優解輸出。

二、廣度優先搜尋法的顯著特點是:

(1)在產生新的子結點時,深度越小的結點越先得到擴充套件,即先產生它的子結點。為使演算法便於實現,存放結點的資料庫一般用佇列的結構。

(2)無論問題性質如何不同,利用廣度優先搜尋法解題的基本演算法是相同的,但資料庫中每一結點內容,產生式規則,根據不同的問題,有不同的內容和結構,就是同一問題也可以有不同的表示方法。 (3

)當結點到跟結點的費用(有的書稱為耗散值)和結點的深度成正比時,特別是當每一結點到根結點的費用等於深度時,用廣度優先法得到的解是最優解,但如果不成正比,則得到的解不一定是最優解。這一類問題要求出最優解,一種方法是使用後面要介紹的其他方法求解,另外一種方法是改進前面深度(或廣度)優先搜尋演算法:找到乙個目標後,不是立即退出,而是記錄下目標結點的路徑和費用,如果有多個目標結點,就加以比較,留下較優的結點。把所有可能的路徑都搜尋完後,才輸出記錄的最優路徑。 (4

)廣度優先搜尋演算法,一般需要儲存產生的所有結點,佔的儲存空間要比深度優先大得多,因此程式設計中,必須考慮溢位和節省記憶體空間得問題。

(5)比較深度優先和廣度優先兩種搜尋法,廣度優先搜尋法一般無回溯操作,即入棧和出棧的操作,所以執行速度比深度優先搜尋演算法法要快些。

總之,一般情況下,深度優先搜尋法占記憶體少但速度較慢,廣度優先搜尋演算法佔記憶體多但速度較快,在距離和深度成正比的情況下能較快地求出最優解。因此在選擇用哪種演算法時,要綜合考慮。決定取捨。

深度優先和廣度優先

在爬蟲系統中,待抓取url佇列是很重要的一部分,待抓取url佇列中的url以什麼樣的順序排隊列也是乙個很重要的問題,因為這涉及到先抓取哪個頁面,後抓取哪個頁面。而決定這些url排列順序的方法,叫做抓取策略。下面是常用的兩種策略 深度優先 廣度優先 注 scrapy預設採用的是深度優先演算法 這裡是深...

深度優先 廣度優先

父類定義 class people def init self,name,age,weight self.name name self.age age self.weight weight defspeak self print s 說 我 d 歲。self.name,self.age 單繼承示例 ...

深度優先和廣度優先遍歷

1.深度優先遍歷 從某個節點r出發,訪問子節點l1,若l1還有左子節點l1l,則訪問l1l,否則訪問子節點l1的右子節點l1r,遞迴訪問,直到所有的節點都被訪問到為止。無向圖的深度優先搜尋 遍歷順序為 a c b d f g e 有向圖的深度優先搜尋 遍歷順序為 a b c e d f g 2.廣度...