数据结构之优先队列:优先队列的介绍与基础操作实现,Python代码实现——14
优先队列(Priority queue)的介绍
- 优先队列是计算机中一种抽象的数据结构类,它有着一个类似和队列或者堆的结构,但是其中每个元素额外有一个优先级别
- 在一个优先队列中,一个高优先顺序的元素会先执行与低优先顺序的元素。在它的执行过程中,如果两个元素拥有相同的优先顺序,则会根据他们进入队列的先后顺序来确定执行先后,但是在在其他类型的数据结构中,如果两个元素优先级别相同,则不会定义这两个元素的先后执行顺序
- 优先队列一般使用堆来进行实现,但他们在概念上与堆是有区别的。一个优先队列它可以是一个“列表”,也可以是一个“字典”,正如一个列表可以使用链表或者数组来实现一样,优先队列可以用堆或者其他各种不同的方法,如无序数组来实现
要实现的两种优先队列
两种优先队列:
- 最大优先队列(Max priority queue),最大优先级的元素在队列最前面,可以指定最大元素取出和删除
- 最小优先队列(Max priority queue),最小优先级的元素在队列最前面,可以指定最小元素取出和删除
使用堆(数组)实现最大优先队列
定义方法
- size()获取队列大小
- less(x, y)对传入的两个索引对应当前队列的元素进行大小比较
- is_empty()判断队列是否为空
- swap(i, j)对传入的两个索引对应当前队列中的元素进行值交换
- append(item)在队列末尾添加指定元素
- extract_max()取出并删除最大优先级的元素
- sink()使用下沉排序操作,对删除元素后的队列进行排序
- 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相关推荐
- SQL(一)- 数据库介绍与基础操作
数据库介绍 一.常用的数据库分为两大类: 关系型数据库 非关系型数据库(NoSql) 关系型数据库 概念:是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据. 关系型数 ...
- Python人脸识别的简要介绍(附实例、Python代码)
介绍 你是否意识到,每当你上传照片到Facebook上,平台都会用人脸识别算法来识别图片中的人物?目前还有一些政府在用人脸识别技术来识别和抓捕罪犯.此外,最常见的应用就是通过自己的脸部解锁手机. 计算 ...
- python必备基础代码-机器学习算法基础(使用Python代码)
介绍 谷歌的自动驾驶汽车和机器人受到了很多媒体的关注,但该公司真正的未来是在机器学习领域,这种技术能使计算机变得更聪明,更个性化.-Eric Schmidt(Google董事长) 我们可能生活在人类历 ...
- 机器学习算法基础(使用Python代码)
介绍 谷歌的自动驾驶汽车和机器人受到了很多媒体的关注,但该公司真正的未来是在机器学习领域,这种技术能使计算机变得更聪明,更个性化.-Eric Schmidt(Google董事长) 我们可能生活在人类历 ...
- 机器学习算法基础之使用python代码
介绍 谷歌的自动驾驶汽车和机器人受到了很多媒体的关注,但该公司真正的未来是在机器学习领域,这种技术能使计算机变得更聪明,更个性化.-Eric Schmidt(Google董事长) 我们可能生活在人类历 ...
- 人脸识别的简要介绍(附实例、Python代码)
作者:Guest Blog:翻译:王雨桐:校对:蒋雨畅: 本文约2500字,建议阅读10分钟. 本文将介绍人脸识别的基本思路和对代码进行简要分析. 介绍 你是否意识到,每当你上传照片到Facebook ...
- 【Python 基础篇】Python代码 之 缩进规则
引言 python 对缩进是敏感的,而大多教程对缩进规则,往往就几句话带过,对于没有其他语言基础的初学者,十分不友好,本文就把python常见的缩进问题做了一些整理. 一.Python缩进长度及缩进字 ...
- Linux介绍和基础操作
文章目录 操作系统Linux Linux基础知识 1. Linux 的概述 2. Linux 的历史 3. Linux系统的应用 3.1 服务器系统 3.2 嵌入式系统 3.3 桌面应用系统 3.4 ...
- HTML介绍 与基础操作
1.什么是HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言: HyperText Markup Language HTML 不是一种编程语言,而是一种标 ...
最新文章
- 单片机学习从入门到入土?这3个关键点导致!
- 软件加密与授权管理的概念
- Burt’s Bees 小蜜蜂纯天然杏仁牛奶蜂蜡护手霜,56g*2罐,$13.92
- 死磕 java同步系列之AQS起篇
- WinForm 使用 HttpUtility
- 身份证(省市)编码表
- Qt实现图片的简单压缩
- 随笔(一)—2018-1-23-ANU暑期学校-无题
- wordpress后台打开速度非常慢怎么办
- 手机总是显示服务器太忙,手机总提示服务器太忙请稍后重试
- 第5章第16节:案例:制作一份漂亮的翻页动画 [PowerPoint精美幻灯片实战教程]
- phpstudy安装yar扩展
- 网安实训(十)| Ms12-020 漏洞复现
- 接私活/毕业设计必备,基于SpringBoot+Activiti的Java底层框架的实现
- 双十一 唯品会内部优惠入口
- AIO-3399J重新安装Ubuntu系统-刷新固件
- linux下打开png图片不显示,r – 无法显示png
- 有哪些布局精心、长久的骗局?
- 基于SqlServer环境下创建触发器、级联更新(删除、修改)
- 引入阿里云SDK,类找不到的问题