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编程实现二叉树及七种遍历方法详解
Jun 02 Python
python实现员工管理系统
Jan 11 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
Jan 26 Python
详解python 注释、变量、类型
Aug 10 Python
详解Python用户登录接口的方法
Apr 17 Python
PyQt5 QTable插入图片并动态更新的实例
Jun 18 Python
Django上使用数据可视化利器Bokeh解析
Jul 31 Python
python django中8000端口被占用的解决
Dec 17 Python
python退出循环的方法
Jun 18 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
Jul 09 Python
使用python如何删除同一文件夹下相似的图片
May 07 Python
Python实现拼音转换
Jun 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也可以?成Shell Script
2006/10/09 PHP
php面向对象基础详解【星际争霸游戏案例】
2020/01/23 PHP
jQuery Ajax 全解析
2009/02/08 Javascript
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
2011/11/21 Javascript
表单验证的完整应用案例探讨
2013/03/29 Javascript
jQuery控制TR显示隐藏的三种常用方法
2014/08/21 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
2017/07/10 Javascript
JS SetInterval 代码实现页面轮询
2017/08/11 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
2020/10/20 Javascript
Python 可爱的大小写
2008/09/06 Python
Python3 入门教程 简单但比较不错
2009/11/29 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
Python Socket实现简单TCP Server/client功能示例
2017/08/05 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
基于python实现操作redis及消息队列
2020/08/27 Python
Python 创建守护进程的示例
2020/09/29 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
python基于opencv实现人脸识别
2021/01/04 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
世界最大的票务市场:viagogo
2017/02/16 全球购物
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
工程预算与管理应届生求职信
2013/10/06 职场文书
高分子材料与工程专业个人求职信
2013/12/15 职场文书
人事专员工作职责
2014/02/22 职场文书
冰雪公主观后感
2015/06/16 职场文书
Go语言空白表示符_的实例用法
2021/07/04 Golang