二叉树函数“叶”的最坏情况复杂度分析

时间:2018-07-06 11:40:38

标签: haskell time-complexity binary-tree

我想知道我的复杂度分析(n个元素/节点的T最坏情况)对于Haskell中的以下函数叶是否正确(注意:wurzel =根; C =常数因子)

--abstract data type for bin trees

data Bintree el = Empty
                  | Node {left :: Bintree el, root :: el, right :: Bintree el} 
                    deriving Show

--extract all leaves of a given Bintree (output: list)

leaves :: Bintree el -> [el]
leaves Empty = []
leaves (Node Empty root Empty) = [root]
leaves (Node left root right) = leaves left ++ leaves right

rendered complexity analysis

1 个答案:

答案 0 :(得分:4)

不,有很多错误。以下是一些更明显的内容:

  • 编写T(n/2)+T(n/2)+T(n/4)+T(n/4)+...时,您似乎在假设一半的节点在左分支中,而另一半在右边。并非总是如此-有些树是平衡的,但有些肯定不是。
  • 即使树是平衡的,也不仅仅只有2个大小为n / 4的子树-就有4个。类似地,还有8个大小为n / 8的子树,而不是2。
  • 描述“将n除以2 i次的正确表达式是n/(2^i),而不是n/(i^2)。此外,尽管有关于平衡的上述评论,您仍希望继续划分,直到仅到达一片叶子为止,因此省略号的正确基数是T(n/n),而不是T(n/(2^n))或{{1 }}。
  • 如果您反复除以2,然后将结果相加(如T(n/(n^2))一样,则永远是n + n/2 + n/4 + n/8 + n/16 + ...,而不是2*n
  • 无论如何,这并不适用,因为您没有添加log_2(n)的倍数。 n不一定以任何特殊方式与T(n) + T(n/2) + T(n/4) + T(n/8) + T(n/16) + ...相关(也不与T(2*n)相关)。例如,假设T(log_2(n))。然后,即使f(n) = 1,总和f(1) + f(1/2) + f(1/4) + f(1/8) + f(1/16) + ... = 1 + 1 + 1 + 1 + 1 + ...也发散了。