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写的Discuz7.2版faq.php注入漏洞工具
Aug 06 Python
使用Python神器对付12306变态验证码
Jan 05 Python
python+Django+apache的配置方法详解
Jun 01 Python
python的多重继承的理解
Aug 06 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
python实现kNN算法
Dec 20 Python
python实现输出一个序列的所有子序列示例
Nov 18 Python
Django 限制访问频率的思路详解
Dec 24 Python
如何在windows下安装配置python工具Ulipad
Oct 27 Python
python 爬虫如何实现百度翻译
Nov 16 Python
python对输出的奇数偶数排序实例代码
Dec 04 Python
Django中如何用xlwt生成表格的方法步骤
Jan 31 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 curl CURLOPT_RETURNTRANSFER参数的作用使用实例
2015/02/07 PHP
ThinkPHP5 的简单搭建和使用详解
2018/11/15 PHP
浅谈PHP进程管理
2019/03/08 PHP
javascript[js]获取url参数的代码
2007/10/17 Javascript
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
JSON中双引号的轮回使用过程中一定要小心
2014/03/05 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
2016/12/26 Javascript
快速解决处理后台返回json数据格式的问题
2018/08/07 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
JavaScript实现放大镜效果代码示例
2020/04/29 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
python发送伪造的arp请求
2014/01/09 Python
python实现进程间通信简单实例
2014/07/23 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
python ddt实现数据驱动
2018/03/14 Python
Python3.遍历某文件夹提取特定文件名的实例
2018/04/26 Python
python selenium执行所有测试用例并生成报告的方法
2019/02/13 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
2020/10/15 Python
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
失业者真诚求职信范文
2013/12/25 职场文书
祖国在我心中演讲稿
2014/01/15 职场文书
个人简历自我评价范文
2014/02/04 职场文书
学校读书活动总结
2014/06/30 职场文书
作风整顿剖析材料
2014/09/30 职场文书
万能检讨书2000字
2014/10/17 职场文书
武夷山导游词
2015/02/03 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
Java tomcat手动配置servlet详解
2021/11/27 Java/Android