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抓取网页正文的源码
Jun 11 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 Python
python的numpy模块安装不成功简单解决方法总结
Dec 23 Python
Python 生成 -1~1 之间的随机数矩阵方法
Aug 04 Python
cProfile Python性能分析工具使用详解
Jul 22 Python
windows环境中利用celery实现简单任务队列过程解析
Nov 29 Python
python 命名规范知识点汇总
Feb 14 Python
Anaconda详细安装步骤图文教程
Nov 12 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
Dec 18 Python
django使用多个数据库的方法实例
Mar 04 Python
Python+Appium新手教程
Apr 17 Python
python中的getter与setter你了解吗
Mar 24 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执行速度全攻略(下)
2006/10/09 PHP
php adodb介绍
2009/03/19 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
详解PHP中websocket的使用方法
2016/09/15 PHP
PHP实现通过CURL上传文件功能示例
2018/05/30 PHP
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
2013/01/16 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
ES6所改良的javascript“缺陷”问题
2016/08/23 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
2016/09/19 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
JavaScript基础之流程控制语句的用法
2017/08/31 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
简单学习5种处理Vue.js异常的方法
2019/06/17 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
Python-openCV读RGB通道图实例
2020/01/17 Python
Python多线程获取返回值代码实例
2020/02/17 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
Python爬虫实现vip电影下载的示例代码
2020/04/20 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
CSS3之transition实现下划线的示例代码
2018/05/30 HTML / CSS
先进德育工作者事迹材料
2014/01/24 职场文书
社区工作者演讲稿
2014/05/23 职场文书
2014年社区党建工作汇报材料
2014/11/02 职场文书
党课主持词大全
2015/06/30 职场文书
2019通用版导游词范本!
2019/08/07 职场文书