使用Python实现最大优先队列算法
最大优先队列是最大堆的一个应用,如果不熟悉最大堆可以参考:
最大堆排序算法
最大优先队列算法伪算法:
'''
优先队列是一种用来维护由一组元素构成的集合S的数据结构,
的每一个元素都有一个相关的值,称为关键字。
一个最大优先队列支持一下操作:
INSERT(S,x):把元素x插入集合S中。
MAXIMUM(S):返回S中具有最大键值得元素。
EXTRACT-MAX(S):去掉并返回S中具有最大关键字的元素。
INCREASE-KEY(S,x,k):将原始x的关键字增加到k(k>x)。
max-HEAP-INSERT(S,x)
S.heap-size=S.heap-size+1
S[S.heap-size]=-∞
heap-INCREASE-KEY(S,S.heap-size,x)
heap-MAXIMUM(S)
return S[i]
heap-EXTRACT-MAX(S)
if S.heap-size<1:
error 'heap underflow'
max=S[1]
S[1]=S[S.heap-size]
S.heap-size=S.heap-size-1
max-HEAPIFY(S,S.heap-size,1)
return max
heap-INCREASE-KEY(S,i,k)
if k<S[i]:
error 'new key is smaller than current key'
S[i]=k
while i>1 and S[PARENT(i)]<s[I]
exchange S[i] with A[PARENT(i)]
i=PARENT(i)
'''
最大优先级序列算法:
import math
from heap_sort import max_Heapify,build_Max_Heap
def max_HEAP_INSERT(S,x):
'''向最大优先序列增加新元素x,在数组最末尾增加无穷小元素,将无穷小元素增加到x'''
heapsize=len(S)
S.append(float("-inf"))
heap_INCREASE_KEY(S,heapsize,x)
def heap_MAXIMUM(S):
'''返回最大序列数组最大值'''
return S[0]
def heap_EXTRACT_MAX(S):
'''去掉并返回S中具有最大关键字的元素
最大堆第一个元素为最大关键字,用最后一个元素替换首元素,移除数组最后一个元素并重建最大堆'''
heapsize=len(S)
if heapsize<1:
raise 'heap underflow'
max=S[0]
S[0]=S[heapsize-1]
S.pop()
build_Max_Heap(S)
return max
def heap_INCREASE_KEY(S,i,k):
'''用元素k替换数组i位元素,重建最大堆'''
if k<S[i]:
raise 'new key is smaller than current key'
S[i]=k
build_Max_Heap(S)
运行结果:
a=[11,14,12,13,10,6,9,8,7,1,2,4,3,5,0]
print(a)
build_Max_Heap(a)
print(a)
max_HEAP_INSERT(a,15)
print(a)
print(heap_MAXIMUM(a))
print(heap_EXTRACT_MAX(a))
print(a)
heap_INCREASE_KEY(a,10,16)
print(a)
[11, 14, 12, 13, 10, 6, 9, 8, 7, 1, 2, 4, 3, 5, 0]
[14, 13, 12, 11, 10, 6, 9, 8, 7, 1, 2, 4, 3, 5, 0]
[15, 14, 12, 13, 10, 6, 9, 11, 7, 1, 2, 4, 3, 5, 0, 8]
15
15
[14, 13, 12, 11, 10, 6, 9, 8, 7, 1, 2, 4, 3, 5, 0]
[16, 14, 12, 11, 13, 6, 9, 8, 7, 1, 10, 4, 3, 5, 0]