什麼時候用DFS,什麼時候用BFS

2021-07-14 02:36:28 字數 883 閱讀 2453



什麼時候用

dfs,什麼時候用

bfs?

二維陣列的題目,n小於

20的,適用

dfs。而一般

n<= 200

,n<=1000

這種,一定不可能用

dfs去做。而且並不只是整個題目不能用

dfs,其中的

每一步也不能使用

dfs。

bfs的基本步驟 1.

將初始點(乙個或多個)加入乙個集合尾 2.

從集合頭取出點,判斷初始點的周邊點,將符合條件的點加入佇列 3.

重複2操作,直至集合為空。(一般

每個點只加入佇列一次)

一般來說用dfs解決的問題都可以用bfs來解決。

dfs(深搜的同時考慮回溯)

bfs=佇列,入佇列,出佇列;dfs=棧,壓棧,出棧

bfs是按一層一層來訪問的,所以適合有目標求最短路的步數,你想想層層搜尋每次層就代表了一步。bfs優先訪問的是兄弟節點,只有這一層全部訪問完才能訪問下一層,也就是說bfs第幾層就代表當前可以走到的位置(結點).而dfs是按遞迴來實現的,它優先搜尋深度,再回溯,優先訪問的是沒有訪問過的子節點

dfs多用於連通性問題因為其執行思想與人腦的思維很相似,故解決連通性問題更自然。bfs多用於解決最短路問題,其執行過程中需要儲存每一層的資訊,所以其執行時需要儲存的資訊量較大,如果人腦也可儲存大量資訊的話,理論上人腦也可執行bfs。

總的來說多數情況下執行bfs所需的記憶體會大於dfs需要的記憶體(dfs一次訪問一條路,bfs一次訪問多條路),dfs容易爆棧(棧不易"控制"),bfs通過控制佇列可以很好解決"爆佇列"風險。

它們兩者間各自的優勢需要通過實際的問題來具體分析,根據它們各自的特點來應用於不同的問題中才能獲得最優的效能。

什麼時候用exists 什麼時候用in

in not in exists not exists 使用exists,oracle會首先檢查主查詢,然後執行子查詢直到它找到第乙個匹配項,這就節省了時間。oracle在執行in子查詢時,首先執行 子查詢,並將獲得的結果列表存放在乙個加了索引的臨時表中。在執行子查詢之前,系統先將主查詢掛起 待子查...

什麼時候用GET?什麼時候用POST?

get和post兩種方法都是將資料送到伺服器,但你該用哪一種呢?http標準包含這兩種方法是為了達到不同的目的。post用於建立資源,資源的內容會被編入http請示的內容中。例如,處理訂貨表單 在資料庫中加入新資料行等。當請求無 時 如進行搜尋 便可使用get方法 當請求有 時 如新增資料行 則用p...

什麼時候用堆,什麼時候用棧?

參考文章 c 面試題之記憶體分配 一 首先,回顧一下c c 的記憶體分配機制。乙個c c 程式編譯時記憶體分為5大儲存區 堆區 棧區 靜態區 全域性區 文字常量區 儲存字串常量 程式 區 存放二進位制程式 下面主要闡述前面三個。1 靜態儲存區域 靜態儲存區域的 內存在程式編譯時就已經分配好,這塊內存...