【问题标题】:Depth-first vs Breadth-first [closed]深度优先与广度优先[关闭]
【发布时间】:2013-12-30 14:17:27
【问题描述】:

根据我的经验,DFS 似乎比 BFS 更受欢迎。例如,DFS 的内存效率更高。但我只想知道 BFS 什么时候会超过 DFS?在什么情况下,我们应该选择 BFS 而不是 DFS?

【问题讨论】:

  • 如果你有一个无限图(每个顶点的度数有限)并且保证存在解,BFS保证找到它,而DFS可以很好地运行无限时间
  • @DmitryBychenko 无限图不适合任何物理存在的机器,所以这几乎不值得考虑。
  • @delnan 好吧,从技术上讲,这是真的,您不能拥有实际上无限的图,但是您可以拥有非常大的图,而不必存储每个节点和边。例如,单元格网格是有效“无限”图的一个很好的例子,它可以以非常稀疏的方式存储。所以我不同意它不值得考虑。
  • @Kyle 但如果它是有限的,BFS 和 DFS 都将终止,哪一个终止得更快取决于起点和目标顶点的确切位置。一个巨大但有限的图不会自动转化为 BFS 的优势。
  • 对不起,如果这个问题太宽泛了。但是由于每个人都知道我的真正意思并且他们也给出了我需要的答案,所以我认为没有必要修改这个问题。你怎么看?

标签: algorithm tree graph-algorithm depth-first-search breadth-first-search


【解决方案1】:

BFS 的优势在于它按级别进行,因此如果您有理由相信您在顶级节点中寻找的任何内容,BFS 可能会更好。如果您确定它处于底部,则 DFS 可能会更好,因为它不需要任何特定级别。

我记得读过的例子是,在查找医疗记录时,您可能需要更新的医疗记录而不是旧的医疗记录,这些记录可能位于树的底部。

【讨论】:

    【解决方案2】:

    对于任意图,没有这样的方法可以证明哪一个更好,因为在某些情况下 DFS 在其他情况下更有效 BFS 是有效的。但是对于树木,您当然可以更喜欢一种。例如,您正在遍历二叉树,则 DFS 所需的堆栈空间为O(logN),而 BFS 所需的堆栈空间为O(N) 用于队列。但是,如果您使用的是稀疏图,那么 BFS 可能会使用比 DFS 更少的空间。平均而言,两者的时间复杂度相同,但如果解决方案存在于根的更高深度或 BFS 更靠近根,您可能会发现 DFS 更可取

    【讨论】:

      猜你喜欢
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 2011-05-12
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多