优先队列:有两种形式,最大优先队列和最小优先队列
优先队列是一种用来维护由一组元素构成的集合S的数据结构,其中的每一个元素都有一个相关的值,称为关键字。
优先级队列支持的操作:
Insert(S,x):把元素x 插入集合中
Maximum(S):返回具有最大键值的元素
Extract-Max(S):去掉并返回S中的具有最大键值的元素。
Increase(S,x,k).将元素的关键字值增加到k,这里的k值不小于原x的k值。
最大优先队列的应用:共享计算机系统的作业调度。
最小优先级队列的支持的操作:
Insert(S,x):把元素x 插入集合中
Minimum(S):返回具有最小键值的元素
Extract-Min(S):去掉并返回S中的具有最小键值的元素
decrease(S,x,k).将元素的关键字值减小到k,这里的k值大于原x的k值
最小优先队列可用于事件驱动模拟。队列保存事件以及其对应的发生事件
最大优先级队列实现:
伪代码:
HEAP-MAXIMUM(A)
1 return A[1]
可以在O(1)时间内实现MAXIMUM操作。
HEAP-EXTRACT-MAX(A)
1 if A.heapsize<1
2 error "heap underflow"
3 max=A[1]
4 A[1]=A[A.heapsize-1]
5 A.hheapsize=A.heapsize-1
6 HEAP-MAXIMUM(A)
7 return max
时间复杂度为O(lgn)
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)
时间复杂度 O(lgn)
MAX-HEAP-INSERT(A,key)
1 A.heap-size=A.heap-size+1
2 A[A.heapsize]=负无穷
3 HEAP-INCREASE-KEY(A,A.heapsize,key)
在包含n个元素的堆上,运行时间为O(lgn)