【问题标题】:What is breadth-first search useful for?广度优先搜索有什么用?
【发布时间】:2010-12-12 01:06:35
【问题描述】:

通常当我不得不走一个图时,我总是使用深度优先搜索,因为空间复杂度较低。老实说,我从未见过需要广度优先搜索的情况,尽管我的经验非常有限。

什么时候使用广度优先搜索才有意义?

更新:我想我的回答 here 显示了我使用 BFS 的情况(因为我认为是 DFS)。不过,我仍然很想知道为什么它在这种情况下有用。

【问题讨论】:

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


    【解决方案1】:

    一个例子是遍历文件系统(递归深度有限)。

    根据wikipedia,它对于某些图算法(二分性、连通分量)也很有用。

    【讨论】:

      【解决方案2】:

      当您想通过尽可能少的边到达节点时,即当您想在未加权的图中找到最短路径时。

      此外,深度优先搜索的空间复杂度可能高于广度优先搜索的空间复杂度,例如:每个节点只有一个子节点,即当图很深但不是很宽时。

      【讨论】:

      • 考虑到 BFS 的空间复杂度是 b^d,BFS 占用的空间比 DFS 少似乎是一个非常极端的情况。
      • 在我在上面的评论中刷新了 b 和 d 的实际含义后,我记得每个具有一个子节点的节点都是 1^d。因此,我想只有一个子节点 是一种极端情况。 :-)
      【解决方案3】:

      可用于以最少步数解决搜索问题。 首先深入可能会导致(如果不以某种方式受到限制)无限深度。

      例如:找到离根最近的满足条件的节点。

      【讨论】:

      • 也就是说,BFS 是无限图的最简单解决方案?
      • 并非如此。这是一种天真的方法。如果您 100% 确定存在解决方案,那么它可以工作。但是,如果不存在解决方案并且您不限制搜索,那么这不是一个好方法。
      【解决方案4】:

      当您需要从没有边权重的图中获取到顶点的最短路径时。

      【讨论】:

      • 在这种情况下,BFS 如何成为最适合这项工作的工具?这不能使用 DFS 来完成吗?
      • @JasonBaker:找个时间试试吧!为了在具有大量循环的图中找到最短路径,DFS 需要不祥的簿记以防止重复工作并尝试确保进度。当 BFS 命中目标时,您就完成了,当 DFS 命中目标时,您必须继续前进,直到完全遍历完成,以确保您没有遗漏任何内容。 BFS 将每个节点访问到目标一次,DFS 将访问多次(再次,为了限制这种情况,它需要仔细记账和特定领域的启发式方法,这可能非常棘手)。
      【解决方案5】:

      深度优先搜索您可能会找到“本地”解决方案 - 要真正找到全局解决方案,您需要遍历整个图(或使用启发式)。

      【讨论】:

        【解决方案6】:

        BFS 有时非常有用。假设您有一棵树,比如说 WBS。您可能只想向用户展示其中的 1 个级别。

        【讨论】:

        【解决方案7】:

        如果您的搜索域是无限的,深度优先搜索并不能保证终止/找到解决方案,即使确实存在有限解决方案。

        您还可以看到更精细的算法(例如 A*)是广度优先搜索的特殊子类型。

        一般来说,bfs 是最优且完整的(具有有限的分支因子),而 dfs 不是。

        【讨论】:

          【解决方案8】:

          什么时候使用广度优先搜索才有意义?

          例如,当您需要在图中找到最短路径时,DFS 无法做到这一点。还有一些其他的应用程序,但总的来说,DFS 和 BFS 是处理不同数据结构的相同算法(BFS 使用队列,DFS 使用堆栈)。

          【讨论】:

            【解决方案9】:

            在广度优先搜索有用的情况下,还没有人提到一个关键因素:以一种方式访问​​节点可能会消除以其他方式访问节点的要求。在某些情况下,无论访问节点的顺序如何,最终都会执行相同的工作,但 BFS 一次待处理的操作将比 DFS 少得多。在其他情况下,按一个顺序访问节点可能比其他节点需要更多的工作。给出了各种最短路径算法作为示例。如果访问一个节点需要访问它的邻居,除非已知该节点可以通过比当前路径更短的路径到达,那么以广度优先顺序访问节点通常会导致节点被分配最短路径——或接近它的路径—— - 在他们第一次访问时。相比之下,深度优先搜索会导致许多节点第一次被非常长的路径访问,然后是稍微短一点的路径,然后是稍微短一点的路径,等等。这需要大量的工作。

            顺便说一句,深度优先和广度优先算法之间差异的一个很好的图形说明是区域泛洪填充,其中白色节点通过将其涂黑并对其邻居进行泛洪填充来进行泛洪填充。如果尝试从角落开始填充 NxN 正方形区域,深度优先操作将以螺旋或之字形序列填充正方形,而 NxN-1 操作保留在堆栈上。广度优先填充将从起点“倾泻”出来,并且无论要填充的形状如何,都最多有 O(N) 次操作待处理。顺便说一句,IBM BASICA 中的洪水填充就是这样工作的(我不确定 QBASIC)。

            【讨论】:

              【解决方案10】:

              广度优先搜索算法喜欢尽可能靠近起点。我能想到的一些情况是:

              1. 社交网站可以用它来寻找在 指定距离。
              2. 在种子下载/点对点网络中寻找 相邻的计算机。
              3. GPS 导航系统可以使用它来查找附近的位置。

              【讨论】:

                猜你喜欢
                • 2011-01-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-02-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多