能否举个例子解释一下如何计算这两种遍历方法的时间和空间复杂度?
此外,深度优先遍历的递归解法如何影响时间和空间复杂度?
能否举个例子解释一下如何计算这两种遍历方法的时间和空间复杂度?
此外,深度优先遍历的递归解法如何影响时间和空间复杂度?
BFS:
时间复杂度为O(|V|)
,其中|V|
是节点数量。您需要遍历所有节点。
空间复杂度也是O(|V|)
- 因为在最坏的情况下,您需要在队列中保存所有顶点。
DFS:
时间复杂度同样为O(|V|)
,您需要遍历所有节点。
空间复杂度-取决于实现方式,递归实现可能具有O(h)
的空间复杂度[最坏情况],其中h
是树的最大深度。
使用堆栈的迭代解决方案实际上与BFS相同,只是使用堆栈而不是队列 - 因此您将获得O(|V|)
时间和空间复杂度。
(*) 请注意,对于树,空间复杂度和时间复杂度与一般图稍有不同,因为您不需要为树维护一个visited
集,而且|E|=O(|V|)
,因此|E|
因素实际上是多余的。
O(|V|)
。因为假设你有一个长度为|V|/2
的分支,你必须将所有这些|V|/2
个节点都保存在栈中。注意,答案说的是最坏情况下的行为。 - amit因为这是树的遍历,我们必须访问每个节点,使得时间复杂度为O(n),其中n是树中节点的数量。
BFS需要至少将一整层的树存储在队列中(参考队列实现)。对于一个完美的完全平衡二叉树来说,这将是(n/2 + 1)个节点(即最后一层)。在最佳情况下,即树严重不平衡并且每层只包含一个元素时,空间复杂度为O(1)。在最坏情况下,对于一个相当无用的N叉树,除了根节点外,所有节点都位于第二层,需要存储(n - 1)个节点。
无论是使用递归还是迭代的方法,堆栈(隐式或显式)将包含d个节点,其中d是树的最大深度。对于平衡树来说,这将是(log n)个节点。DFS的最坏情况是BFS的最佳情况,而DFS的最佳情况则是BFS的最坏情况。
复杂性有两个主要因素
它是生成节点所需的时间量。
在DFS中,所需时间量与深度和分支因子成比例。对于DFS,所需总时间由以下公式给出 -
1 + b + b2 + b3 + ... + bd ~~ bd
因此时间复杂度 = O(bd)
它是获取解决方案所需的空间或内存量,DFS仅存储其正在追求的当前路径。因此,空间复杂度是深度的线性函数。
因此空间复杂度为O(d)