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爬虫框架talonspider简单介绍
Jun 09 Python
python paramiko模块学习分享
Aug 23 Python
python3实现SMTP发送邮件详细教程
Jun 19 Python
Python GUI布局尺寸适配方法
Oct 11 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
python sklearn常用分类算法模型的调用
Oct 16 Python
tensorflow pb to tflite 精度下降详解
May 25 Python
基于Python词云分析政府工作报告关键词
Jun 02 Python
python 装饰器的使用示例
Oct 10 Python
python import 上级目录的导入
Nov 03 Python
用python制作个音乐下载器
Jan 30 Python
利用Python脚本写端口扫描器socket,python-nmap
Jul 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正则表达式(regar expression)
2011/09/10 PHP
php学习笔记之面向对象编程
2012/12/29 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
PHP实现微信红包金额拆分试玩的算法示例
2018/04/07 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
为EasyUI的Tab标签添加右键菜单的方法
2012/07/14 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
浅析Javascript中“==”与“===”的区别
2014/12/23 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
2016/06/28 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
详解vue挂载到dom上会发生什么
2019/01/20 Javascript
JavaScript常用事件介绍
2019/01/21 Javascript
bootstrap-table formatter 使用vue组件的方法
2019/05/09 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
全网小程序接口请求封装实例代码
2020/11/06 Javascript
[58:15]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 NB vs Liquid
2018/04/02 DOTA
使用python开发vim插件及心得分享
2014/11/04 Python
python实现爬虫统计学校BBS男女比例(一)
2015/12/31 Python
Python入门教程之运算符与控制流
2016/08/17 Python
在python中利用opencv简单做图片比对的方法
2019/01/24 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
利用Tensorflow的队列多线程读取数据方式
2020/02/05 Python
数控技术专业推荐信
2013/11/01 职场文书
厂长助理岗位职责
2013/12/27 职场文书
一年级班主任寄语
2014/01/19 职场文书
护士毕业自我鉴定
2014/02/07 职场文书
运动会入场解说词
2014/02/07 职场文书
药店促销活动策划方案
2014/08/24 职场文书
2015年十一国庆节演讲稿
2015/03/20 职场文书
新手开公司创业注意事项有哪些?
2019/07/29 职场文书
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL