廣度優先搜尋和深度優先搜尋各有他的優點,也有他們的不足之處。
廣度優先搜尋在遍歷的時候不需要全部遍歷,搜尋到符合條件的就立即終止,這樣就不會浪費太多時間。但是在遍歷的過程中,他需要建立乙個佇列來儲存遍歷的狀態(也就是遍歷到的每乙個結點需要先存入到佇列中,然後取出),這樣就無非就增加了空間複雜度。
而深度優先搜尋則會遍歷所有的結點,不需要儲存遍歷的狀態,雖然時間複雜度高但是空間複雜度低。在使用深度優先搜尋的時候非常容易超時,因為每次遍歷時間複雜度都是以指數的形式增長的。所以我們在使用深度優先搜尋的時候我們一般都會聯合奇偶剪枝一起使用,這樣就極大的降低了深度優先搜尋的時間複雜度。
奇偶剪枝:奇偶剪枝就是在你遍歷的過程中,首先判斷你這個結點能不能按要求到達目的地,如果能,則訪問他的鄰結點,否則,退出這一層遍歷。
部分內容來自:
把矩陣看成如下形式:
0 1 0 1 0 1
1 0 1 0 1 0
0 1 0 1 0 1
1 0 1 0 1 0
0 1 0 1 0 1
從為 0 的格仔走一步,必然走向為 1 的格仔 。
從為 1 的格仔走一步,必然走向為 0 的格仔 。
即:從 0 走向 1 必然是奇數步,從 0 走向 0 必然是偶數步。
所以當遇到從 0 走向 0 但是要求時間是奇數的或者 從 1 走向 0 但是要求時間是偶數的,都可以直接判斷不可達!
比如一張地圖c
s...
....
....
....
...d
要求從s點到達d點,此時,從s到d的最短距離為s = abs ( dx - sx ) + abs ( dy - sy )。
如果地圖**現了不能經過的障礙物:
s..x
xx.x
...x
.***
...d
此時的最短距離s' = s + 4,為了繞開障礙,不管偏移幾個點,偏移的距離都是最短距離s加上乙個偶數距離。
不管你怎麼繞,最終到達目的地的步數都是乙個最短步數加上乙個偶數。
一般深度優先搜尋用來解那種需要得到全部解的題,而廣度優先搜尋則是用來求最短路徑的,到達的每乙個結點都是最短路徑。 深度搜尋和廣度搜尋
這篇部落格很早之前就寫好了,但是一直沒有發出來。在進行詳細解說之前,我們需要先借用圖的概念,圖就是由一些小圓點 稱為頂點 和連線這些小圓點的直線 稱為邊 組成的。如下圖是由5個頂點 1,2,3,4,5 和5 條邊 1 2,1 2,1 4,2 5,3 4 組成的。現在我們從一號頂點開始遍歷這個圖,使用...
廣度搜尋和深度搜尋
我現在要從 雙子峰 前往 金門大橋 求最短的路徑 帶單獨參構造方法 public placetree string p 帶全參的構造方法 public placetree placetree left,placetree right,string p public static void main ...
搜尋 深度搜尋 廣度搜尋
迷宮 題目描述 一天extense在森林裡探險的時候不小心走入了乙個迷宮,迷宮可以看成是由n n的格點組成,每個格點只有2種狀態,和 前者表示可以通行後者表示不能通行。同時當extense處在某個格點時,他只能移動到東南西北 或者說上下左右 四個方向之一的相鄰格點上,extense想要從點a走到點b...