【问题标题】:What is the time and space complexity of a breadth first and depth first tree traversal?广度优先和深度优先树遍历的时间和空间复杂度是多少?
【发布时间】:2023-03-21 20:50:01
【问题描述】:

谁能举例说明我们如何计算这两种遍历方法的时间和空间复杂度?

另外,深度优先遍历的递归解决方案如何影响时间和空间复杂度?

【问题讨论】:

标签: algorithm


【解决方案1】:

BFS:

时间复杂度为O(|V|),其中|V| 是节点数。您需要遍历所有节点。
空间复杂度也是O(|V|) - 因为在最坏的情况下,您需要保留队列中的所有顶点。

DFS:

时间复杂度又是O(|V|),需要遍历所有节点。
空间复杂度 - 取决于实现,递归实现可以具有O(h) 空间复杂度[最坏情况],其中h 是树的最大深度。
使用带有堆栈的迭代解决方案实际上与 BFS 相同,只是使用堆栈而不是队列 - 因此您将获得 O(|V|) 时间和空间复杂度。

(*) 请注意,树的空间复杂度和时间复杂度与一般图略有不同,因为您不需要为树维护visited 集和|E| = O(|V|),因此@ 987654330@ 因子实际上是多余的。

【讨论】:

  • @500_error 对于,您不需要访问集——因为从根到每个节点只有一条路径。访问集的目的是避免多次重新扩展同一个节点,但是由于只有一条路径 - 这不可能发生(在有向图中 - 不需要更多数据,在无向图中,需要记住前面的每个节点就是这样)
  • 我不确定这个答案是否正确?它说使用堆栈的 DFS 的空间复杂度是 O(|V|)。但是,堆栈实现仅使用 O(bd) 空间,其中 b 是分支因子,d 是深度。但是,bd != V。另一方面,b^d = V。因此,我认为空间复杂度可以更紧密地以 O(bd) 为界,而不是 O(|V|)。
  • @nave 在最坏的情况下,这是O(|V|),因为假设您有一个长度为|V|/2 的分支,您将必须在堆栈中保存所有这些|V|/2 节点。请注意,答案说这是最坏的情况。
  • @Jack 在最坏的情况下,它将包含 N-1,即 O(N)。对于队列,想象根有所有其他节点作为其子节点,对于堆栈,想象一个链表。
  • @MariaInesParnisari 因为问题是关于一棵树的。一棵树有n-1条边,所以遍历所有的边和所有的顶点和遍历所有的顶点是一样的。 (请注意,答案明确解释了这一点)。
【解决方案2】:

DFS 和 BFS 时间复杂度:O(n)

因为这是树遍历,我们必须触及每个节点,使得这个 O(n),其中 n 是树中的节点数。

BFS 空间复杂度:O(n)

BFS 必须在队列中至少存储整个级别的树(示例 queue implementation)。对于完美的完全平衡二叉树,这将是 (n/2 + 1) 个节点(最后一层)。 最佳情况(在此上下文中),树严重不平衡,每个级别仅包含 1 个元素,空间复杂度为 O(1)。 最坏的情况将存储 (n - 1) 个具有相当无用的 N-ary 树的节点,其中除了根节点之外的所有节点都位于第二级。

DFS 空间复杂度:O(d)

无论实现方式(递归或迭代),堆栈(隐式或显式)都将包含 d 个节点,其中 d 是树的最大深度。对于平衡树,这将是 (log n) 个节点。 DFS 的 Worst Case 将是 BFS 的最佳情况,而 DFS 的 Best Case 将是 BFS 的最坏情况。

【讨论】:

  • 应该是O(V+E),边也需要考虑。
  • @Kyle,如果是正态图,你是对的。在二叉树的情况下,它的 O(N) 因为边数是恒定的
  • 如果您正在寻找树木,这是最好的答案。
  • 所有树(二叉或非二叉树)都有 n-1 条边。 O(n + (n-1)) = O(n)
【解决方案3】:

复杂性有两个主要因素

  1. 时间复杂度
  2. 空间复杂度

时间复杂度

这是生成节点所需的时间。

在 DFS 中,所需的时间量与深度和分支因子成正比。对于 DFS,所需的总时间由 -

1 + b + b2 + b3 + ... + bd ~~ bd

因此时间复杂度 = O(bd)


空间复杂度

这是获得解决方案所需的空间或内存量 DFS 仅存储它所追求的当前路径。因此,空间复杂度是深度的线性函数。

所以空间复杂度由O(d)给出

【讨论】:

  • 这不适用于树遍历,这是一种特殊情况。所以这个答案可能会产生误导。
  • 应该是 O(h)。因为 d 指的是深度是相对于一个节点。
  • 对于图遍历,它将是 O(V+E)。图密集时的最坏情况 O(n^2),即所有节点都相互连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
相关资源
最近更新 更多