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单元测试unittest实例详解
May 11 Python
Python常用小技巧总结
Jun 01 Python
Python对list列表结构中的值进行去重的方法总结
May 07 Python
深入浅析python继承问题
May 29 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
Apr 18 Python
python3+PyQt5实现自定义分数滑块部件
Apr 24 Python
python制作mysql数据迁移脚本
Jan 01 Python
使用Django连接Mysql数据库步骤
Jan 15 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
Pytorch Tensor的索引与切片例子
Aug 18 Python
python快速排序的实现及运行时间比较
Nov 22 Python
使用Python爬取Json数据的示例代码
Dec 07 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中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
php 购物车完整实现代码
2014/06/05 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
php实现搜索类封装示例
2016/03/31 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
laravel实现上传图片并在页面显示的例子
2019/10/14 PHP
javascript 进度条 实现代码
2009/07/30 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
vue实现简单表格组件实例详解
2017/04/16 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
2017/06/01 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
2019/06/20 jQuery
JS面向对象之多选框实现
2020/01/17 Javascript
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
Python实现查找系统盘中需要找的字符
2015/07/14 Python
Django Admin 实现外键过滤的方法
2017/09/29 Python
python顺序的读取文件夹下名称有序的文件方法
2018/07/11 Python
Python3 解决读取中文文件txt编码的问题
2019/12/20 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
2020/04/22 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
1688平价精选商城:阿里集团旗下,工厂出厂价格直销
2017/04/24 全球购物
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
大四毕业生学习总结的自我评价
2013/10/31 职场文书
和睦家庭事迹
2014/05/14 职场文书
2016新年慰问信范文
2015/03/25 职场文书
2016年度员工工作表现评语
2015/12/02 职场文书
Vue Element-ui表单校验规则实现
2021/07/09 Vue.js
Pandas-DataFrame知识点汇总
2022/03/16 Python