为什么二进制堆作为数组比树更好?

时间:2013-02-05 23:37:50

标签: tree binary-tree heap big-o

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

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

  • insert:O(lg n)
  • 删除min:O(lg n)
  • 合并:O(n)

对于树实现

  • insert:O(lg n)
  • 删除min:O(lg n)
  • 合并:O(n)

任何人都可以详细解释一下吗?

2 个答案:

答案 0 :(得分:9)

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

与基于数组的堆相比,树的指针使用了大量内存,在这些堆中,您几乎不需要任何额外的空间,而是由值本身占用的空间。操纵这些指针也需要时间。分配和取消分配节点可能还需要一些时间和空间......

此外,无法保证树的节点将在内存中。如果两个备选方案中的任何一个都从缓存中获益,那么它就是基于数组的堆。

答案 1 :(得分:2)

参考通过其他人的答案已经说过的内容,人们可能想知道我们为什么不使用BST数组。二进制堆要求它应该是一个完整的二叉树。因此,叶节点的深度总是h或h-1。我相信这个属性使得使用数组非常适合二进制堆并且不适合BST(因为BST没有完整的二叉树要求 - 它可以严格/完整/完成)。