【问题标题】:Why is a binary heap better as an array than a tree?为什么二叉堆作为数组比树更好?
【发布时间】:2013-02-05 23:37:50
【问题描述】:

在创建二进制最大堆时,为什么最好将其实现为基于数组而不是基于树(基于树,每个节点也有一个指向其父节点的指针)? 在运行时分析、内存使用、性能方面......

对于二进制最大堆,运行时间为:

  • 插入:O(lg n)
  • 删除最小值:O(lg n)
  • 合并:O(n)

对于树的实现

  • 插入:O(lg n)
  • 删除最小值:O(lg n)
  • 合并:O(n)

谁能详细解释一下?

【问题讨论】:

  • 运行时错误,你从哪里得到的?堆就是堆:渐近运行时总是相同的。
  • 对于插入运行时间,我从stackoverflow.com/questions/5609700/… 得到它(最后一篇文章)。所以你说使用链表与数组相比没有缺点?
  • 不,我不是这么说的。在尊重预期的运行时特性的同时,您不能在链表中实现二叉堆。您完全错误地理解了链接到的答案。
  • 那么如果实现为数组或者树,运行时间会一样吗?那么内存使用情况呢,使用树版本不会占用更多内存吗?
  • asymptotic 运行时间将是相同的——但数组具有更好的cache locality,因此在实践中运行时间更好。而且显式树会比数组占用更多的内存。

标签: tree binary-tree heap big-o


【解决方案1】:

树使用更多的时间和内存。复杂度相同,但常数因子不同。

与基于数组的堆相比,树的指针使用大量内存,在这种堆中,您几乎不需要任何额外的空间,但值本身占用的空间。并且操作这些指针也需要时间。分配和释放节点也可能需要一些时间和空间...

此外,不能保证树的节点会在内存中一起出现。如果这两种选择中的任何一种都利用了缓存,那就是基于数组的堆。

【讨论】:

    【解决方案2】:

    参考通过其他人的答案已经说过的内容,人们可能想知道为什么我们也不将数组用于 BST。二叉堆要求它应该是一棵完整的二叉树。因此,叶节点的深度始终为 h 或 h-1。我相信正是这个属性使得使用数组成为二叉堆的理想选择,而不适合 BST(因为 BST 没有完整的二叉树要求 - 它可能是严格/完整/完整的)。

    【讨论】:

      猜你喜欢
      • 2021-02-15
      • 1970-01-01
      • 2018-09-19
      • 2013-10-14
      • 2013-03-16
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多