首页 文章

什么是广度优先搜索有用?

提问于
浏览
23

通常当我由于空间复杂度较低时总是使用深度优先搜索 . 我老实说从来没有见过需要广度优先搜索的情况,尽管我的经验非常有限 .

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

UPDATE :我想我的回答here显示了我仍然很想知道的情况,为什么它在这种情况下很有用 .

10 回答

  • 2

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

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

  • 2

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

    您还可以看到更精细的算法,如A *,作为广度优先搜索的特殊子类型 .

    通常,bfs既是最优的又是完整的(具有有限的分支因子),而dfs则不是 .

  • 6

    可用于以最少的步骤解决搜索问题 . 首先进入深度可能导致(如果不是以某种方式限制)到无限深度 .

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

  • 3

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

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

  • 12

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

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

  • 1

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

    例如,当您需要在图表中找到最短路径时 - DFS就是不能这样做 . 还有一些其他应用程序,但是,通常,DFS和BFS是处理不同数据结构的相同算法(BFS使用队列,DFS使用堆栈) .

  • 1

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

  • 1

    在深度优先搜索中,您可以找到“本地”解决方案 - 真正找到遍历整个图形所需的全局解决方案(或使用启发式) .

  • 3

    BFS有时非常有用 . 假设你有一棵树代表我们说的WBS . 您可能只想向用户呈现1级 .

  • 1

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

    • 社交网站可以使用它来查找指定距离的人 .

    • 在托管/点对点网络中查找相邻计算机非常有用 .

    • GPS导航系统可以用它来查找附近的位置 .

相关问题