1. 程式人生 > >DFS 和 BFS 的做題感受

DFS 和 BFS 的做題感受

最近,很是不在狀態啊。
第一,自從回家之後,很是膨脹,大概有十天時間沒有更新過部落格了,而且暑假學的東西雖然當時可能理解了,但是現在從頭開始複習,各種不會,我的天吶,我是怎麼了!!!!!
第二,開學了,自己能水的特點又出來了,各種水群,真的是太浪費時間和生命了啊!! 很尷尬,這種事情又沒法控制,只能說,我就是一個大水比!!!!!!! 改,以後讓人給我禁言了算了。
第三,剛剛開學,這學期不想逃課了,想把成績弄上去,雖然別人說成績可能不太重要,但是我不行啊,我有自己的認知,這學期課程主要有1概率論2資料結構3java4邏輯與代數5大學物理6數字邏輯。總體來說,資料結構和java必須學好 沒的說,概率論,邏輯與代數,數字邏輯也大部分時間來學吧。至於大物,基本放棄吧。。。。。真的不適合學了、沒有思想了這種事情上學期就感覺出來了。
第四,自從暑假集訓開始,自己的鍛鍊計劃就失效了,現在開始要進行恢復訓練了,每個星期三,五,天跑步。每次速度要逐漸提升到最後一小時能跑10公里就行。 接下來是做DFS 和BFS 的一些看法了,從網上別人那裡摘取來的

一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是”搜到就是最優解”, 而深搜用於找多個解或者是”步數已知(比如3步就必須達到條件)”的問題,它的空間效率高,但是找到的不一定是最優解,必須記錄並完成整個搜尋,故一般情況下,深搜需要非常高效的剪枝(優化).

像搜尋最短路徑這些的很明顯要是用廣搜,因為廣搜的特性就是一層一層往下搜的,保證當前搜到的都是最優解,當然,最短路徑只是一方面的應用,像什麼最少狀態轉換也是可以應用的。
深搜就是優先搜尋一棵子樹,然後是另一棵,它和廣搜相比,有著記憶體需要相對較少的優點,八皇后問題就是典型的應用,這類問題很明顯是不能用廣搜去解決的。或者像圖論裡面的找圈的演算法,數的前序中序後序遍歷等,都是深搜

深搜和廣搜的不同之處是在於搜尋順序的不同。

深搜的實現類似於棧,每次選擇棧頂元素去擴充套件,

廣搜則是利用了佇列,先被擴充套件的的節點優先拿去擴充套件。

搜尋樹的形態:深搜層數很多,廣搜則是很寬。

深搜適合找出所有方案,廣搜則用來找出最佳方案

深搜和廣搜的區別:

深搜並不能保證第一次遇到目標點就是最短路徑,因此要搜尋所有可能的路徑,因此要回溯,標記做了之後還要取消掉,因此同一個點可能被訪問很多很多次。而廣搜由於它的由近及遠的結點擴充套件順序,結點總是以最短路徑被訪問。一個結點如果第二次被訪問,第二次的路徑肯定不會比第一次的短,因此就沒有必要再從這個結點向周圍擴充套件――第一次訪問這個結點的時候已經擴充套件過了,第二次再擴充套件只會得到更差的解。因此做過的標記不必去掉。因此同一個點至多隻可能被訪問一次。每訪問一個結點,與它相連的邊就被檢查一次。因此最壞情況下,所有邊都被檢查一次,因此時間複雜度為O(E)。