python的十大数据结构之堆队列heapq(heap queue)
heap queque(堆队列),是一个完全二叉树,并且满足一个条件:每个节点(叶节点除外)的值都大于等于(或小于等于)它的子节点。提供了构建小顶堆的方法和一些小顶堆的基本操作方法(如入堆、出堆等),可以用于实现堆排序算法。
创建堆的两种方法:
import heapq lists = [3, 10, 20, 52, 2, 83, 52, 81, 51]
#一、 创建空列表,然后使用heappush将数据添加到空列表中,每添加一个新数据后,该列表都满足小顶堆特性。
heap = []
for i in lists:
heapq.heappush(heap, i)
print("lists: ",lists)
print("heap: ",heap)
# 二、使用heapify直接将数据列表调整为小顶堆格式
heapq.heapify(lists)
print("The lists after heap is : ",lists)
注:小顶堆含义,每个节点(叶节点除外)的值都小于等于其子节点的值,根节点的值是所有节点中最小的。大顶堆反之。
使用heapq进行堆排序:
import heapq
lists = [3, 10, 20, 52, 2, 83, 52, 81, 51]
# 这里需要先构建堆,否则直接heappop得不到排序后的结果
heap = []
for i in lists:
heapq.heappush(heap, i) print(heap[0])
# heappop(heap),依次取出堆顶的值,并将剩余的数据构造成新的小顶堆
heap_sort = [heapq.heappop(heap) for _ in range(len(heap))]
print("heap sort result: ", heap_sort)
获取堆中的最大值和最小值
import heapq lists = [3, 10, 20, 52, 2, 83, 52, 81, 51]
# 这里的heapq.heapify(lists)写与不写效果一样
heapq.heapify(lists)
# heapq.nlargest和heapq.nsmallest两个函数可以用于堆,也可以用于列表,功能相同。所以前面无需构造堆
print(heapq.nlargest(2, lists))
print(heapq.nsmallest(3, lists))
堆中元素的替换方法
import heapq # 这里演示heappushpop和heapreplace的用法
# heappushpop,先入堆再出堆,所以堆元素不变化
array_c = [10, 7, 15, 8]
heapq.heapify(array_c)
print("before: ",array_c)
# 先push再pop
item = heapq.heappushpop(array_c, 5)
print("after: ",array_c)
print(item) # heapreplace,先出堆,再将新元素入堆,堆元素发生变化
array_d = [10, 7, 15, 8]
heapq.heapify(array_d)
print("before: ",array_d)
item = heapq.heapreplace(array_d, 5)
print("after: ",array_d)
print(item)
堆的方法:
heapq.heapify(x):创建堆,将list转化为堆
heapq.heappush(heap, item): 添加新元素到堆
heapq.heappop(heap):弹出堆顶元素,并将剩余元素组成新的小顶堆
heap.heappushpop(heap, item):先将item入堆,再将item出堆
heapq.merge(*iterables, key = None, reverse = False):暂未了解
heapq.heapreplace(heap, item):先弹出堆顶元素,再将item入堆
heapq.nlargest(n, iterable, key = None):取堆、队列中最大的n个值,key为关键字,使用示例:cheap = heapq.nsmallest(3, portfolio, key = lambda s:s['price'])
heapq.nsmallest(n, iterable, key = None)
python的十大数据结构之堆队列heapq(heap queue)的更多相关文章
- python实现十大经典排序算法
Python实现十大经典排序算法 代码最后面会给出完整版,或者可以从我的Githubfork,想看动图的同学可以去这里看看: 小结: 运行方式,将最后面的代码copy出去,直接python sort. ...
- 一篇夯实一个知识点系列--python实现十大排序算法
写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...
- Python实现十大经典排序算法(史上最简单)。
十大排序算法(Python实现)一. 算法介绍及相关概念解读 算法分类十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn), ...
- Python实现十大经典排序算法(史上最简单)
十大排序算法(Python实现)一. 算法介绍及相关概念解读 算法分类十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn), ...
- 用Python实现十大经典排序算法-插入、选择、快速、冒泡、归并等
本文来用图文的方式详细讲解了Python十大经典排序算法 —— 插入排序.选择排序.快速排序.冒泡排序.归并排序.希尔排序.插入排序.桶排序.基数排序.计数排序算法,想要学习的你们,继续阅读下去吧,如 ...
- 排序算法——(2)Python实现十大常用排序算法
上期为大家讲解了排序算法常见的几个概念: 相关性:排序时是否需要比较元素 稳定性:相同元素排序后是否可能打乱 时间空间复杂度:随着元素增加时间和空间随之变化的函数 如果有遗忘的同学可以看排序算法——( ...
- C++数据结构之链式队列(Linked Queue)
C++数据结构之链式队列,实现的基本思想和链式栈的实现差不多,比较不同的一点也是需要注意的一点是,链式队列的指向指针有两个,一个是队头指针(front),一个是队尾指针(rear),注意指针的指向是从 ...
- Python不能用于大型项目?人们对Python的十大误解
Python 类型系统的特点是拥有强大.灵活的类型操作. 维基百科上对此作出的阐述. 而存在一个不争而有趣的事实是, Python 是比Java更加强类型的. Java 对于原生类型和对象区分了类型系 ...
- python实现十大核心算法(桶排没实例)
# author:sevenduke # 2019-06-11 # 一.交换排序 # 排序算法的温故:冒泡排序 def dubblesort(arr): for i in range(0, len(a ...
- 人工智能+Python:十大Markdown语法简明教程
Markdown 是一种轻量级的标记语言,用户可以使用诸如 * # 等简单的标记符号以最小的输入代价生成极富表现力的文档,目前也被越来越多的写作爱好者,撰稿者广泛使用.本文希望用直观的方法来讲述Mar ...
随机推荐
- 【H5】11 表格
概述: 在HTML中一个很普通的任务是构建表格数据,有大量的元素和属性是来满足这种需求的. 只需要一点儿的CSS来设定风格,HTML让在web上显示表格数据变的很容易,例如你的学校的教学计划,你当地的 ...
- 【Vue】Re01 理论概念和入门上手
一.Vue概述 什么是渐进式?1.把Vue作应用的一部分嵌套项目中2.如果完全抛弃其他组件和框架,Vue又具有丰富的生态和库莱支持3.Core + Router + VueX 满足项目绝大多数的需求- ...
- 全网最适合入门的面向对象编程教程:30 Python的内置数据类型-object根类
全网最适合入门的面向对象编程教程:30 Python 的内置数据类型-object 根类 摘要: 在 Python 中,所有的类都直接或间接继承自一个根类,这个根类是Object.Object类是 P ...
- 外观很好看的云盘:一款开源的云盘系统 —— kodcloud
看到一款外观十分好看的开源云盘系统: 下载地址: https://kodcloud.com/explorer/download/ 开源地址: https://github.com/kalcaddle ...
- 强化学习中atari游戏环境下帧的预处理操作
在网上找到一个Rainbow算法的代码(https://gitee.com/devilmaycry812839668/Rainbow),在里面找到了atari游戏环境下帧的预处理操作. 具体代码地址: ...
- Pintia 天梯地图 dijkstra进阶
7-14 天梯地图 - SMU 2024 spring 天梯赛3(补题) (pintia.cn) dijkstra进阶做法,包含路径记录,以及按权重统计路径条件等; 不过最开始我一直将优先队列开的最大 ...
- containerd:配置https私有镜像仓库的最新方法
随着containerd应用越来越广泛,我们必须紧跟官网的节奏. 之前配置https私有镜像仓库的方法比较繁琐,并且不易梳理,下边介绍一下目前最新的配置方法. 配置https私有镜像仓库 我假设你现在 ...
- 四,分析Spring Boot底层机制(Tomcat 启动分析+Spring容器初始化+Tomcat如何关联 Spring 容器) 以及个人编写启动 Tomcat
四,分析Spring Boot底层机制(Tomcat 启动分析+Spring容器初始化+Tomcat如何关联 Spring 容器) 以及个人编写启动 Tomcat @ 目录 四,分析Spring Bo ...
- 使用 nuxi clean 命令清理 Nuxt 项目
title: 使用 nuxi clean 命令清理 Nuxt 项目 date: 2024/9/1 updated: 2024/9/1 author: cmdragon excerpt: nuxi cl ...
- MJUCTF—WP
1.猫娘 点开发现有两个文件, 一个加密压缩包, 一个word文档 点开word发现是兽音加密, 点开在线网站进行解密 # 得到一段文本, 先进行分割 小小年内则伏勤, 阵阵寒风刺骨寒. 是处寂寞无人 ...