二进制堆和优先级队列

时间:2017-05-18 21:00:16

标签: algorithm tree heap priority-queue binary-heap

我是Heaps,Binary Heap的新手,我试图理解为什么我们需要使用二进制堆来实现优先级队列。我也明白Binary Heap的底层数据结构又是一个数组。

所以我的问题是为什么我们不能使用数组,以降序(对于最大堆)或升序(对于最小堆)顺序来表示优先级队列?我可能在这里错了,但我认为如果以这种方式实现,findMax,findMin,insert和delete等操作的时间复杂度几乎保持不变。那么我们不能不使用排序数组来表示优先级队列吗?

我已经阅读了这个答案:Heap vs Binary Search Tree (BST)

1 个答案:

答案 0 :(得分:2)

您可以使用数组来表示优先级队列,但在执行此操作时会失去很多效率。想象一下,您将某些内容插入到数组中,它的优先级高于队列中的任何对象。它需要在索引0处,索引0处的对象需要转到索引1,依此类推。

这是O(n),但是如果在由二叉树组成的优先级队列的前面插入一个值,则只需要更改lg(n)节点,使得二进制树在建模优先级队列方面要比数组是。

删除元素的时间复杂度相似。

如果使用数组实现,则访问优先级队列的后端是恒定时间,但如果使用二叉树实现,则访问O(n)时间,因此这是一个显着优势,即数组具有超过二叉树,但优先级队列在一般来说,大多数时候都不需要访问优先级最低的元素,因此二叉树比一般的数组更有效地表示优先级队列。