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)是关键部分.您可以创建内容,然后使用限定标记标记它,从而使每个单词. ...
随机推荐
- list切片
对list进行切片 取一个list的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['Adam', 'Lisa', 'Bart', 'Paul'] 取前3个元素 ...
- Spring Mvc原理分析(一)
Servlet生命周期了解 Servlet的生命(周期)是由容器(eg:Tomcat)管理的,换句话说,Servlet程序员不能用代码控制其生命. 加载和实例化:时机取决于web.xml的定义,如果有 ...
- nacos在nginx下集群以及数据库问题
持久化mysql时指定数据库编辑application.properties spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql ...
- LeetCode入门指南 之 回溯思想
模板 result = {} void backtrack(选择列表, 路径) { if (满足结束条件) { result.add(路径) return } for 选择 in 选择列表 { 做选择 ...
- 用CUDA写出比Numpy更快的规约求和函数
技术背景 在前面的几篇博客中我们介绍了在Python中使用Numba来写CUDA程序的一些基本操作和方法,并且展示了GPU加速的实际效果.在可并行化的算法中,比如计算两个矢量的加和,或者是在分子动力学 ...
- JavaSE基础之Java中的数据类型
基本数据类型:8个 整数类型(4):byte short int long 浮点类型(2):float double 字符类型:char 布尔类型:boolean 引用数据类型:3个 数组 类:cla ...
- C#使用异步需要注意的几个问题
C#异步使用需要注意的几个问题1.异步方法如果只是对别的方法的简单的转发调用,没哟复杂的逻辑(比如等待A的结果,再调用B,等待A调用的返回值拿到内部做一些处理再返回),那么就可以去掉async关键字. ...
- Aggressor Script 开发-Powershell 免杀
转载https://www.jianshu.com/p/f158a9d6bdcf 前言 在接触到Cobalt Strike的时候就知道有各种插件,想象着那天也可以自己学习编写一个.在之前分析Cobal ...
- Docker(42)- 镜像原理之联合文件系统
前言 学习狂神老师的 Docker 系列课程,并总结 镜像是什么 镜像是一种轻量级.可执行的独立软件保,用来打包软件运行环境和基于运行环境开发的软件 他包含运行某个软件所需的所有内容,包括代码.运行时 ...
- Toast控件
------------恢复内容开始------------ 四种常见的App弹窗设计:Toast.Dialog.Actionbar 和 Snackbar 弹窗又称为对话框,是App与用户进行交互的常 ...