实践中总结出来对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 ...
随机推荐
- shell脚本实例-安装httpd,安装yum源
1.安装httpd #!/usr/bin/bash getway=192.168.1.1 ping -c1 www.baidu.com &>/dev/null if [ $? -eq 0 ...
- 单臂路由实现VLAN间通信
实验要求:利用路由器完成同vlan能通信,不同vlan也能通信 拓扑如下: 涉及内容有: 1.VTP的创建和配置 2.VLAN的创建和划分 3.路由器的单臂路由配置 配置如下: route1 enab ...
- React-Native 上拉加载下拉刷新
react-native 上下拉加载的控件效果都不好,找了半天没找到,正打算自已封装的时候,无意中找到了一个比较好的控件,大家看一下: react-native-refresh-list-view 这 ...
- hadoop day 2
1.hdfs shell相关命令 #hadoop fs -ls / 查看HDFS根目录 #hadoop fs -mkdir /test 在根目录创建一个目录test #hadoop fs -mkdir ...
- 【转载】 深度强化学习处理cartpole为什么reward很难超过200?
原贴地址: https://www.zhihu.com/question/266493753 一直在看强化学习方面的内容,cartpole是最简单的入门实验环境,最原始的评判标准是连续100次epis ...
- 20165228 2017-2018-2《Java程序设计》课程总结
20165228 2017-2018-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:我期望的师生关系 简要内容: 老师能给我在学习中提供什么帮助 我的看法 我期望的师生关系 ...
- 【linux基础】CMake如何生成动态链接库文件
CMakeLists.txt SET(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/lib) ADD_LIBRARY(filename SHARED ${CURREN ...
- BZOJ 5099: Pionek(双指针)(占位)
pro:有N个向量,你可以选择一些向量,使得其向量和离原点最远. 输出这个欧几里得距离的平方. sol:(感觉网上的证明都不是很充分,我自己也是半信半疑吧)日后证明了再补. #include<b ...
- (18)模型层 -ORM之msql 多表操作(字段的属性)
数据库表的对应关系 1.一对一 #关联字段写在那张表都可以 PS:只要写OneToOneField就会自动加一个id 2.一对多 #关系确立,关联字段写在多的一方 3.多对多 #多对多的关系 ...
- hdu3294 Girls' research manacher
One day, sailormoon girls are so delighted that they intend to research about palindromic strings. O ...