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 调用DLL操作抄表机
Jan 12 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
Jul 04 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
Oct 11 Python
TensorFlow实现RNN循环神经网络
Feb 28 Python
python实现堆和索引堆的代码示例
Mar 19 Python
Windows下Python3.6安装第三方模块的方法
Nov 22 Python
django框架model orM使用字典作为参数,保存数据的方法分析
Jun 24 Python
关于pytorch中网络loss传播和参数更新的理解
Aug 20 Python
基于python实现学生信息管理系统
Nov 22 Python
pytorch 常用线性函数详解
Jan 15 Python
opencv用VS2013调试时用Image Watch插件查看图片
Jul 26 Python
Python pandas求方差和标准差的方法实例
Aug 04 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 session有效期问题
2009/04/26 PHP
php程序之die调试法 快速解决错误
2009/09/17 PHP
php实现按文件名搜索文件的远程文件查找器
2014/05/10 PHP
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
javascript数组克隆简单实现方法
2015/12/16 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
防止Node.js中错误导致进程阻塞的办法
2016/08/11 Javascript
nodejs中向HTTP响应传送进程的输出
2017/03/19 NodeJs
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
2017/07/09 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
React数据传递之组件内部通信的方法
2017/12/31 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
axios异步提交表单数据的几种方法
2019/08/11 Javascript
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
Python内置函数——__import__ 的使用方法
2017/11/24 Python
启动Atom并运行python文件的步骤
2018/11/09 Python
python验证身份证信息实例代码
2019/05/06 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
python生成大写32位uuid代码
2020/03/03 Python
浅谈Python 命令行参数argparse写入图片路径操作
2020/07/12 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
HTML5 Canvas渐进填充与透明实现图像的Mask效果
2013/07/11 HTML / CSS
施华洛世奇英国官网:SWAROVSKI英国
2017/03/13 全球购物
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
副总经理工作职责
2013/11/28 职场文书
餐饮业会计岗位职责
2013/12/19 职场文书
个人近期表现材料
2014/02/11 职场文书