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查找第k小元素代码分享
Dec 18 Python
gearman的安装启动及python API使用实例
Jul 08 Python
10种检测Python程序运行时间、CPU和内存占用的方法
Apr 01 Python
自己编程中遇到的Python错误和解决方法汇总整理
Jun 03 Python
用Python抢过年的火车票附源码
Dec 07 Python
python 将列表中的字符串连接成一个长路径的方法
Oct 23 Python
详解python做UI界面的方法
Feb 27 Python
python pandas写入excel文件的方法示例
Jun 25 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
Aug 06 Python
关于Python中的向量相加和numpy中的向量相加效率对比
Aug 26 Python
python3中numpy函数tile的用法详解
Dec 04 Python
关于PySnooper 永远不要使用print进行调试的问题
Mar 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
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
php连接函数implode与分割explode的深入解析
2013/06/26 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
php中Snoopy类用法实例
2015/06/19 PHP
PHP实现上传多图即时显示与即时删除的方法
2017/05/09 PHP
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
jQuery中size()方法用法实例
2014/12/27 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
解决betterScroll在vue中存在图片时,出现拉不动的问题
2018/09/27 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
javascript+Canvas实现画板功能
2020/06/23 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
2020/07/15 Javascript
微信小程序实现日历签到
2020/09/21 Javascript
numpy数组拼接简单示例
2017/12/15 Python
python通过zabbix api获取主机
2018/09/17 Python
pandas取出重复数据的方法
2019/07/04 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
上海中网科技笔试题
2012/02/19 面试题
专科毕业生学习生活的自我评价
2013/10/26 职场文书
企业演讲稿范文
2013/12/28 职场文书
幼儿园户外活动总结
2014/07/04 职场文书
庆七一宣传标语
2014/10/08 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
小学毕业感言100字
2015/07/30 职场文书
禁毒心得体会范文
2016/01/15 职场文书
学习师德师风的心得体会(2篇)
2019/10/08 职场文书
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python
python对文档中元素删除,替换操作
2022/04/02 Python
Android 中的类文件和类加载器详情
2022/06/05 Java/Android