广度优先或深度优先搜索

时间:2010-05-12 19:33:10

标签: c++ algorithm breadth-first-search depth-first-search

我知道这个算法是如何工作的,但是无法决定何时使用哪种算法?

是否有一些指导方针,哪一个比其他或任何考虑更好?

非常感谢。

4 个答案:

答案 0 :(得分:17)

如果你想找到一个步骤最短的解决方案,或者你的树有无限高度(或非常大),你应该先使用广度。

如果你有一个有限的树并且想要使用最小的内存来遍历所有可能的解决方案,那么你应该首先使用深度。

如果您正在寻找最佳的国际象棋棋子,您可以使用iterative deepening这两者的组合。

  

IDDFS结合了深度优先搜索的空间效率和广度优先搜索的完整性(当分支因子是有限的时候)。

答案 1 :(得分:1)

BFS通常适用于图表具有一些有意义的“自然分层”(例如,较近的节点代表“更接近”的结果)并且您的目标结果可能位于更接近起点或起点是“搜索更便宜“。

当你想找到最短路径时,BFS是一个很自然的选择。

如果您的图表是无限的或以编程方式生成的,您可能希望在冒险之前搜索更近的图层,因为在到达更近的节点之前探索远程节点的成本过高。

如果由于内存/磁盘/位置问题而访问更多远程节点会更昂贵,BFS可能会再次变得更好。

答案 2 :(得分:1)

使用哪种方法通常取决于应用程序(即您必须搜索图形的原因) - 例如拓扑排序需要深度优先搜索,而寻找最大流量的Ford-Fulkerson算法需要广度优先搜索。 / p>

答案 3 :(得分:0)

如果您正在遍历树,则深度优先将使用与其深度成比例的内存。如果树是合理平衡的(或者对其深度有一些其他限制),使用递归深度优先遍历可能很方便。

但是,不要为了遍历一般图而这样做;它可能会导致堆栈溢出。对于无界树或一般图形,您将需要某种辅助存储,可以扩展到与输入节点数量成比例的大小。在这种情况下,广度优先遍历简单方便。

如果您的问题提供了选择一个节点而不是另一个节点的理由,您可以考虑使用优先级队列,而不是堆栈(用于深度优先)或FIFO(用于广度优先)。优先级队列将花费O(log K)时间(其中K是当前不同优先级的数量)以在每个步骤中找到最佳节点,但优化可能是值得的。