2 基本数据结构
2.6 优先级队列
不同于普通队列的先进先出,而是按照优先权的高低取出。
很多实现方式:有序顺序表、无序顺序表、有序链表、无序链表、堆。当然我们重点说堆。
堆是满足堆性质的完全二叉树。
最大堆就是堆中任一结点的值都小于其父结点的值,堆顶值最大。最小堆反过来。
堆存储在一位数组中。有n个结点的堆的高度是
。
维护堆很重要。
对于最大堆,如果某个结点的关键字小于其某个子结点的关键值,可以采用自顶向下堆化算法。
就比如下面这个例子:
如果某个结点的关键值大于其父结点的关键值,可以采用自底向上堆化算法。
就比如下面这个例子:
插入:将新结点加入堆尾,自底向上堆化
建立堆:向空堆中插入元素同时调整
这种叫自顶向下堆堆构造,时间复杂度小于
,。
另一种建立堆的方法是把数组A看作一棵尚未满足堆性质的完全二叉树,从
到0反向遍历数组采用自顶向下堆化操作,这种叫自底向上堆构造,线性时间复杂度。
堆的删除:将堆顶删除,将堆尾结点放到堆顶。
优先级队列(Priority Queue)。