【发布时间】: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