首页 文章

广度优先或深度优先搜索

提问于
浏览
8

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

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

非常感谢 .

4 回答

  • 0

    如果您想找到步骤最短的解决方案,或者您的树有无限高度(或非常大),则应首先使用宽度 .

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

    如果你正在寻找最好的国际象棋移动游戏,你可以使用iterative deepening这两者的组合 .

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

  • 1

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

    当您想要找到最短路径时,BFS是一个自然的选择 .

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

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

  • 1

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

  • 17

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

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

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

相关问题