实践中总结出来对heapq的一点理解
关于heapq(优先级队列算法):
heapq.heapify(x):个人理解就是以线性时间(O(n)时间)将一个list转换经过堆排序之后在放入list中,而这种堆特点是根节点必须小于左右节点。曾听到过一个说法,在java里面这种叫堆排序方法做小根堆
例子:
>>> import heapq
>>> list1 = [1,4,7,2,6,23,56,3,7]
>>> heapq.heapify(list1)
>>> list1
[1, 2, 7, 3, 6, 23, 56, 4, 7]
图如下:

heapq.heappush(heap, item) # 将新的值经过堆排序放入到list中
>>> list1
[]
>>> heapq.heappush(list1, 1) # 插入堆
>>> heapq.heappush(list1, 6)
>>> heapq.heappush(list1, 8)
>>> heapq.heappush(list1, 2)
>>> heapq.heappush(list1, 3)
>>> list1
[1, 2, 8, 6, 3]
heapq.heappop(heap) # 弹出经过堆排序之后list中最小值
>>> heapq.heappop(list1) # list1为heapq.heappush()中的list1
1
heapq.heappushpop(heap,item) # 插入一个数,将其按照规则排好再弹出最小值
>>> heapq.heappushpop(list1, 2) # 如果插入的是最小值,那么弹出的会是自己
2
>>> heapq.heappushpop(list1, 4)
3
>>> list1
[4, 6, 8]
heapq.heapreplace(heap,item) # 这个与heappushpop原理有点不同,是先将最小的值弹出来,再新插入的数据放到原来堆排序排好的list中弹出的位置再进行按堆排序规则排序(纯属个人理解,有误请指出,在此多谢)
>>> list1 = [1,3,5,7,9]
>>> heapq.heapreplace(list1, 8)
1
>>> list1
[3, 7, 5, 8, 9]
heapq.nlargest(n,iterable,key=None) # 返回经过堆排序中list最大的n个值
>>> list1 = [1,3,5,7,9]
>>> heapq.nlargest(2, list1)
[9, 7]
>>> list1 = {1:8, 2:7, 3:6}
>>> heapq.nlargest(2, list1, key=lambda x: list1[x]) # 可以使用key来选择判断依据
[1, 2]
heapq.nsmallest(n, iterable, key=None) # 与nlargest相反
>>> list1 = [1,3,5,7,9]
>>> heapq.nsmallest(2, list1)
[1, 3]
>>> list1 = {1:8, 2:7, 3:6}
>>> heapq.nsmallest(2, list1, key=lambda x: list1[x])
[3, 2]
heapq.merge(*iterables,key=None,reverse=False) # 合并两个经过堆排序的list

"""
该注释部分纯属个人理解,由于找不到构建heapq.merge的源码,所以无法真正得出结论,如果哪位大佬可以找到开源的heapq.merge函数可以分享一下
正如下图:(在此定义最小值为1的list为list1,最小值为2的list为list2)
当执行heapq.merge()函数合并时,list1和list2会将根节点(最小值)进行比较,取最小值那个当做合并后的根节点(最小值),当list1弹出最小值后,会将list1新的最小值与刚才未弹出list(list2)最小值再进行比较,以此循环进行比较构建新的经过堆排序的list
正如图片那样,如果有list1的最小值等于list2最小值该如何解决呢?
答:会先执行list1在heapq.merge()中的参数位置比list2靠前。所以本例子的两个76进行比较时,会弹出list1中的76放进新合并的list中
"""
>>> list1 = [1, 3, 4, 5, 76, 8]
>>> list2 = [2, 2, 6, 5, 23, 76, 9, 10]
>>> cheap = heapq.merge(list1, list2)
>>> for i in cheap:
... print(i)
...
1
2
2
3
4
5
6
5
23
76
8
76
9
10
实践中总结出来对heapq的一点理解的更多相关文章
- Vue项目实践中的功能实现与要点
本贴记录项目实践中,各种功能的实现与技术要点,均有待改进. 路由切换的时候,显示loading动画 目前方案是: 在每个页面都手动装载一个loading组件组件的显示依赖vuex里面的一个值 , 在r ...
- .NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结
.NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结 前言 本文主要是关于.NET Standard 代码 在多框架 和 多平台 支持自己实践过程中遇到的一 ...
- 深度学习---1cycle策略:实践中的学习率设定应该是先增再降
深度学习---1cycle策略:实践中的学习率设定应该是先增再降 本文转载自机器之心Pro,以作为该段时间的学习记录 深度模型中的学习率及其相关参数是最重要也是最难控制的超参数,本文将介绍 Lesli ...
- 记一次小团队Git实践(中)
对于初学者,从使用上先入手,往往学的最快,并从中汲取教训,再回头更深入的学习,效果尤佳. 安装git 安装git自不必说,mac已经内置了git,linux下一个命令就能搞定,windows下需要下载 ...
- 编程实践中C语言的一些常见细节
对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个环境获得,为简化起见, ...
- 实践中总结——理解haslayout和BFC
1.HASLAYOUT 首先,haslayout翻译成中文就是:有布局. 所谓布局,指的是一个元素可以对本身和里边的元素进行尺寸计算和定位.这里只是谈IE6/7,据说微软之所以不是对所有元素默认有布局 ...
- 谈谈在DevOps实践中,感觉最重要的这三个技术……
从国内众多DevOps实践中,我们能看到下面三个技术尤其重要和火热: 容器:容器从根本上解决了软件对环境的依懒性,解决了各个环境之间的差异问题:它可以加速部署的速度,提高部署的效率:降低部署的成本.容 ...
- 你应当如何学习C++以及编程(细节是必要的,但不是重要的,把时间用在集中精力去解决问题,而不是学习新技术,那样练不成高手。在实践中提高才是最重要的。最最重要的内功还是长期学习所磨练出来的自学能力)good
最近在学习Qt但由于没有C++的基础,感觉学的很吃力.看到pongba的这篇文章感觉不错就弄过来了, 原文地址:http://blog.csdn.net/qter_wd007/article/deta ...
- rt-thread中动态内存分配之小内存管理模块方法的一点理解
@2019-01-18 [小记] rt-thread中动态内存分配之小内存管理模块方法的一点理解 > 内存初始化后的布局示意 lfree指向内存空闲区首地址 /** * @ingroup Sys ...
随机推荐
- kbmMW SmartService控制返回类型
- 2019-03-19-day014-内置函数
昨日回顾 装饰器 对扩展开放 对修改封闭 不改变原调用方式 def a(c): def b(*args,**kwargs): c(*args,**kwargs) return b a() def a( ...
- 在Intellij IDEA中修改模板中user变量名称
在Intellij IDEA中的注释模板中的${user}名称是根据当前操作系统的登录名来取的,有时候登录名称和我们实际的user名称并不相同. 修改方法如下: 方法一:可以在settings的fil ...
- OSPF路由协议(一)
实验要求:使用OSPF协议,使各个PC之间能够相互通信 拓扑如下: 配置如下: R1enableconfigure terminal interface f0/0ip address 192.168. ...
- pytorch如何能够保证模型的可重复性
问题背景是这样的: 我用了自己定义了pytorch中的模型,并且,在main函数中设置了随机种子用来保证模型初始化的参数是一致的,同时pytorch中的随机种子也能够影响dropout的作用,见链接 ...
- poj-3666 【对dp子状态无后效性的理解】
题目链接 错解: #include <cstdio> #include <cstring> #include <algorithm> #include <io ...
- 2017.5.10 MapReduce内部逻辑
MapReduce内部逻辑 Split:HDFS 中的数据以 Split 方式作为 MapReduce 的输入 Block 是 HDFS 术语,Split 是 MapReduce 术语 通常1个 Sp ...
- Blender的单位:一图弄懂Blender的单位
1设置单位,在右边的场景设置里,可以设置公制,英制.下面还可以设置基础单位长度,就是单位网格对应的长度. 2显示单位,按N出现在右边的属性栏里,可以设置选中的显示长度及角度. 3测量,按T出现在左边d ...
- acm 2044
////////////////////////////////////////////////////////////////////////////////#include<iostream ...
- hdu4847 Wow! Such Doge! KMP
Chen, Adrian (November 7, 2013). “Doge Is An Ac- tually Good Internet Meme. Wow.”. Gawker. Retrieved ...