二叉堆和优先队列

优先队列是一种用来维护由一组元素构成的集合S的数据结构,其中的每一个元素都有一个相关的值,称为关键字。优先队列有最大优先队列最小优先队列
优先队列和一般的FIFO队列不一样,从优先队列获取出来的值是哟优先顺序的。例如,用来处理发送给计算机部门打印机的职位:部门主管发来的职位应该首先被打印,依次是经理,研究生和本科生。放到优先队列的值应该是发送的优先顺序(比如主管是5,经理是3,研究生是2,大学生是1),然后和值关联的可以打印的文档。只要打印机空闲,那么最高优先级的的职位呗移出队列并打印。(具有相同优先级的职位没有具体顺序)

最大优先队列:常用于共享计算机系统的作业调度
最小优先队列:基于事件驱动的模拟器

最大优先队列的基本操作有:

1 insert(S,x) //把元素x插入到S中
2 maximum(S) //获取S中最大关键字的元素
3 extract-max(S) //去掉并返回S中最大关键字的元素
4 increase-key(S,x,k) //把x的关键字增大为k

用堆来实现最大优先队列的伪代码

// 获取优先级最高的元素
HEAP-MAXIMUM(A1 return A[1]
// 去掉并返回A中最大关键字的元素
HEAP-EXTRACT-MAX(A)
1 if A.heap-size < 1
2    error "heap underflow"
3 max=A[1]
4 A[1]=A[A.heap-size]
5 A.heap-size=A.heap-size-1
6 MAX-HEAPIFY(A,1)
7 return max
 //把x的关键字增大为k
HEAP-INCREASE-KEY(A,i,key)
1 if key<A[i]
2      error "new key is smaller than current key"
3 A[i]=key
4 while i>1 and A[PARENT(i)]<A[i]
5      exchange A[i] with A[PARENT(i)]
6      i=PARENT(i)
//把元素key插入到A中
MAX-HEAP-INSERT(A,key)
1 A.heap-size+=1
2 A[heap-size]=负无穷
3 HEAP-INCREASE-KEY(A,A.heap-size,key)

参考资料

1 《算法导论 原书第3版》

2 http://pages.cs.wisc.edu/~vernon/cs367/notes/11.PRIORITY-Q.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值