深度DFS 和 廣度BFS搜尋演算法學習

Mysticbinary發表於2024-09-26

目錄
  • 廣度優先的動態圖
  • 深度優先的動態圖
  • 廣度和深度的具體步驟
  • 深度和廣度的應用場景


圖的兩種遍歷方式:

  1. 深度優先遍歷(DFS——Depth First Search)
  2. 廣度優先遍歷(BFS——Breath First Search)

圖的遍歷演算法裡,處理臨時資料,依賴兩個抽象資料結構:

  • 佇列

廣度優先的動態圖

廣度優先遍歷也叫層序遍歷,先遍歷第一層(節點 1),再遍歷第二層(節點 2,3,4),第三層(5,6,7,8),第四層(9,10)。

深度優先的動態圖

從根結點出發,一直向左子節點走,直到左子節點不存在然後返回到上一個節點走這個節點的右子節點,然後一直往右子節點走,同樣的也是走不通為止就返回。很顯然這種一路走到黑,黑了就回頭的方式,就是深度優先遍歷的過程。


廣度和深度的具體步驟

廣度搜尋中,儲存下層的資料需要用到佇列,
深度搜尋中,儲存一整條路徑的資料,需要用到棧 ,用棧去回溯到最開始的頂點,
具體步驟去看《秒懂演算法:用常識解讀資料結構》,我覺得書分解得很詳細了,不需要在搬一次了。

深度和廣度的應用場景

我面試過挺多次的,很多面試問題都慢慢淡忘了,但是有一個問題一直記得:
他問,你平時在做爬蟲的時候,用深度還是廣度?

現在回想起來,覺得他問得真扯淡。

為什麼?

選擇深度或廣度所對應的是不同場景,理論上來說,所有問題,都可以用list解決,但是為什麼還要分化出那麼多的資料結構?

還不是因為——不同的問題,採用不同的資料結構,這樣解決效率才高,資源才省。

比如看這個下面這個家族結構圖:
image

如果想要找到曾祖母Ruby的所有兒女,那麼用深度還是廣度?

  • 肯定是廣度最合適。
    使用廣度優先搜尋,那麼立刻就能找到她所有直接女兒(Andrea、Xander、CoCo和Maya),不用搜尋和她相隔一代的親人。

如果想要找到Ruby的一個叫Ruth的後代,用深度還是廣度?

  • 顯然是深度合適。
    用深度優先搜尋,則可以馬上移動到圖的底部,在幾步之內就能找到曾孫一輩。
    雖然還是需要遍歷整幅圖才能找到Ruth,但至少快速找到她是有可能的。而用廣度優先搜尋則別無選擇,必須遍歷前兩輩的所有人,才能開始搜尋曾孫這一輩。

在思考用深度還是廣度時?應該是先思考究竟是想先儘可能在初始頂點附近搜尋還是想先儘可能遠離它

  • 前者適合用廣度優先搜尋
  • 後者適合用深度優先搜尋。

所以,為什麼我現在覺得那個問得很扯淡,就類似,小明,你開發喜歡用list還是Map呀?
- -。

相關文章