【问题标题】:Binary Tree array list representation二叉树数组列表表示
【发布时间】:2012-10-29 04:23:28
【问题描述】:

我一直在对二叉树和数组列表表示进行一些研究。我很难理解最坏情况下的空间复杂度是 O(2^n)。具体来说,这本书指出,空间使用量为 O(N)(N = 数组大小),在最坏的情况下为 O(2^n)。我原以为在最坏的情况下它会是 2n,因为每个节点都有两个子节点(索引)而不是 O(2^n),其中 n = no。的元素。

例如,如果我有一个有 7 个节点的二叉树,那么空间将是 2n = 14 而不是 2^n = 128。

【问题讨论】:

  • 也称为Heap。当你说空间是(2^n)时,你的意思是2^height

标签: algorithm time-complexity asymptotic-complexity


【解决方案1】:

这是在数组上的堆实现。在哪里

A[1..n]
left_child(i) = A[2*i]
right_child(i) = A[2*i+1]
parent(i) = A[floor(i/2)]

现在,来到太空。直观地思考,

当您插入第一个元素 n=1 时,location=A[1],类似地,

n=2 @A[2] left_child(1)
n=3 @A[3] right_child(1)
n=4 @A[4] left_child(2)
n=5 @A[5] right_child(2)

你看,nth 元素将进入A[n]。所以空间复杂度是O(n)

当您编码时,您只需将要插入的元素插入到最后说A[n+1],并说它是floor((n+1)/2) 的子元素。

参考:http://en.wikipedia.org/wiki/Binary_heap#Heap_implementation


堆是一个几乎完整的树,因此树中的元素总数将为2<sup>h-1</sup> &lt; n &lt;= 2<sup>h+1</sup>-1,这就是您需要的数组长度。参考:this

【讨论】:

    【解决方案2】:

    二叉树的最坏情况空间复杂度为 O(n)(在您的问题中不是 O(2^n)),但是如果它几乎是一棵完整的二叉树,则使用数组表示二叉树可以节省指针空间.

    http://en.wikipedia.org/wiki/Binary_tree#Arrays

    【讨论】:

      【解决方案3】:

      我认为这是指将任意二叉树存储在数组表示中,通常用于完全几乎完全二叉树,尤其是在堆的实现中。

      在此表示中,根存储在数组中的索引0,对于索引为n 的任何节点,其左右子节点分别存储在索引2n+12n+2

      如果你有一个退化的树,其中没有节点有任何正确的孩子(树实际上是一个链表),那么第一个项目将存储在索引0, 1, 3, 7, 15, 31, ...。一般来说,这个列表的第n项(从0开始)将存储在索引2<sup>n</sup>-1,所以在这种情况下,数组表示需要θ(2<sup>n</sup>)空间。

      【讨论】:

        猜你喜欢
        • 2012-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-22
        • 1970-01-01
        • 1970-01-01
        • 2021-04-04
        • 1970-01-01
        相关资源
        最近更新 更多