【问题标题】:Worst case complexity analysis of a Binary Tree function "leaves"二叉树函数“叶子”的最坏情况复杂性分析
【发布时间】:2018-12-15 00:27:39
【问题描述】:

我想知道我的复杂性分析(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

【问题讨论】:

    标签: haskell time-complexity binary-tree


    【解决方案1】:

    不,有很多错误。以下是一些比较明显的:

    • 当你写T(n/2)+T(n/2)+T(n/4)+T(n/4)+... 时,你似乎假设一半的节点在左分支,一半在右分支。这并不总是正确的——有些树是平衡的,但有些肯定不是。
    • 即使树是平衡的,也不仅有 2 个大小为 n/4 的子树,还有 4 个。同样,有 8 个大小为 n/8 的子树,而不是 2 个。
    • 描述“将n除以2i次”的正确表达是n/(2^i),而不是n/(i^2)。此外,尽管上面提到了关于平衡的评论,但您仍希望继续除法,直到您只到达一片叶子,因此省略号的正确基本情况是 T(n/n),而不是 T(n/(2^n))T(n/(n^2)) 之一。
    • 如果您反复除以 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 + ... 发散,即使 f(1 + 1/2 + 1/4 + 1/8 + 1/16 + ...) = f(2) = 1

    【讨论】:

    • 好的,感谢您的快速答复。我认为二叉树需要有 2 个孩子。
    • @Doesbaddel 是的,二叉树中的内部节点有两个孩子。您是否相信我的部分回答不同意这一点?如果有,是哪一部分?
    • @Doesbaddel 二叉树中的一个内部节点最多 2个子节点。 full 二叉树是一种特殊情况,其中每个内部节点正好有 2 个子节点。
    • 感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多