【问题标题】:break-down complexity of BST traversalBST遍历的分解复杂度
【发布时间】:2015-03-24 13:49:24
【问题描述】:

我在Python中有如下BST遍历函数:

def print_tree(tree):
    if tree == None:
        return
    else:
        print tree.value
        print_tree(tree.left)
        print_tree(tree.right)

最坏情况下的时间复杂度是O(n),但我很难证明这一点。我正在尝试使用常量 c 来分解它,这就是我所拥有的:

T(n) = 2T(n-1) + cn

T(n) 用于递归调用,cn 用于打印语句。但这似乎并不正确。

【问题讨论】:

    标签: python recursion big-o time-complexity


    【解决方案1】:

    只是展开递归关系:

    T(1) = c*n
    T(2) = 3*c*n
    T(3) = 7*c*n
    T(4) = 15*c*n
    ...
    

    如您所见,您永远不会在n 中获得非线性术语。

    直观地说,复杂性是线性的,因为您在每个节点上做的工作量是恒定的,并且从不多次访问一个节点。

    如果树是平衡的,递归关系就变成了

    T(n) = 2T(n/2) + cn
    

    并且可以使用master theorem(案例1)来解决给O(n)

    【讨论】:

      【解决方案2】:

      递归关系应该是

      T(n) = 2T(n/2) + cn
      

      然后从这个answer 你可以解决你的递归关系。假设 cn = Θ(1)

      T(n)=2T(n/2)+Θ(1)
           =2T(n/2)+k
           =2{2T(n/4)+k)+k
           =4T(n/4)+3k
           =...
           =n.T(1)+(n-1)k
           =n.k+(n-1)k
           =2nk-k
           =O(n).
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-29
        • 1970-01-01
        • 2012-12-14
        • 2022-07-01
        • 1970-01-01
        相关资源
        最近更新 更多