图表数据结构:DFS vs BFS?

如果给出一个graphics问题,我们如何知道我们是否需要使用bfs或dfsalgorithm? 或者我们什么时候使用dfsalgorithm或bfsalgorithm。 一个优于另一个的区别和优点是什么?

BFS将根据分支因子使用更多的内存…但是,BFS是一个完整的algorithm…这意味着如果您正在使用它来以尽可能最低的深度search某些内容,BFS将为您提供最佳解决scheme。 BFS的空间复杂度是O(b^d) …提高到深度的分支因子(可以是很多内存)。

另一方面,DFS在空间上要好得多,但它可能找不到最理想的解决scheme。 这意味着,如果您只是寻找从一个顶点到另一个顶点的path,那么在find真正的最短path之前,您可能会find次优解(并停在那里)。 DFS的空间复杂度是O(|V|) …这意味着它可以占用的最多的内存是最长的path。

他们有相同的时间复杂性。

就实现而言,BFS通常使用Queue实现,而DFS使用Stack

广度首先search兄弟姐妹。 深度首先明显是search孩子。 所以,我想这将取决于你想要做什么样的search。 关系typessearch跨域可能会借给自己的bfs,其中分层(树,文件夹,行列等)将更适合作为一个dfs。

图遍历都承诺一件事情:完全遍历图,访问图中的每个顶点。 如果你没有内存限制,DFS是一个不错的select,因为BFS占用了大量的空间。 所以,这两者之间的select取决于你的要求。

想要find(强烈/)连接组件的graphics? 或解决迷宫或数独? 使用DFS。 如果仔细观察,预订,后序和有序都是DFS的变种。 所以,是的,这是一些有趣的应用程序。

BFS如果要testing一个图是否是双向的,请find需要此类任务的两个节点或应用程序之间的最短path。

在bfs中使用队列,而在dfs堆栈中则根据图遍历来存储顶点。
2在bfs过程中完成了级别到级别(根据有向或无向图),而在dfs中,过程完成到深度(首先访问根节点的过程,另一个远程完成,然后从最后一个节点应用回溯到根节点)。

BFS对于最短path非常好,而DFS则不是。