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实现计算最小编辑距离
Mar 17 Python
windows系统下Python环境搭建教程
Mar 28 Python
python如何实现反向迭代
Mar 20 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
python 实现selenium断言和验证的方法
Feb 13 Python
Python3实现计算两个数组的交集算法示例
Apr 03 Python
Python异步编程之协程任务的调度操作实例分析
Feb 01 Python
tensorflow 查看梯度方式
Feb 04 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
Feb 11 Python
python基于socket模拟实现ssh远程执行命令
Dec 05 Python
python 自动化偷懒的四个实用操作
Apr 11 Python
Python使用UDP实现720p视频传输的操作
Apr 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
ThinkPHP无限级分类原理实现留言与回复功能实例
2014/10/31 PHP
利用js跨页面保存变量做菜单的方法
2008/01/17 Javascript
读jQuery之八 包装事件对象
2011/06/21 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
jQuery操作input type=radio的实现代码
2012/06/14 Javascript
onkeyup,onkeydown和onkeypress的区别介绍
2013/10/21 Javascript
jQuery操作Select的Option上下移动及移除添加等等
2013/11/18 Javascript
JavaScript中的Truthy和Falsy介绍
2015/01/01 Javascript
原生js实现图片轮播特效
2015/12/18 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
vue实现word,pdf文件的导出功能
2018/07/31 Javascript
浅谈Angular7 项目开发总结
2018/12/19 Javascript
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
javascript代码实现简易计算器
2021/01/25 Javascript
[49:18]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 OG vs TNC
2018/04/01 DOTA
python中的lambda表达式用法详解
2016/06/22 Python
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
详解python中的json和字典dict
2018/06/22 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
PyCharm+PyQt5+QtDesigner配置详解
2020/08/12 Python
德国原装品牌香水、化妆品和手表网站:BRASTY.DE
2016/10/16 全球购物
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
如何利用find命令查找文件
2016/11/18 面试题
UNIX文件系统常用命令
2012/05/25 面试题
主治医师岗位职责
2013/12/10 职场文书
工业学校毕业生自荐信范文
2014/01/03 职场文书
个人工作保证书
2015/02/28 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python
Java移除无效括号的方法实现
2021/08/07 Java/Android