Answers:
我想引用从堆栈溢出的答案被hstoerr它很好地涵盖了问题:
这在很大程度上取决于搜索树的结构以及解决方案的数量和位置。
如果您知道解决方案离树的根并不远,那么广度优先搜索(BFS)可能更好。如果树很深并且解决方案很少,则深度优先搜索(DFS)可能永远存在,但是BFS可能更快。如果树很宽,则BFS可能需要过多的内存,因此可能是完全不切实际的。如果解决方案很常见但位于树的深处,则BFS可能不切实际。如果搜索树非常深,则无论如何都需要限制深度优先搜索(DFS)的搜索深度(例如,使用迭代加深)。但是,这些只是经验法则。您可能需要进行实验。
RafałDowgird也指出:
有些算法取决于DFS(或BFS)的特定属性才能起作用。例如,用于查找2连接的组件的Hopcroft和Tarjan算法利用了以下事实:DFS遇到的每个已经访问的节点都在从根到当前探索的节点的路径上。
在我们的多核世界中重要的一点是:BFS易于并行化。从直觉上讲,这是合理的(为每个孩子分配线程),事实也是如此。因此,如果您有可以利用并行性的情况,那么BFS是可行的方法。
(我将其设置为社区Wiki。请随时进行编辑。)
如果
然后
选择理由
IDDFS = 迭代加深深度优先搜索
h
“树的高度”呢?这直接转化为“图形的高度”吗?
无限图可能是一个场景(除了已经提到过的最短路径之外),您可能不得不选择另一个以获得正确的程序:
例如,如果我们考虑一棵树,其中每个节点都有有限数量的子节点,但是树的高度是无限的,则DFS可能永远找不到您要查找的节点-它只会继续访问它的每个节点的第一个子节点会看到,因此,如果您要寻找的不是父母的第一个孩子,它将永远不会到达那里。但是,保证BFS在有限时间内找到它。
同样,如果我们考虑一棵树,其中每个节点都有无限数量的子节点,但树的高度有限,则BFS可能不会终止。它只会访问根节点的子节点,并且如果您要查找的节点是其他节点的子节点,则不会到达该节点。在这种情况下,保证DFS在有限时间内找到它。
广度优先和深度优先当然具有相同的最坏情况行为(所需的节点是找到的最后一个)。我怀疑,如果您没有有关图的信息,那么在平均情况下也是如此。
广度优先搜索的一个不错的好处是,它可以找到可能感兴趣或不感兴趣的最短路径(就最少的边缘而言)。
如果您的平均节点等级(邻居数)相对于节点数高(即图形密集),则广度优先将有大量队列,而深度优先将具有较小的堆栈。在稀疏图中,情况是相反的。因此,如果内存是一个限制因素,则当前图形的形状可能必须告知您选择的搜索策略。
我认为,以这样一种方式来编写它们都是很有趣的:仅通过切换几行代码就可以为您提供一种算法或另一种算法,这样您便会发现您的视差不像刚开始时那样强大。
我个人喜欢将BFS解释为淹没景观:低海拔地区将首先被淹没,然后高海拔地区才会被淹没。如果您像我们在地理书籍中所看到的那样将景观高度想象为等值线,则很容易看到BFS同时填充同一等值线下的所有区域,就像物理学中那样。因此,将海拔高度解释为距离或成比例的成本可以很好地直观了解该算法。
考虑到这一点,您可以轻松地根据广度优先搜索的思想来轻松找到最小的生成树,最短的路径以及许多其他最小化算法。
我还没有看到DFS的任何直观解释(仅是关于迷宫的标准解释,但它不如BFS 1和洪水泛滥),因此对我来说,BFS似乎与上述物理现象更好地关联,而DFS与理性系统上的选择困境有更好的关联(即,人们或计算机决定在国际象棋游戏中走出困境或走出迷宫)。
因此,对我而言,区别在于哪种自然现象最适合其在现实生活中的传播模型(横向)。