目錄
- 廣度優先的動態圖
- 深度優先的動態圖
- 廣度和深度的具體步驟
- 深度和廣度的應用場景
圖的兩種遍歷方式:
- 深度優先遍歷(DFS——Depth First Search)
- 廣度優先遍歷(BFS——Breath First Search)
圖的遍歷演算法裡,處理臨時資料,依賴兩個抽象資料結構:
- 棧
- 佇列
廣度優先的動態圖
廣度優先遍歷也叫層序遍歷,先遍歷第一層(節點 1),再遍歷第二層(節點 2,3,4),第三層(5,6,7,8),第四層(9,10)。
深度優先的動態圖
從根結點出發,一直向左子節點走,直到左子節點不存在然後返回到上一個節點走這個節點的右子節點,然後一直往右子節點走,同樣的也是走不通為止就返回。很顯然這種一路走到黑,黑了就回頭的方式,就是深度優先遍歷的過程。
廣度和深度的具體步驟
廣度搜尋中,儲存下層的資料需要用到佇列,
深度搜尋中,儲存一整條路徑的資料,需要用到棧 ,用棧去回溯到最開始的頂點,
具體步驟去看《秒懂演算法:用常識解讀資料結構》,我覺得書分解得很詳細了,不需要在搬一次了。
深度和廣度的應用場景
我面試過挺多次的,很多面試問題都慢慢淡忘了,但是有一個問題一直記得:
他問,你平時在做爬蟲的時候,用深度還是廣度?
現在回想起來,覺得他問得真扯淡。
為什麼?
選擇深度或廣度所對應的是不同場景,理論上來說,所有問題,都可以用list解決,但是為什麼還要分化出那麼多的資料結構?
還不是因為——不同的問題,採用不同的資料結構,這樣解決效率才高,資源才省。
比如看這個下面這個家族結構圖:
如果想要找到曾祖母Ruby的所有兒女,那麼用深度還是廣度?
- 肯定是廣度最合適。
使用廣度優先搜尋,那麼立刻就能找到她所有直接女兒(Andrea、Xander、CoCo和Maya),不用搜尋和她相隔一代的親人。
如果想要找到Ruby的一個叫Ruth的後代,用深度還是廣度?
- 顯然是深度合適。
用深度優先搜尋,則可以馬上移動到圖的底部,在幾步之內就能找到曾孫一輩。
雖然還是需要遍歷整幅圖才能找到Ruth,但至少快速找到她是有可能的。而用廣度優先搜尋則別無選擇,必須遍歷前兩輩的所有人,才能開始搜尋曾孫這一輩。
在思考用深度還是廣度時?應該是先思考究竟是想先儘可能在初始頂點附近搜尋,還是想先儘可能遠離它?
- 前者適合用廣度優先搜尋
- 後者適合用深度優先搜尋。
所以,為什麼我現在覺得那個問得很扯淡,就類似,小明,你開發喜歡用list還是Map呀?
- -。