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 相关文章推荐
wxpython 学习笔记 第一天
Feb 09 Python
Python中使用第三方库xlrd来写入Excel文件示例
Apr 05 Python
python实现从ftp服务器下载文件的方法
Apr 30 Python
python字典快速保存于读取的方法
Mar 23 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 Python
Python中一些深不见底的“坑”
Jun 12 Python
python 读取修改pcap包的例子
Jul 23 Python
python输出数组中指定元素的所有索引示例
Dec 06 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
Oct 12 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
Jan 18 Python
基于Python实现的购物商城管理系统
Apr 27 Python
pytorch中的 .view()函数的用法介绍
Mar 17 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
全国FM电台频率大全 - 22 重庆市
2020/03/11 无线电
php抓取页面与代码解析 推荐
2010/07/23 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
php如何利用pecl安装mongodb扩展详解
2019/01/09 PHP
VBScript版代码高亮
2006/06/26 Javascript
读jQuery之十四 (触发事件核心方法)
2011/08/23 Javascript
javascript动态加载二
2012/08/22 Javascript
JS 获取浏览器和屏幕宽高等信息的实现思路及代码
2013/07/31 Javascript
js左侧三级菜单导航实例代码
2013/09/13 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
2017/11/03 Javascript
vue通过数据过滤实现表格合并
2020/11/30 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
2019/09/11 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
python获取从命令行输入数字的方法
2015/04/29 Python
python直接访问私有属性的简单方法
2016/07/25 Python
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
Python+PyQT5的子线程更新UI界面的实例
2019/06/14 Python
python 的 scapy库,实现网卡收发包的例子
2019/07/23 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
澳大利亚优惠网站:Deals.com.au
2019/07/02 全球购物
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
《美丽的田园》教学反思
2014/03/01 职场文书
物流管理毕业生自荐信范文
2014/03/15 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
2014年科室工作总结范文
2014/12/19 职场文书
暑假安全保证书
2015/02/28 职场文书
护士自荐信范文
2015/03/25 职场文书
2015年教师节新闻稿
2015/07/17 职场文书
2015年库房管理工作总结
2015/10/14 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
nginx proxy_cache 缓存配置详解
2021/03/31 Servers
用Python提取PDF表格的方法
2021/04/11 Python
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python