【发布时间】:2023-03-21 20:50:01
【问题描述】:
谁能举例说明我们如何计算这两种遍历方法的时间和空间复杂度?
另外,深度优先遍历的递归解决方案如何影响时间和空间复杂度?
【问题讨论】:
-
@hc_:维基百科文章讨论了一般图,其中 DFS 必须维护
visited集。这对树木来说不是必需的。 -
很好地参考了这个问题:towardsdatascience.com/…
标签: algorithm
谁能举例说明我们如何计算这两种遍历方法的时间和空间复杂度?
另外,深度优先遍历的递归解决方案如何影响时间和空间复杂度?
【问题讨论】:
visited 集。这对树木来说不是必需的。
标签: algorithm
BFS:
时间复杂度为O(|V|),其中|V| 是节点数。您需要遍历所有节点。
空间复杂度也是O(|V|) - 因为在最坏的情况下,您需要保留队列中的所有顶点。
DFS:
时间复杂度又是O(|V|),需要遍历所有节点。
空间复杂度 - 取决于实现,递归实现可以具有O(h) 空间复杂度[最坏情况],其中h 是树的最大深度。
使用带有堆栈的迭代解决方案实际上与 BFS 相同,只是使用堆栈而不是队列 - 因此您将获得 O(|V|) 时间和空间复杂度。
(*) 请注意,树的空间复杂度和时间复杂度与一般图略有不同,因为您不需要为树维护visited 集和|E| = O(|V|),因此@ 987654330@ 因子实际上是多余的。
【讨论】:
O(|V|),因为假设您有一个长度为|V|/2 的分支,您将必须在堆栈中保存所有这些|V|/2 节点。请注意,答案说这是最坏的情况。
因为这是树遍历,我们必须触及每个节点,使得这个 O(n),其中 n 是树中的节点数。
BFS 必须在队列中至少存储整个级别的树(示例 queue implementation)。对于完美的完全平衡二叉树,这将是 (n/2 + 1) 个节点(最后一层)。 最佳情况(在此上下文中),树严重不平衡,每个级别仅包含 1 个元素,空间复杂度为 O(1)。 最坏的情况将存储 (n - 1) 个具有相当无用的 N-ary 树的节点,其中除了根节点之外的所有节点都位于第二级。
无论实现方式(递归或迭代),堆栈(隐式或显式)都将包含 d 个节点,其中 d 是树的最大深度。对于平衡树,这将是 (log n) 个节点。 DFS 的 Worst Case 将是 BFS 的最佳情况,而 DFS 的 Best Case 将是 BFS 的最坏情况。
【讨论】:
复杂性有两个主要因素
这是生成节点所需的时间。
在 DFS 中,所需的时间量与深度和分支因子成正比。对于 DFS,所需的总时间由 -
1 + b + b2 + b3 + ... + bd ~~ bd
因此时间复杂度 = O(bd)
这是获得解决方案所需的空间或内存量 DFS 仅存储它所追求的当前路径。因此,空间复杂度是深度的线性函数。
所以空间复杂度由O(d)给出
【讨论】: