一.概述
优先级队列和通常的栈和队列一样,只不过里面的每一个元素都有一个”优先级”,在处理的时候,首先处理优先级最高的。如果两个元素具有相同的优先级,则按照他们插入到队列中的先后顺序处理。
优先级队列可以通过链表,数组,堆或者其他数据结构实现。
如果用数组来实现的话,如果插入操作是简单的在最后插入的话,其Insert的复杂度是O(1),但是相对应的其查找最高优先级元素的复杂度就是O(n),删除最高优先级原色的复杂度就是O(n)+O(n)=O(n)。
同理链表也无法保证优先级队列三个数据接口的高效性。
BBST的功能过于强大,三个接口的时间复杂度均为O(log(n)),但是优先级队列的查找和删除均只针对优先级最高的原色,所以BBST是杀鸡焉用牛刀。
寻找一种数据结构使得三个数据接口的时间复杂度依然为 O(log(n)),但是实际效率更高。
二.完全二叉堆
1.定义
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。
一棵二叉树至多只有最下面的两层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,则此二叉树成为完全二叉树。
2.与向量的形神结合
逻辑上 完全二叉树
物理上 借助向量实现
逻辑结点与物理元素按照层次遍历顺序彼此对应:
# define Parent(i) ((i-1)>>1)
# define LChild(i) (1+((i)<<1)) //奇数
# define RChild(i) ((1+(i))<<1) //偶数
PQ_ComplHeap=PQ+Vector
3.堆序性
数值上,只要0<i,必满足:
H[i] <= H[Parent(i)]
即父结点的优先级必大于等于其子结点。