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