当前位置: 首页 > 知识库问答 >
问题:

算法:输出树作为子图与DFS和BFS的区别

索和璧
2023-03-14

我是一名本科生,正在读《科曼简介》。准备第三次考试,准备期末考试。

在第22章(第603页)中,它讨论了DFS如何将前置子图作为森林生成,以及BFS如何将前置子图作为树生成。我只是不明白。

我的想法是:

如果顶点v可以从一个开始搜索的源顶点s到达,那么顶点v是否有一些前身(可能是不同的,但存在),而不管在输入图上运行DFS或BFS?也就是说,DFS和BFS都可以访问它。

如果是这样,为什么DFS可以从中生成一个森林,而BFS只能生成一棵树?

提前谢谢!

共有1个答案

高墨一
2023-03-14

检查第603页的下划线注释,该注释以“宽度优先搜索仅限于一个源,而深度优先搜索可能从多个源进行搜索,这似乎是任意的……”

源的数量是一个是树(单根/源)和另一个是林(多根/源)的原因。

注:这当然不是概念上的差异,只是作者出于下划线注释中解释的原因所作的选择。

 类似资料:
  • 来自topcoder的一篇文章: “在BFS中,我们在将顶点推入队列时标记访问的顶点,而不是在DFS中弹出顶点时标记访问的顶点。” 注意:这是在使用显式堆栈(伪dfs)实现dfs时说的。 我的问题是为什么会这样?为什么我们不能在从队列弹出后标记访问的顶点,而在bfs的情况下推到队列上?

  • 本文向大家介绍BFS和DFS的实现思想相关面试题,主要包含被问及BFS和DFS的实现思想时的应答技巧和注意事项,需要的朋友参考一下 参考回答: BFS:(1)顶点v入队列(2)当队列为非空时继续执行否则停止(3)从队列头取顶点v,查找顶点v的所有子节点并依次从队列尾插入(4)跳到步骤2 DFS:(1)访问顶点v并打印节点(2)遍历v的子节点w,若w存在递归的执行该节点。

  • 查看BFS和DFS算法,它们似乎将节点标记为已访问。如果我只在树中导航,我的实现是否仍然需要将节点标记为已访问?我想对每个节点执行一次操作。 它似乎只适用于存在循环的图形,这样我就有可能两次碰到同一个节点。如果我递归地对一棵树进行调用,那么似乎不需要具有已访问状态,因为在堆栈中的所有调用返回到当前节点之后,我可以选择在节点上执行我想要的操作。我的假设正确吗? 谢谢

  • 我意识到BFS和DFS在一般图上的运行时间是O(n+m),其中n是节点数,m是边数,这是因为对于每个节点,必须考虑它的邻接列表。但是,当BFS和DFS在二叉树上执行时,它的运行时是什么呢?我相信它应该是O(n),因为可以走出一个节点的边的可能数量是恒定的(即2)。请确认这是否是正确的理解。如果不是,那么请解释一个二叉树上BFS和DFS的正确时间复杂度是多少?

  • 我有一个图数据结构,它是我从本文中复制的-http://www.dreamincode.net/forums/topic/377473-graph-data-structure-tutorial/ 我想在上面实现BFS算法。我不完全确定如何--我看到/读到的大多数关于该算法的文章都使用了更简单的数据结构。该数据结构存储顶点的散列映射,并将其字符串表示形式作为键,然后还存储边的散列映射,使用整数作为

  • 另一个问题只回答了如何检测一个周期,而不是输出它。所以,我想在一个无向图上写一个算法,在O(V+E)时间内运行BFS或DFS(V=顶点,E=边),如果有循环,则输出循环。 到目前为止,我所知道的是BFS/DFS是如何工作的,如果访问已经标记为已访问的节点,可以使用BFS检测周期。