python实现最大优先队列


Posted in Python onAugust 29, 2019

本文实例为大家分享了python实现最大优先队列的具体代码,供大家参考,具体内容如下

说明:为了增强可复用性,设计了两个类,Heap类和PriorityQ类,其中PriorityQ类继承Heap类,从而达到基于最大堆实现最大优先队列。

#! /usr/bin/env python
#coding=utf-8

class Heap(object):
 #求给定下标i的父节点下标
 def Parent(self, i):
  if i%2==0:
   return i/2 - 1
  else:
   return i/2
 #求给定下标i的左孩子下标
 def Left(self, i):
  return 2*i+1
 #求给定下标i的右孩子下标
 def Right(self, i):
  return 2*i+2
 #维护堆的性质:遵循最大堆
 def MaxHeapify(self, a, i, heap_size):
  l=self.Left(i)
  r=self.Right(i)
  largest = i
  if l<heap_size and a[l]>a[largest]:#下标从0~heap_size-1
   largest=l
  if r<heap_size and a[r]>a[largest]:
   largest=r
  if largest!=i:#若当前节点不是最大的,下移
   a[i], a[largest] = a[largest], a[i]#交换a[i]和a[largest]
   self.MaxHeapify(a, largest, heap_size)#追踪下移的节点
 #建堆 
 def BuildMaxHeap(self, a):
  heap_size=len(a)
  for i in range(heap_size/2 - 1, -1, -1):#从最后一个非叶节点开始调整
   #a[heap_size/2 - 1]~a[0]都是非叶节点,其他的是叶子节点
   self.MaxHeapify(a, i, heap_size)
 #堆排序算法 
 def HeapSort(self, a):
  heap_size=len(a)
  '''step1:初始化堆,将a[0...n-1]构造为堆(堆顶a[0]为最大元素)'''
  self.BuildMaxHeap(a)
  for i in range(len(a)-1, 0, -1):
   #print a
   '''step2:将当前无序区的堆顶元素a[0]与该区间最后一个记录交换
    得到新的无序区a[0...n-2]和新的有序区a[n-1],有序区的范围从
    后往前不断扩大,直到有n个'''
   a[0], a[i] = a[i], a[0]#每次将剩余元素中的最大者放到最后面a[i]处 
   heap_size -= 1
   '''step3:为避免交换后新的堆顶违反堆的性质,因此将新的无序区调整为新
    的堆'''
   self.MaxHeapify(a, 0, heap_size)


#最大优先队列的实现
class PriorityQ(Heap):
 #返回具有最大键字的元素
 def HeapMaximum(self, a):
  return a[0]
 #去掉并返回具有最大键字的元素
 def HeapExtractMax(self, a):
  heap_size=len(a)
  #if heap_size<0:
  # error "heap underflow"
  if heap_size>0:
   max=a[0]
   a[0]=a[heap_size-1]
   #heap_size -= 1 #该处不对,并没有真正实现数组长度减一
   del a[heap_size-1]#!!!!!!
   self.MaxHeapify(a, 0, len(a))
   return max
 #将a[i]处的关键字增加到key
 def HeapIncreaseKey(self, a, i, key):
  if key<a[i]:
   print "new key is smaller than current one"
  else:
   a[i]=key
   '''当前元素不断与其父节点进行比较,如果当前元素关键字较大,则与其
    父节点进行交换。不断重复此过程'''
   while i>0 and a[self.Parent(i)]<a[i]:
    a[i], a[self.Parent(i)] = a[self.Parent(i)], a[i]
    i=self.Parent(i) 

 #增加元素
 def MaxHeapInsert(self, a, key):
  #heap_size=len(a)
  #heap_size += 1
  #a[heap_size-1]=-65535
  a.append(-65535)#在a的末尾增加一个关键字为负无穷的叶节点扩展最大堆
  heap_size=len(a)
  self.HeapIncreaseKey(a, heap_size-1, key)


if __name__ == '__main__':
 H = Heap()
 P = PriorityQ()
 x = [0, 2, 6, 98, 34, -5, 23, 11, 89, 100, 4]
 #x1= [3,9,8,4,5,2,10,18]
 #H.HeapSort(x)
 #H.HeapSort(x1)
 #print x
 #print x1
 H.BuildMaxHeap(x)#首先建立大顶堆
 print '%s %r' % ('BigHeap1:', x) # %r是万能输出格式
 print '%s %d' % ('Maximun:', P.HeapMaximum(x))
 print '%s %d' % ('ExtractMax:', P.HeapExtractMax(x))
 print '%s %r' % ('BigHeap2:', x)
 #P.MaxHeapInsert(x, 100)
 #print x
 P.HeapIncreaseKey(x, 2, 20)
 print x
 P.HeapIncreaseKey(x, 2, 30)
 print x
 P.MaxHeapInsert(x, 100)
 print x

测试结果:

BigHeap1: [100, 98, 23, 89, 34, -5, 6, 11, 0, 2, 4] 
Maximun: 100 
ExtractMax: 100 
BigHeap2: [98, 89, 23, 11, 34, -5, 6, 4, 0, 2] 
new key is smaller than current one 
[98, 89, 23, 11, 34, -5, 6, 4, 0, 2] 
[98, 89, 30, 11, 34, -5, 6, 4, 0, 2] 
[100, 98, 30, 11, 89, -5, 6, 4, 0, 2, 34]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
Python中的高级数据结构详解
Mar 27 Python
Python的字典和列表的使用中一些需要注意的地方
Apr 24 Python
Python Matplotlib库入门指南
May 18 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
Jun 09 Python
python利用MethodType绑定方法到类示例代码
Aug 27 Python
Python基础教程之利用期物处理并发
Mar 29 Python
Pandas Shift函数的基础入门学习笔记
Nov 16 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
python 上下文管理器及自定义原理解析
Nov 19 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 Python
详解Anaconda 的安装教程
Sep 23 Python
django连接oracle时setting 配置方法
Aug 29 #Python
python线程的几种创建方式详解
Aug 29 #Python
python fuzzywuzzy模块模糊字符串匹配详细用法
Aug 29 #Python
python多线程分块读取文件
Aug 29 #Python
用sqlalchemy构建Django连接池的实例
Aug 29 #Python
详解Python 字符串相似性的几种度量方法
Aug 29 #Python
python多线程同步之文件读写控制
Feb 25 #Python
You might like
PHP中提问频率最高的11个面试题和答案
2014/09/02 PHP
PHP实现对站点内容外部链接的过滤方法
2014/09/10 PHP
PHP验证码无法显示的原因及解决办法
2017/08/11 PHP
ArrayList类(增强版)
2007/04/04 Javascript
IE8 浏览器Cookie的处理
2009/01/31 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
Extjs表单常见验证小结
2014/03/07 Javascript
select多选 multiple的使用示例
2014/06/16 Javascript
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
从零学习node.js之简易的网络爬虫(四)
2017/02/22 Javascript
ES5 ES6中Array对象去除重复项的方法总结
2017/04/27 Javascript
Angular中innerHTML标签的样式不起作用的原因解析
2019/06/18 Javascript
手把手教你 CKEDITOR 4 实现Dialog 内嵌 IFrame操作详解
2019/06/18 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
Python验证码识别处理实例
2015/12/28 Python
PyQt5每天必学之单行文本框
2018/04/19 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
python获取时间戳的实现示例(10位和13位)
2020/09/23 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
为智能设备设计个性化保护套网站:caseable
2017/01/05 全球购物
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
劳力士官方珠宝商:J.R. Dunn Jewelers
2018/09/29 全球购物
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
测绘工程本科生求职信
2013/10/10 职场文书
三年级音乐教学反思
2014/01/28 职场文书
高中生职业生涯规划书
2014/02/24 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
2015年办公室文员工作总结
2015/04/24 职场文书
公司承诺书格式范文
2015/04/28 职场文书
调解书格式范本
2015/05/20 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书
background-position百分比原理详解
2021/05/08 HTML / CSS
图文详解matlab原始处理图像几何变换
2021/07/09 Python
欧元符号 €
2022/02/17 杂记