广度优先和深度优先树遍历的时间和空间复杂度是多少?

题 广度优先和深度优先树遍历的时间和空间复杂度是多少?

 

有人可以用一个例子来解释我们如何计算这两种遍历方法的时间和空间复杂度?

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

 

 20

 2018-03-23 17:56



起源

  •  
  •  
  •  
  •  
  •  
  •  

 


维基百科上提供了相当不错的解释: en.wikipedia.org/wiki/Depth-first_search  en.wikipedia.org/wiki/Breadth-first_search - hc_

@hc_:维基百科文章讨论了DFS必须维护的一般图表 visited 组。这不是树木的必需品。 - amit

 


答案:


BFS:

时间复杂性是 O(|V|) 哪里 |V| 是节点数,需要遍历所有节点。 
太空竞争力是 O(|V|) 同样 - 因为在最坏的情况下你需要保持队列中的所有顶点。

DFS:

时间复杂性再次出现 O(|V|),你需要遍历所有节点。 
空间复杂性 - 取决于实现,递归实现可以有一个 O(h) 空间复杂性[最坏情况],在哪里 h 是树的最大深度。 
使用带有堆栈的迭代解决方案实际上与BFS相同,只是使用堆栈而不是队列 - 所以你得到两者 O(|V|) 时间和空间的复杂性。

(*)请注意,对于树而言,空间复杂度和时间复杂度稍有不同,因此对于一般图形而言,因为您不需要维护 visited 设置为一棵树,和 |E| = O(|V|), 所以 |E| 因素实际上是多余的。

 

 40

 2018-03-23 18:04


 


“你不需要维护树的访问集”我认为在BFS中你需要维护一个访问集,你能提供一个参考。 - archie

@ 500_error对于一个 树,您不需要访问集 - 因为从根到每个节点都有一条路径。访问集的目的是避免多次重新扩展同一节点,但由于存在单个路径 - 不可能发生(在有向图中 - 不需要任何更多数据,在无向图中,需要记住父节点前面的每个节点都是这样的) - amit

我不确定这个答案是否正确?它说DFS的空间复杂度是使用堆栈的O(| V |)。但是,堆栈实现仅使用O(bd)空间,其中b是分支因子,d是深度。但是,bd!= V.另一方面,b ^ d = V.因此,我认为空间复杂度可以通过O(bd)更紧密地界定,而不是说O(| V |)。 - nave

@nave在最坏的情况下,这是 O(|V|),因为假设你有一个长度分支 |V|/2,你将不得不持有所有这些 |V|/2 堆栈中的节点。请注意,答案说这是最糟糕的情况。 - amit

@amit - 在迭代实现中,当访问时,分别从DFS和BFS的堆栈或队列中弹出节点。那么为什么空间复杂度是O(N)?未访问的堆栈或队列永远不会包含所有节点。我哪里错了? - Jack

 


复杂性有两个主要因素

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

时间复杂性

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

在DFS中,所需的时间量与深度和分支因子成比例。对于DFS,所需的总时间由下列人员给出:

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

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


空间复杂性

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

因此空间复杂性由 O(d)

 

 4

 2018-05-15 10:02


 


这不适用于树遍历,这是一种特殊情况。所以这个答案可能会产生误导。 - xji

 


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

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

BFS空间复杂度:O(n)

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

DFS空间复杂度:O(d)

无论实现(递归还是迭代),堆栈(隐式或显式)都将包含d个节点,其中d是树的最大深度。使用平衡树,这将是(log n)节点。 最坏的情况下 对于DFS来说,这将是BFS的最佳案例 最佳案例 DFS将是BFS最糟糕的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值