1. 程式人生 > >深搜和廣搜演算法

深搜和廣搜演算法

深度優先搜尋和廣度優先搜尋的深入討論

一、深度優先搜尋的特點是

   (1)從上面幾個例項看出,可以用深度優先搜尋的方法處理的題目是各種各樣的。有的搜尋深度是已知和固定的,如例題2-4,2-5,2-6;有的是未知的,如例題2-7、例題2-8;有的搜尋深度是有限制的,但達到目標的深度是不定的。但也看到,無論問題的內容和性質以及求解要求如何不同,它們的程式結構都是相同的,即都是深度優先演算法(一)和深度優先演算法(二)中描述的演算法結構,不相同的僅僅是儲存結點資料結構和產生規則以及輸出要求。

   (2)深度優先搜尋法有遞迴以及非遞迴兩種設計方法。一般的,當搜尋深度較小、問題遞迴方式比較明顯時,用遞迴方法設計好,它可以使得程式結構更簡捷易懂。當搜尋深度較大時,如例題2-5、2-6。當資料量較大時,由於系統堆疊容量的限制,遞迴容易產生溢位,用非遞迴方法設計比較好。

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

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

  (5)從輸出結果可看出,深度優先搜尋找到的第一個解並不一定是最優解。例如例題2-8得最優解為13,但第一個解卻是17。如果要求出最優解的話,一種方法將是後面要介紹的動態規劃法,另一種方法是修改原演算法:把原輸出過程的地方改為記錄過程,即記錄達到當前目標的路徑和相應的路程值,並與前面已記錄的值進行比較,保留其中最優的,等全部搜尋完成後,才把保留的最優解輸出。

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

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

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

  (3)當結點到跟結點的費用(有的書稱為耗散值)和結點的深度成正比時,特別是當每一結點到根結點的費用等於深度時,用廣度優先法得到的解是最優解,但如果不成正比,則得到的解不一定是最優解。這一類問題要求出最優解,一種方法是使用後面要介紹的其他方法求解,另外一種方法是改進前面深度(或廣度)優先搜尋演算法:找到一個目標後,不是立即退出,而是記錄下目標結點的路徑和費用,如果有多個目標結點,就加以比較,留下較優的結點。把所有可能的路徑都搜尋完後,才輸出記錄的最優路徑。   (4)廣度優先搜尋演算法,一般需要儲存產生的所有結點,佔的儲存空間要比深度優先大得多,因此程式設計中,必須考慮溢位和節省記憶體空間得問題。

  (5)比較深度優先和廣度優先兩種搜尋法,廣度優先搜尋法一般無回溯操作,即入棧和出棧的操作,所以執行速度比深度優先搜尋演算法法要快些。總之,一般情況下,深度優先搜尋法佔記憶體少但速度較慢,廣度優先搜尋算法佔記憶體多但速度較快,在距離和深度成正比的情況下能較快地求出最優解。因此在選擇用哪種演算法時,要綜合考慮。決定取捨