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 相关文章推荐
Python3.6连接Oracle数据库的方法详解
May 18 Python
python实现最大子序和(分治+动态规划)
Jul 05 Python
python获取txt文件词向量过程详解
Jul 05 Python
Python K最近邻从原理到实现的方法
Aug 15 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
Oct 12 Python
推荐8款常用的Python GUI图形界面开发框架
Feb 23 Python
Python找出列表中出现次数最多的元素三种方式
Feb 24 Python
jupyter notebook中美观显示矩阵实例
Apr 17 Python
Python基于DB-API操作MySQL数据库过程解析
Apr 23 Python
Pytorch环境搭建与基本语法
Jun 03 Python
Django用户认证系统如何实现自定义
Nov 12 Python
Django中ORM的基本使用教程
Dec 22 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实现过滤UBB代码的类
2015/03/12 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
php远程下载类分享
2016/04/13 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
2013/01/11 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
跟我学习javascript的this关键字
2020/05/28 Javascript
vue绑定设置属性的多种方式(5)
2017/08/16 Javascript
解读ES6中class关键字
2017/11/20 Javascript
解决linux下node.js全局模块找不到的问题
2018/05/15 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
jquery实现吸顶导航效果
2020/01/08 jQuery
ES2020 新特性(种草)
2020/01/12 Javascript
javascript前端实现多视频上传
2020/12/13 Javascript
vue实现拖拽进度条
2021/03/01 Vue.js
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
Python变量和数据类型详解
2017/02/15 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
python实现zabbix发送短信脚本
2018/09/17 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
Python虚拟环境的原理及使用详解
2019/07/02 Python
Python通过字典映射函数实现switch
2020/11/06 Python
Python实现京东抢秒杀功能
2021/01/25 Python
matplotlib grid()设置网格线外观的实现
2021/02/22 Python
html5定位并在百度地图上显示的示例
2014/04/27 HTML / CSS
英国马莎百货印度官网:Marks & Spencer印度
2020/10/08 全球购物
电气专业推荐信范文
2013/11/18 职场文书
传媒专业推荐信范文
2013/11/23 职场文书
小学教师管理制度
2014/01/18 职场文书
交通事故私了协议书
2014/04/16 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
文艺晚会开场白
2015/05/29 职场文书
活动简报范文
2015/07/22 职场文书
校园安全学习心得体会
2016/01/18 职场文书
详解如何使用Node.js实现热重载页面
2021/05/06 Javascript