在(最大)堆中,很容易在O(1)
时间内找到最大的项目,但要实际删除它,您需要O(log(n))
的复杂性。
因此,如果从堆中插入和删除都是O(log(n))
,那么堆超过二叉树的优势是什么才能表示优先级队列?
答案 0 :(得分:7)
堆使用更少的内存。它们可以实现为数组,因此不存在存储指针的开销。 (二叉树可以作为一个数组实现,但是可能存在许多空的“间隙”,这可能比将它们实现为带有指针的节点浪费更多的空间。)
堆保证具有log(n)的高度,因为它们不需要保证通过有序遍历可以按排序顺序检索元素,只需要节点的值支配其子项的值。这允许它们将“打包”结构作为数组。二叉树(除非它是一个平衡的二叉树)通常最终会得到高度大于log(n)的分支,所以即使操作具有相同的大O复杂度,实际上堆也会稍快一些。
由于堆可以实现为数组,因此您可以获得访问连续内存的巨大优势,这些内存可能仍然存在于缓存中,而不是访问指针所指向的节点,这些指针的内存遍布整个地方。
堆实现比二叉树更简单(尤其是平衡二叉树)
缺点是使用堆不能进行二进制搜索,但对于优先级队列,您不需要此功能。