Python笔记 之 最大优先队列

使用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]  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值