Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 广度优先搜索对什么有用?_Algorithm_Search_Graph Theory_Breadth First Search_Depth First Search - Fatal编程技术网

Algorithm 广度优先搜索对什么有用?

Algorithm 广度优先搜索对什么有用?,algorithm,search,graph-theory,breadth-first-search,depth-first-search,Algorithm,Search,Graph Theory,Breadth First Search,Depth First Search,通常,当我必须遍历一个图时,我总是使用深度优先搜索,因为空间复杂度较低。老实说,我从未见过需要广度优先搜索的情况,尽管我的经验相当有限 什么时候使用广度优先搜索才有意义 更新:我想我的回答显示了我使用BFS的情况(因为我认为是DFS)。不过,我仍然很好奇,为什么它在这种情况下有用。一个例子是遍历文件系统(递归深度有限) 根据,它对于某些图形算法(二部性、连接组件)也很有用。当您希望通过尽可能少的边来到达节点时,即当您希望在未加权的图形中找到最短路径时 此外,深度优先搜索的空间复杂度可能高于广度优

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

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


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

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


根据,它对于某些图形算法(二部性、连接组件)也很有用。

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


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

可用于以最少的步骤解决搜索问题。 首先深入可能导致(如果不受限制的话)无限深


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

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

在深度优先搜索中,您可能会找到“局部”解-要真正找到全局解,您需要遍历整个图(或使用启发式).BFS有时真的很有用。假设你有一棵树,它代表WBS。您可能只想向用户显示其中的一个级别。

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

此外,您还可以看到更复杂的算法,如A*是广度优先搜索的一个特殊子类型

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

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


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

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


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

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

  • 社交网站可以用它来寻找网上的人 指定的距离
  • 它在Torrent/peer-to-peer网络中非常有用 邻近的计算机
  • GPS导航系统可以利用它找到附近的位置

  • 在这种情况下,BFS如何成为工作的最佳工具?这难道不能用DFS来完成吗?@JasonBaker:找个时间试试吧!为了在具有大量循环的图中找到最短路径,DFS需要进行不祥的簿记,以防止重复工作并确保进度。当BFS到达一个目标时,您就完成了,当DFS到达一个目标时,您必须继续前进,直到完成完整的遍历,以确保您没有错过任何东西。BFS访问目标的每个节点一次,DFS将访问很多次(同样,要限制这一点,需要仔细的簿记和特定领域的启发式,这可能非常棘手)。因此,换句话说,BFSE是无限图的最简单解决方案?不是真的。这是一种幼稚的方法。如果您100%确定某个解决方案存在,那么它就可以工作。但是如果不存在解决方案,并且您不限制搜索,那么这不是一个好方法。考虑到BFS的空间复杂性是b^d,BFS占用的空间比DFS少,这似乎是一个非常极端的情况。在我重新了解了我在上述评论中b和d的实际含义之后,我记得每个有一个子节点的节点都是1^d。因此,我认为只有一个子节点是一种极端情况。:-)工作分解结构;)