我想知道我的复杂度分析(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
答案 0 :(得分:4)
不,有很多错误。以下是一些更明显的内容:
T(n/2)+T(n/2)+T(n/4)+T(n/4)+...
时,您似乎在假设一半的节点在左分支中,而另一半在右边。并非总是如此-有些树是平衡的,但有些肯定不是。n
除以2 i
次的正确表达式是n/(2^i)
,而不是n/(i^2)
。此外,尽管有关于平衡的上述评论,您仍希望继续划分,直到仅到达一片叶子为止,因此省略号的正确基数是T(n/n)
,而不是T(n/(2^n))
或{{1 }}。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 + ...
也发散了。