簡體   English   中英

廣度優先或深度優先搜索

[英]breadth first or depth first search

我知道這個算法是如何工作的,但是不能決定何時使用哪種算法?

是否有一些指導方針,哪一個比其他或任何考慮更好?

非常感謝。

如果您想找到步驟最短的解決方案,或者您的樹有無限高度(或非常大),則應首先使用寬度。

如果你有一個有限的樹,並希望使用最小的內存量遍歷所有可能的解決方案,那么你應該首先使用深度。

如果您正在尋找最佳的國際象棋移動,您可以使用迭代加深 ,這是兩者的組合。

IDDFS結合了深度優先搜索的空間效率和廣度優先搜索的完整性(當分支因子是有限的時)。

BFS通常在圖形具有一些有意義的“自然分層”(例如,更近的節點代表“更接近”的結果)並且您的目標結果可能更靠近起點或起點“搜索更便宜”的情況下有用。 ”。

當您想要找到最短路徑時,BFS是一個自然的選擇。

如果您的圖形是無限的或以編程方式生成的,您可能希望在冒險之前搜索更近的圖層,因為在到達更近的節點之前探索遠程節點的成本是令人望而卻步的。

如果由於內存/磁盤/位置問題而訪問更多遠程節點會更昂貴,BFS可能會再次變得更好。

使用哪種方法通常取決於應用程序(即,您必須搜索圖表的原因) - 例如拓撲排序需要深度優先搜索,而尋找最大流量的Ford-Fulkerson算法需要廣度優先搜索。

如果您正在遍歷樹,則深度優先將使用與其深度成比例的內存。 如果樹是合理平衡的(或者對其深度有一些其他限制),則使用遞歸深度優先遍歷可能是方便的。

但是,不要這樣做以遍歷一般圖形; 它可能會導致堆棧溢出。 對於無界樹或一般圖形,您將需要某種輔助存儲,可以擴展到與輸入節點數量成比例的大小。 在這種情況下,廣度優先遍歷簡單方便。

如果您的問題提供了選擇一個節點而不是另一個節點的原因,您可以考慮使用優先級隊列,而不是堆棧(對於深度優先)或FIFO(對於廣度優先)。 優先級隊列將花費O(log K)時間(其中K是不同優先級的當前數量)以在每一步找到最佳節點,但優化可能是值得的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM