Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 广度优先和深度优先树遍历的时间和空间复杂性是多少?_Algorithm - Fatal编程技术网

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

Algorithm 广度优先和深度优先树遍历的时间和空间复杂性是多少?,algorithm,Algorithm,有人能举例说明我们如何计算这两种遍历方法的时间和空间复杂度吗 此外,深度优先遍历的递归解决方案如何影响时间和空间复杂性?BFS: 时间复杂度为O(|V |),其中|V |是节点数。您需要遍历所有节点。 空间复杂性也是O(| V |)——因为在最坏的情况下,您需要保留队列中的所有顶点 DFS: 时间复杂性再次是O(| V |),您需要遍历所有节点。 空间复杂度-取决于实现,递归实现可以具有O(h)空间复杂度[最坏情况],其中h是树的最大深度。 对堆栈使用迭代解决方案实际上与BFS相同,只是使用堆栈

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

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

BFS:

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

DFS:

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


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

有两个主要的复杂度因子

  • 时间复杂性
  • 空间复杂性

  • 时间复杂性 它是生成节点所需的时间量

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

    1+b+b2+b3+…+bd~~bd

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


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

    所以空间复杂度由DFS和BFS时间复杂度O(n)给出 因为这是树遍历,所以我们必须接触每个节点,使其成为O(n),其中n是树中的节点数

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

    DFS空间复杂度:O(d)
    不管实现如何(递归或迭代),堆栈(隐式或显式)都将包含d个节点,其中d是树的最大深度。对于平衡树,这将是(logn)个节点。DFS的最坏情况将是BFS的最佳情况,DFS的最佳情况将是BFS的最坏情况。

    维基百科上有相当不错的解释:@hc\ux:wikipedia文章讨论了一般图,DFS必须在图中维护
    已访问的
    集。这对于树不是必需的。很好地回答了这个问题:@500_错误对于树,您不需要访问集-因为从根到每个节点只有一条路径。访问集的目的是避免多次重新扩展同一个节点,但由于存在单一路径,这是不可能发生的(在有向图中,不需要更多数据,在无向图中,需要记住前面每个节点的父节点,仅此而已),我不确定这个答案是否正确?它说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)。对于队列,假设根节点有所有其他节点作为其子节点;对于堆栈,假设有一个链表。@marainesparnisari,因为问题是关于树的。树中有n-1条边,因此遍历所有边和所有顶点的步骤与遍历所有顶点的步骤相同。(请注意,答案明确地解释了这一点)。这不适用于树遍历,这是一种特殊情况。所以这个答案可能是误导的。它应该是O(V+E),你也需要考虑边。@ Kyle,如果你是正常的图表,你是对的。对于二叉树来说,它是O(N),因为边的数量是恒定的。如果你在寻找树,这是最好的答案。所有树(二叉树或非二叉树)都有N-1条边。O(n+(n-1))=O(n)