Graph 图数据结构:DFS与BFS?

Graph 图数据结构:DFS与BFS?,graph,graph-theory,Graph,Graph Theory,如果给定一个图问题,我们如何知道是否需要使用bfs或dfs算法??? 或者何时使用dfs算法或bfs算法。 两者之间的区别和优势是什么?广度优先搜索兄弟姐妹优先。深度优先显然是先搜索儿童。所以,我想这取决于你想做什么样的搜索。跨字段的关系类型搜索可能适用于bfs,其中层次结构(树、文件夹、列组等)更适合作为dfs。bfs将根据分支因子使用更多内存。。。然而,BFS是一个完整的算法。。。也就是说,如果你用它在尽可能低的深度上搜索某些东西,BFS会给你最佳的解决方案。 BFS空间复杂度为O(b^d)

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

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

bfs将根据分支因子使用更多内存。。。然而,BFS是一个完整的算法。。。也就是说,如果你用它在尽可能低的深度上搜索某些东西,BFS会给你最佳的解决方案。 BFS空间复杂度为
O(b^d)
。。。分支因子提升到一定深度(可能会占用大量内存)

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

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


就实现而言,BFS通常使用
队列
实现,而DFS使用
堆栈

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

要查找图的(强/)连接组件吗?还是解决迷宫?还是数独? 使用DFS。如果仔细观察,预订单、后订单和顺序都是DFS的变体。是的,这是一些有趣的应用


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

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

两者的时间复杂度都是:O(b^d)。。。这意味着它基于分支因子和搜索深度。BFS和DFS具有相同的最坏情况。。。搜索整棵树。这里有一个很好的链接,供您评论何时可以使用其中任何一棵树。这本书(算法简介)说BFS的时间复杂度是O(V+E),而DFS是θ(V+E)。这是为什么呢?Re O vsθ:BFS也应该是θ(这一点并不矛盾),因为每个节点最初都是白色的,我们必须尊重θ(E)边。空间复杂性:DFS和BFS都在线性空间中执行,但DFS不会经常遇到最坏的情况。如果是这样的话,访问的节点集(Cormen中的颜色)将被删除,并且可以使用诸如IDDF之类的算法,这些算法不需要线性空间(或者至少可以自适应地分配)。关于内存使用情况,答案是不正确的。两者都会消耗更糟糕的O(V)内存。BFS的最坏情况是一个父节点有n个子节点,而DFS的最坏情况是n个节点链,每个父节点有一个子节点。因此,根据图的拓扑结构,BFS或DFS都有同等的获胜机会。还包含一些答案。这是否回答了您的问题?