优先队列(Priority queue)的介绍

  • 优先队列是计算机中一种抽象的数据结构类,它有着一个类似和队列或者堆的结构,但是其中每个元素额外有一个优先级别
  • 在一个优先队列中,一个高优先顺序的元素会先执行与低优先顺序的元素。在它的执行过程中,如果两个元素拥有相同的优先顺序,则会根据他们进入队列的先后顺序来确定执行先后,但是在在其他类型的数据结构中,如果两个元素优先级别相同,则不会定义这两个元素的先后执行顺序
  • 优先队列一般使用堆来进行实现,但他们在概念上与堆是有区别的。一个优先队列它可以是一个“列表”,也可以是一个“字典”,正如一个列表可以使用链表或者数组来实现一样,优先队列可以用堆或者其他各种不同的方法,如无序数组来实现

要实现的两种优先队列

两种优先队列:

  1. 最大优先队列(Max priority queue),最大优先级的元素在队列最前面,可以指定最大元素取出和删除
  2. 最小优先队列(Max priority queue),最小优先级的元素在队列最前面,可以指定最小元素取出和删除

使用堆(数组)实现最大优先队列

定义方法

  1. size()获取队列大小
  2. less(x, y)对传入的两个索引对应当前队列的元素进行大小比较
  3. is_empty()判断队列是否为空
  4. swap(i, j)对传入的两个索引对应当前队列中的元素进行值交换
  5. append(item)在队列末尾添加指定元素
  6. extract_max()取出并删除最大优先级的元素
  7. sink()使用下沉排序操作,对删除元素后的队列进行排序
  8. swim()使用上浮排序操作,对从尾部插入元素的队列进行排序

最大优先队列Python代码实现

class MaxPriorityQueue:def __init__(self):self.heap = [None]self.N = 0def size(self):return self.Ndef less(self, i, j):return self.heap[i] < self.heap[j]def is_empty(self):return self.N == 0def swap(self, i, j):self.heap[i], self.heap[j] = self.heap[j], self.heap[i]def append(self, item):self.heap.append(item)self.N += 1self.swim(self.N)def extract_max(self):if self.N < 1:returnfirst = self.heap[1]# print(f"first: {first}")self.swap(1, self.N)del self.heap[self.N]self.N -= 1self.sink(1, self.N)return firstdef sink(self, index, _range):while 2*index <= _range:max_index = 2*index if 2*index+1 > _range else \(2*index+1 if self.less(2*index, 2*index+1) else 2*index)if self.less(max_index, index):breakself.swap(max_index, index)index = max_indexdef swim(self, index):while index > 1:if self.less(int(index/2), index):self.swap(int(index/2), index)index = int(index/2)if __name__ == '__main__':MPQ = MaxPriorityQueue()MPQ.append('A')MPQ.append('B')MPQ.append('C')MPQ.append('D')MPQ.append('E')MPQ.append('F')MPQ.append('G')while not MPQ.is_empty():_max = MPQ.extract_max()print(_max, end=' ')

Max Priority Queue运行测试结果

G F E D C B A

进行尾部插入元素操作时从小到大附加到队列,依次抽离最大元素是从大到小返回结果

使用堆(数组)实现最小优先队列

核心方法与最大优先队列实习的实现是差不多的,只是在父结点与子结点排序比较时,将两者位置调换,再进行比较和位置移动操作

最小优先队列Python代码实现

import operatorclass MinPriorityQueue:def __init__(self):self.heap = [None]self.N = 0def size(self):return self.Ndef is_empty(self):return self.N == 0def less(self, i, j):return operator.lt(self.heap[i], self.heap[j])def swap(self, i, j):self.heap[i], self.heap[j] = self.heap[j], self.heap[i]def append(self, item):self.heap.append(item)self.N += 1self.swim(self.N)def extract_min(self):if self.N < 1:return_min = self.heap[1]self.swap(1, self.N)del self.heap[self.N]self.N -= 1self.sink(1, self.N)return _mindef swim(self, index):while index > 1:if self.less(index, int(index / 2)):self.swap(index, int(index / 2))index = int(index / 2)def sink(self, index, _range):while 2 * index <= _range:min_index = 2 * index if 2 * index + 1 > _range else \(2 * index if self.less(2 * index, 2 * index + 1) else 2 * index + 1)if self.less(index, min_index):breakself.swap(index, min_index)index = min_indexif __name__ == '__main__':MPQ = MinPriorityQueue()MPQ.append('G')MPQ.append('F')MPQ.append('E')MPQ.append('D')MPQ.append('C')MPQ.append('B')MPQ.append('A')while not MPQ.is_empty():_min = MPQ.extract_min()print(_min, end=' ')

Min Priority Queue运行测试结果

A B C D E F G

数据结构之优先队列:优先队列的介绍与基础操作实现,Python代码实现——14相关推荐

  1. SQL(一)- 数据库介绍与基础操作

    数据库介绍 一.常用的数据库分为两大类: 关系型数据库 非关系型数据库(NoSql) 关系型数据库 概念:是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据. 关系型数 ...

  2. Python人脸识别的简要介绍(附实例、Python代码)

    介绍 你是否意识到,每当你上传照片到Facebook上,平台都会用人脸识别算法来识别图片中的人物?目前还有一些政府在用人脸识别技术来识别和抓捕罪犯.此外,最常见的应用就是通过自己的脸部解锁手机. 计算 ...

  3. python必备基础代码-机器学习算法基础(使用Python代码)

    介绍 谷歌的自动驾驶汽车和机器人受到了很多媒体的关注,但该公司真正的未来是在机器学习领域,这种技术能使计算机变得更聪明,更个性化.-Eric Schmidt(Google董事长) 我们可能生活在人类历 ...

  4. 机器学习算法基础(使用Python代码)

    介绍 谷歌的自动驾驶汽车和机器人受到了很多媒体的关注,但该公司真正的未来是在机器学习领域,这种技术能使计算机变得更聪明,更个性化.-Eric Schmidt(Google董事长) 我们可能生活在人类历 ...

  5. 机器学习算法基础之使用python代码

    介绍 谷歌的自动驾驶汽车和机器人受到了很多媒体的关注,但该公司真正的未来是在机器学习领域,这种技术能使计算机变得更聪明,更个性化.-Eric Schmidt(Google董事长) 我们可能生活在人类历 ...

  6. 人脸识别的简要介绍(附实例、Python代码)

    作者:Guest Blog:翻译:王雨桐:校对:蒋雨畅: 本文约2500字,建议阅读10分钟. 本文将介绍人脸识别的基本思路和对代码进行简要分析. 介绍 你是否意识到,每当你上传照片到Facebook ...

  7. 【Python 基础篇】Python代码 之 缩进规则

    引言 python 对缩进是敏感的,而大多教程对缩进规则,往往就几句话带过,对于没有其他语言基础的初学者,十分不友好,本文就把python常见的缩进问题做了一些整理. 一.Python缩进长度及缩进字 ...

  8. Linux介绍和基础操作

    文章目录 操作系统Linux Linux基础知识 1. Linux 的概述 2. Linux 的历史 3. Linux系统的应用 3.1 服务器系统 3.2 嵌入式系统 3.3 桌面应用系统 3.4 ...

  9. HTML介绍 与基础操作

    1.什么是HTML? HTML 是用来描述网页的一种语言.     HTML 指的是超文本标记语言: HyperText Markup Language     HTML 不是一种编程语言,而是一种标 ...

最新文章

  1. 单片机学习从入门到入土?这3个关键点导致!
  2. 软件加密与授权管理的概念
  3. Burt’s Bees 小蜜蜂纯天然杏仁牛奶蜂蜡护手霜,56g*2罐,$13.92
  4. 死磕 java同步系列之AQS起篇
  5. WinForm 使用 HttpUtility
  6. 身份证(省市)编码表
  7. Qt实现图片的简单压缩
  8. 随笔(一)—2018-1-23-ANU暑期学校-无题
  9. wordpress后台打开速度非常慢怎么办
  10. 手机总是显示服务器太忙,手机总提示服务器太忙请稍后重试
  11. 第5章第16节:案例:制作一份漂亮的翻页动画 [PowerPoint精美幻灯片实战教程]
  12. phpstudy安装yar扩展
  13. 网安实训(十)| Ms12-020 漏洞复现
  14. 接私活/毕业设计必备,基于SpringBoot+Activiti的Java底层框架的实现
  15. 双十一 唯品会内部优惠入口
  16. AIO-3399J重新安装Ubuntu系统-刷新固件
  17. linux下打开png图片不显示,r – 无法显示png
  18. 有哪些布局精心、长久的骗局?
  19. 基于SqlServer环境下创建触发器、级联更新(删除、修改)
  20. 引入阿里云SDK,类找不到的问题

热门文章

  1. Android应用开发—知识点汇总
  2. 网络爬虫--9.正则表达式
  3. Diango博客--6.Markdown 文章自动生成目录
  4. 双目视觉几何框架详解(玉米专栏8篇汇总)
  5. halcon资料链接
  6. 【原】webpack--文件监听的原理
  7. 使用ESP定律_手工脱壳
  8. ZJOI2018 Round2 游记
  9. Django之ORM对数据库操作
  10. Sub-process /usr/bin/dpkg returned an error code (1)解决办法