热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《数据结构与算法Python语言描述》学习笔记chap6(3)优先队列

《数据结构与算法Python语言描述》学习笔记chap6(3)优先队列20191201优先队列作为缓存结构,优先队列与栈和队列类似,可以将数据元素

《数据结构与算法Python语言描述》学习笔记chap6(3)优先队列

20191201


优先队列

作为缓存结构,优先队列与栈和队列类似,可以将数据元素保存其中,可以访问和弹出。
优先队列的特点是存入其中的每项数据都另外附有一个数值,表示这个项的优先程度,称为其优先级。优先队列应该保证,在任何时候访问或弹出的,总是当时在这个结构里保存的所有元素中优先级最高的。如果该元素不弹出,再次访问还将得到他。


优先队列的线性表实现

基于线性表的实现
两种可能的实现方案:
1)在存入数据时,保证表中元素始终按优先顺序排列;任何时候都可以直接取到当时在表里最优先元素。
采用有组织的元素存放方式,存入元素的操作比较麻烦,效率可能较低,但访问和弹出比较方便;
2)存入数据时采用最简单的方式,需要用时,通过检索找到最优先的元素。

基于list实现优先队列

# 优先队列:较小的优先级更高,倒序排列,队头是最小的元素
class PrioQueueError(ValueError):passclass PrioQue:def __init__(self,elist&#61;[]):self._elems &#61; list(elist)self._elems.sort(reverse&#61;True) # 将参数从大到小排列def enqueue(self,e):"""插入到正确的位置"""i &#61; len(self._elems) - 1while i >&#61; 0:if self._elems[i] <&#61; e:i -&#61; 1else:breakself._elems.insert(i&#43;1,e)def is_empty(self):return not self._elemsdef peek(self):if self.is_empty():raise PrioQueueError("in top")return self._elems[-1]def dequeue(self):if self.is_empty():raise PrioQueueError("in pop")return self._elems.pop()prique &#61; PrioQue([3,7,4,8,1])
for i in range(0,3):prique.enqueue(i)
while not prique.is_empty():print(prique.dequeue())

运行结果&#xff1a;
0
1
1
2
3
4
7
8


《数据结构与算法Python语言描述》学习笔记chap6(4&#xff09;堆排序

20191206

优先队列的堆实现

堆及其性质
堆&#xff1a;完全二叉树&#xff0c;但数据要满足一种特殊的堆序&#xff0c;
小顶堆&#xff1a;队中最优先的元素位于二叉树的根节点&#xff1b;
大顶堆&#xff1a;每个结点的数据都大于或等于其子结点的数据&#xff0c;堆顶是最大元素。


堆排序

def heap_sort(elems):def siftdown(elems,e,begin,end):"""将数据插入到合适的位置,作为主函数的内部函数"""i,j &#61; begin,begin*2&#43;1while j < end :if j &#43;1 < end and elems[j&#43;1] < elems[j]:j &#43;&#61; 1if e < elems[j]:breakelems[i] &#61; elems[j]i , j &#61; j,2*j&#43;1elems[i] &#61; eend &#61; len(elems)# 构建小根堆for i in range(end//2,-1,-1):siftdown(elems,elems[i],i,end)# 依次取出最小的元素print(&#39;依次取出最小的元素&#39;)for i in range((end-1),0,-1):e &#61; elems[i]elems[i] &#61; elems[0]siftdown(elems,e,0,i) #调整结构print(elems[0])# end &#61; 9
# for i in range(end//2,-1,-1):
# print(i,end &#61; &#39;&#39;)
#
# print(&#39;&#39;)
# for i in range((end - 1), 0, -1):
# print(i,end &#61; &#39;&#39;)elems &#61; [1,6,8,0,3,5,2]
heap_sort(elems)

注&#xff1a;
range(0,9,-1)
左闭右开&#xff0c;-1表示倒序&#xff0c;所以包含的范围是&#xff1a;0-8
输出应为&#xff1a;8&#xff0c;7&#xff0c;6&#xff0c;5&#xff0c;4&#xff0c;3&#xff0c;2&#xff0c;1&#xff0c;0


推荐阅读
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了解决Facebook脸书面试题中插入区间的方法,通过模拟遍历的方式判断当前元素与要插入元素的关系,找到插入点并将新区间插入。同时对算法的时间复杂度和空间复杂度进行了分析。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
author-avatar
紫青郝_385
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有