我總是混淆是否使用DFS或BFS的堆棧或隊列。有人可以提供一些關於如何記住哪種算法使用哪種數據結構的直覺?如何記住DFS和BFS使用的數據結構?
回答
在一張紙上繪製一個小圖,並考慮在每個實現中處理節點的順序。在搜索中,您遇到節點的順序和處理節點的順序如何不同?
其中一個使用堆棧(深度優先),另一個使用隊列(寬度優先)(對於非遞歸實現至少)。
BFS首先探索/處理最近的頂點,然後向外移動離開源。鑑於此,您希望使用數據結構,在查詢時根據它們插入的順序給出最老的元素。在這種情況下,隊列就是你需要的,因爲它是先進先出(FIFO)。 儘管DFS儘可能沿着每個分支探索,然後沿着分支進行探索。爲此,堆棧工作得更好,因爲它是LIFO(後進先出)
BFS使用始終隊列,Dfs使用堆棧數據結構。正如前面的解釋所述,DFS正在使用回溯。記住回溯只能通過堆棧進行。
BFS;寬度=>隊列
的DFS;深度=>堆棧
參考它們的結構
我通過保持烤肉在我的腦海裏記住它。燒烤以'B'開始,以'q'結尾,因此BFS - > Queue和剩餘的DFS - >堆疊。
隊列通常可以認爲是在結構上即水平,廣度/寬度可以歸因於它 - BFS,而
堆棧可視化爲垂直結構因此具有深度-DFS。
對於新的學習者來說是一個很好的視覺線索。 +1。 – displayName 2017-11-10 22:24:36
深度優先搜索使用Stack
來記住它在到達死衚衕時應該到達的位置。
DFSS
把它按字母順序排列...
.... B(BFS)...... C ...... d(DFS)。 ...
.... Q(隊列)... [R ...... S(棧)...
我想和大家分享這樣的回答: https://stackoverflow.com/a/20429574/3221630
以BFS和堆棧替換隊列,重現相同的DFS訪問順序,它比實際的DFS算法使用更多的空間。
堆疊(後進先出,LIFO)。對於DFS,我們儘可能從根節點到最遠節點檢索它,這與LIFO的想法是一樣的。
隊列(先進先出FIFO)。對於BFS,我們一層一層地檢索它,在訪問節點的上層之後,我們訪問節點的底層,這與FIFO相同。
- 1. 圖表數據結構:DFS vs BFS?
- 2. Python DFS和BFS
- 3. 卡住DFS/BFS任務(USACO銀)
- 4. 通過使用DFS,BFS,A *
- 5. 在Java中的BFS和DFS和使圖
- 6. BFS和DFS的鄰接表
- 7. 內存使用在迭代式深化DFS(ID-DFS)和BFS
- 8. BFS和DFS的用途是什麼?
- 9. 如何表示用於DFS/BFS
- 10. 如何爲鄰接表構造適合BFS的數據結構?
- 11. 使用BFS/DFS解決編程任務
- 12. BFS和DFS之間的區別
- 13. 解釋BFS和DFS在回溯
- 14. JavaScript-only DOM樹遍歷 - DFS和BFS?
- 15. 如何結合使用散列和堆的數據結構
- 16. 如何記錄JavaScript/CoffeeScript數據結構
- 17. 查找所有BFS/DFS遍歷
- 18. BFS&DFS - 以哪個頂點開始?
- 19. Python網絡x DFS或BFS缺失?
- 20. 多線程與BFS,DFS搜索
- 21. 數據結構和患者記錄
- 22. 使用BFS和DFS查找圖表中兩個節點之間的路徑
- 23. 如何使用這個數據結構?
- 24. 如何使用Flash記住用戶數據?
- 25. 爲什麼DFS和BFS的複雜性不是O(V)?
- 26. 算法:從DFS和BFS輸出樹作爲子圖的差異
- 27. 如何在網格設置中修復DFS/BFS?
- 28. 數據庫標記結構
- 29. 如何使用hsc2hs綁定常量,函數和數據結構?
- 30. 如何使用angularjs和具體的數據結構
良好的觀察:) – RBT 2017-04-19 01:17:39