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 相关文章推荐
python和shell获取文本内容的方法
Jun 05 Python
python使用webdriver爬取微信公众号
Aug 31 Python
Python识别快递条形码及Tesseract-OCR使用详解
Jul 15 Python
简单了解python变量的作用域
Jul 30 Python
如何给Python代码进行加密
Jan 10 Python
Python 列表的清空方式
Jan 13 Python
python3连接mysql获取ansible动态inventory脚本
Jan 19 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
Mar 23 Python
python使用yaml 管理selenium元素的示例
Dec 01 Python
python中delattr删除对象方法的代码分析
Dec 15 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
Feb 02 Python
教你利用Selenium+python自动化来解决pip使用异常
May 20 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中Date()时间日期函数的使用方法小结
2011/04/20 PHP
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
Yii快速入门经典教程
2015/12/28 PHP
javascript 遍历验证所有文本框的值
2009/08/27 Javascript
jQuery 锚点跳转滚动条平滑滚动一句话代码
2010/04/30 Javascript
关于JavaScript中var声明变量作用域的推断
2010/12/16 Javascript
javascript设计模式 接口介绍
2012/07/24 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
2013/02/16 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
JS操作JSON要领详细总结
2013/08/25 Javascript
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
js中用window.open()打开多个窗口的name问题
2014/03/13 Javascript
js匿名函数的调用示例(形式多种多样)
2014/08/20 Javascript
js创建对象的方式总结
2015/01/10 Javascript
完美实现bootstrap分页查询
2015/12/09 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
JQuery实现折叠式菜单的详细代码
2020/06/03 jQuery
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
[01:32:10]NAVI vs VG Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
python安装Scrapy图文教程
2017/08/14 Python
python 实现return返回多个值
2019/11/19 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
使用HTML5的链接预取功能(link prefetching)给网站提速
2012/12/13 HTML / CSS
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
自我鉴定模板
2013/10/29 职场文书
五星级酒店餐饮部总监的标准岗位职责
2014/02/17 职场文书
一份文言文检讨书
2014/09/13 职场文书
销售员工作检讨书(推荐篇)
2014/10/18 职场文书
文明倡议书
2015/01/19 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
Nginx内网单机反向代理的实现
2021/11/07 Servers
什么是Python装饰器?如何定义和使用?
2022/04/11 Python