通常当我不得不走图表时,由于空间复杂度较低,我总是使用深度优先搜索。我老实说从来没有见过要求广度优先搜索的情况,尽管我的经验非常有限。
什么时候使用广度优先搜索才有意义?
更新:我想我的回答here显示了我使用BFS的情况(因为我认为是DFS)。我仍然很想知道,为什么它在这种情况下很有用。
答案 0 :(得分:12)
当您想通过遍历尽可能少的边来到达节点时,即当您想要在未加权图中找到最短路径时。
深度优先搜索的空间复杂度也可以高于广度优先搜索的空间复杂度。每个节点只有一个子节点,即当图形很深但不是很宽时。
答案 1 :(得分:6)
如果您的搜索域是无限的,深度优先搜索不保证终止/找到解决方案,即使存在有限的解决方案。
此外,您可以看到更精细的算法,如A *,是广度优先搜索的特殊子类型。
通常,bfs既是最优的又是完整的(具有有限的分支因子),而dfs则不是。
答案 2 :(得分:3)
可用于以最少的步骤解决搜索问题。 首先进入深度可以导致(如果不是以某种方式限制)到无限深度。
Ex:找到满足条件的根最近的节点。
答案 3 :(得分:3)
在广度优先搜索有用的情况下,还没有人提到一个关键因素:以某种方式访问节点可能会消除以其他方式访问节点的要求。在某些情况下,无论访问节点的顺序如何,最终都会执行相同的工作,但BFS将一次处理的操作比DFS少得多。在其他情况下,一个序列中的访问节点可能需要比其他节点更多的工作;给出了各种最短路径算法作为其示例。如果访问节点需要访问其邻居,除非已知该节点可通过比当前节点短的路径到达,则以广度优先顺序访问节点通常会导致节点被分配最短路径 - 或者接近它的某个位置 - - 他们的第一次访问。相比之下,深度优先搜索会导致许多节点第一次被非常长的路径访问,然后是稍微更短的路径,然后是稍微更短的路径等,需要真正可怕的总工作量。
BTW,深度优先算法和广度优先算法之间差异的一个很好的图解说明是区域洪水填充,其中白色节点通过将其涂成黑色并充满其邻居来充满洪水。如果试图从cornder中开始填充NxN方形区域,则深度优先操作将以螺旋或Z字形序列填充方形,其中NxN-1操作保留在堆栈上。广度优先填充将从起点“倒出”,并且最多有O(N)个操作未决,无论要填充的形状如何。顺便说一下,IBM BASICA的泛滥工作就是这样(我不确定QBASIC)。答案 4 :(得分:2)
一个例子是遍历文件系统(递归深度有限)。
根据wikipedia,它对某些图算法(二分性,连通分量)也很有用。
答案 5 :(得分:2)
什么时候使用广度优先搜索才有意义?
例如,当您需要在图表中找到最短路径时 - DFS就是不能这样做。还有一些其他应用程序,但是,一般来说,DFS和BFS是处理不同数据结构的相同算法(BFS使用队列,DFS与堆栈一起工作)。
答案 6 :(得分:1)
当您需要从没有边缘权重的图形中获取到顶点的最短路径时。
答案 7 :(得分:1)
深入第一次搜索,您可以找到“本地”解决方案 - 真正找到遍历整个图表所需的全局解决方案(或使用启发式方法)。
答案 8 :(得分:1)
BFS有时非常有用。假设你有一棵树代表我们说WBS。您可能只想向用户呈现1级别。
答案 9 :(得分:1)
广度优先搜索算法喜欢尽可能接近起点。我能想到的一些情况是: