图形数据结构:DFS与BFS?

时间:2010-04-13 00:00:53

标签: graph graph-theory

如果给出图形问题,我们如何知道是否需要使用bfs或dfs算法? 或者我们何时使用dfs算法或bfs算法。 一个人与另一个人的区别和优势是什么?

5 个答案:

答案 0 :(得分:81)

BFS将根据分支因素使用更多内存...但是,BFS是一个完整的算法...这意味着如果您使用它来搜索可能的最低深度的东西,BFS将为您提供最佳解。 BFS空间复杂度为O(b^d) ...分支因子提升到深度(可能是很多内存)。

另一方面,DFS对空间要好得多,但它可能会找到一个次优的解决方案。意思是,如果您只是搜索从一个顶点到另一个顶点的路径,您可能会在找到真正的最短路径之前找到次优解(并停在那里)。 DFS空间复杂度为O(|V|) ...意味着它可以占用的最大内存是最长的路径。

它们具有相同的时间复杂性。

在实施方面,BFS通常使用Queue实施,而DFS使用Stack

答案 1 :(得分:6)

广度首先搜索兄弟姐妹。深度首先显然是先搜索孩子。所以,我想这取决于你想要做什么样的搜索。跨字段的关系类型搜索可能会适用于bfs,其中层次结构(树,文件夹,等级等)更适合作为dfs。

答案 2 :(得分:4)

图遍历都有一个原因:图的完全遍历,访问图中的每个顶点。如果你没有内存限制,DFS是一个不错的选择,因为BFS占用了大量空间。 因此,在这两者之间进行选择取决于您的要求。

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

BFS如果要测试图是否为二分图,请找到两个节点或需要此类任务的应用程序之间的最短路径。

答案 3 :(得分:2)

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

答案 4 :(得分:-2)

BFS非常适合最短路径而DFS不是。