Python标准库模块之heapq – 堆构造
Python标准库模块之heapq – 堆构造
读前福利:几百本经典书籍https://www.johngo689.com/2158/
原文链接:https://www.johngo689.com/2264/
堆作为优先队列的常用方法,而且在数据结构和算法方面,经常使用大顶堆和小顶堆进行问题的解决。
使用 Python 提供的标准库heapq:
import heapq
注意:默认的堆结构是小顶堆
一、构造堆 & 获取最小值
方法一:创建空列表,然后手动加入元素
heapq.heappush()
举例:
>>> nums = [2, 5, 1, 6, 9, 0]
>>> heap = []
>>> for num in nums:
... heapq.heappush(heap, num)
...
>>> print(heap[0])
0
>>> print([heapq.heappop(heap) for _ in range(len(nums))])
[0, 1, 2, 5, 6, 9]
方法二:初始化 list,然后转为堆结构
heapq.heapify(list)
直接将 list 转为堆结构
举例:
>>> nums = [2, 5, 1, 6, 9, 0]
>>> # 转为heap结构
...
>>> heap.heapify(nums)
>>> print(nums[0])
0
>>> print([heapq.heappop(nums) for _ in range(len(nums))])
[0, 1, 2, 5, 6, 9]
删除最小值 并且 加入新元素, 使用heapq.heaprepalce()
>>> nums = [2, 5, 1, 6, 9, 0]
>>> # 转为heap结构
...
>>> heap.heapify(nums)
>>> heapq.heapreplace(nums, 100)
0
>>> heapq.heapreplace(nums, -1)
1
>>> print([heapq.heappop(nums) for _ in range(len(nums))])
[-1, 2, 5, 6, 9, 100]
二、获取最大值
这里没有直接构造大顶堆的方法,可以使用一个很巧妙的思路进行解决。
这是一个很 Tirck 的思路:
首先我们用上述方法一进行构造堆结构,注意要在每一个元素增加一个负号(-):
>>> nums
[0, 5, 1, 6, 9, 2]
>>> nums = [2, 5, 1, 6, 9, 0]
>>> heap = []
>>> for num in nums:
... heapq.heappush(heap, -num)
>>> heap
[-9, -6, -1, -2, -5, 0]
接下来,打印堆元素,注意也要加负号(-):
>>> print([-heapq.heappop(heap) for _ in range(len(nums))])
[9, 6, 5, 2, 1, 0]
这样是不是就巧妙的将大顶堆进行打印出来了。
整体思路:push(-) -> pop(-),负负得正。
三、获取最小值和最大值的范围
获取堆中最大或最小的范围值。
使用heapq.nlargest() 或heapq.nsmallest() 函数进行求得:
>>> nums = [2, 5, 1, 6, 9, 0]
>>> heapq.heapify(nums)
>>> heapq.nlargest(3, nums)
[9, 6, 5]
>>> heapq.nsmallest(3, nums)
[0, 1, 2]
这个比较简单,需要主要添加范围值。
Python标准库模块之heapq – 堆构造的更多相关文章
- 【python标准库模块一】时间模块time学习
本文介绍python的标准库模块time的常见用法 时间模块time 导入时间模块 import time 得到时间戳,这是统计从1970年1月1日0点0分到现在经过了多少秒,一般用于加减法一起用,比 ...
- 【python标准库模块五】Xml模块学习
Xml模块 xml本身是一种格式规范,是一种包含了数据以及数据说明的文本格式规范.在json没有兴起之前各行各业进行数据交换的时候用的就是这个.目前在金融行业也在广泛在运用. 举个简单的例子,xml是 ...
- 【python标准库模块四】Json模块和Pickle模块学习
Json模块 原来有个eval函数能能够从字符串中提取出对应的数据类型,比如"{"name":"zhangsan"}",可以提取出一个字典. ...
- 【python标准库模块三】Os模块和Sys模块学习
Os模块 导入os模块 import os 获取当前工作目录 os.getcwd() 切换目录,跟linux中的cd一样 os.chdir("文件夹名") 递归生成文件夹 os.m ...
- 【python标准库模块二】random模块学习
random模块是用来生成随机数的模块 导入random模块 import random 生成一个0~1的随机数,浮点数 #随机生成一个0~1的随机数 print(random.random()) 生 ...
- Python标准库笔记(11) — Operator模块
Operator--标准功能性操作符接口. 代码中使用迭代器时,有时必须要为一个简单表达式创建函数.有些情况这些函数可以用一个lambda函数实现,但是对于某些操作,根本没必要去写一个新的函数.因此o ...
- Python标准库笔记(10) — itertools模块
itertools 用于更高效地创建迭代器的函数工具. itertools 提供的功能受Clojure,Haskell,APL和SML等函数式编程语言的类似功能的启发.它们的目的是快速有效地使用内存, ...
- [python标准库]Pickle模块
Pickle-------python对象序列化 本文主要阐述以下几点: 1.pickle模块简介 2.pickle模块提供的方法 3.注意事项 4.实例解析 1.pickle模块简介 The pic ...
- [python标准库]XML模块
1.什么是XML XML是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分.您可以创建内容,然后使用限定标记标记它,从而使每个单词. ...
随机推荐
- cookie实现访问时间查看
package day01.cookies; import java.io.IOException; import java.net.URLDecoder; import java.net.URLEn ...
- Linux centos 安装 mysql 5.7
一.mysql下载 1.方式一(简单粗暴) 直接在linux 目录下:wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.25-l ...
- go进阶--测试
目录 1.单元测试 1.1项目结构 1.2 源代码文件 1.3 单元测试 1.4 执行测试 1.5 单元测试总结 2.性能测试 2.1 项目结构 2.2 源码文件 2.3 测试文件 2.4 执行测试 ...
- 你的域名是如何变成 IP 地址的?
我的 个人网站 上线了,上面可以更好的检索历史文章,并且可以对文章进行留言,欢迎大家访问 可能大家都知道或者被问过一个问题,那就是很经典的「从浏览器输入 URL 再到页面展示,都发生了什么」.这个问题 ...
- C++之常指针,指针常量,函数指针,const用法总结
1.const char *p,char const *p,char * const p 对于C++而言,没有const * 修饰符,所以,const只可以修饰类型或者变量名.因而const char ...
- Java基础之SPI机制
SPI 机制,全称为 Service Provider Interface,是一种服务发现机制.它通过在 ClassPath 路径下的 META-INF/services 文件夹查找文件,自动加载文件 ...
- Java 字符串格式化和工具类使用
前言 我们在做项目时候经常需要对字符串进行处理,判断,操作,所以我就总结了一下java 字符串一些常用操作,和推荐比较好用我在自用的工具类,毕竟有轮子我们自己就不用重复去写了,提供开发效率,剩下的时间 ...
- 20210716考试-NOIP16
考场时Prim的 $i$ 写成 $k$ 100->0 rank1->rank23 T1 Star Way To Heaven 考场正解:假设你要二分答案,则几个圆组成几道"屏障& ...
- python模块--glob, fnmatch
包/方法 返回值 参数 说明 glob Unix shell样式的路径扩展 .glob() list 匹配满足规则的所有路径(默认以 . 开头的文件不会匹配到, 可以用 .* 来匹配) pat ...
- python库--tensorflow--可视化
方法 返回值类型 参数 说明 tf.summary .FileWrite() 创建事件文件 logdir 文件保存路径(C盘), 通过tensorboard --logdir=文件路径(l ...