优先级队列(Priority Queue)(一)

一.概述

优先级队列和通常的栈和队列一样,只不过里面的每一个元素都有一个”优先级”,在处理的时候,首先处理优先级最高的。如果两个元素具有相同的优先级,则按照他们插入到队列中的先后顺序处理。

优先级队列可以通过链表,数组,堆或者其他数据结构实现。

如果用数组来实现的话,如果插入操作是简单的在最后插入的话,其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)] 

即父结点的优先级必大于等于其子结点。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值