关于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的一点理解的更多相关文章

  1. Vue项目实践中的功能实现与要点

    本贴记录项目实践中,各种功能的实现与技术要点,均有待改进. 路由切换的时候,显示loading动画 目前方案是: 在每个页面都手动装载一个loading组件组件的显示依赖vuex里面的一个值 , 在r ...

  2. .NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结

    .NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结 前言 本文主要是关于.NET Standard 代码 在多框架 和 多平台 支持自己实践过程中遇到的一 ...

  3. 深度学习---1cycle策略:实践中的学习率设定应该是先增再降

    深度学习---1cycle策略:实践中的学习率设定应该是先增再降 本文转载自机器之心Pro,以作为该段时间的学习记录 深度模型中的学习率及其相关参数是最重要也是最难控制的超参数,本文将介绍 Lesli ...

  4. 记一次小团队Git实践(中)

    对于初学者,从使用上先入手,往往学的最快,并从中汲取教训,再回头更深入的学习,效果尤佳. 安装git 安装git自不必说,mac已经内置了git,linux下一个命令就能搞定,windows下需要下载 ...

  5. 编程实践中C语言的一些常见细节

    对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个环境获得,为简化起见, ...

  6. 实践中总结——理解haslayout和BFC

    1.HASLAYOUT 首先,haslayout翻译成中文就是:有布局. 所谓布局,指的是一个元素可以对本身和里边的元素进行尺寸计算和定位.这里只是谈IE6/7,据说微软之所以不是对所有元素默认有布局 ...

  7. 谈谈在DevOps实践中,感觉最重要的这三个技术……

    从国内众多DevOps实践中,我们能看到下面三个技术尤其重要和火热: 容器:容器从根本上解决了软件对环境的依懒性,解决了各个环境之间的差异问题:它可以加速部署的速度,提高部署的效率:降低部署的成本.容 ...

  8. 你应当如何学习C++以及编程(细节是必要的,但不是重要的,把时间用在集中精力去解决问题,而不是学习新技术,那样练不成高手。在实践中提高才是最重要的。最最重要的内功还是长期学习所磨练出来的自学能力)good

    最近在学习Qt但由于没有C++的基础,感觉学的很吃力.看到pongba的这篇文章感觉不错就弄过来了, 原文地址:http://blog.csdn.net/qter_wd007/article/deta ...

  9. rt-thread中动态内存分配之小内存管理模块方法的一点理解

    @2019-01-18 [小记] rt-thread中动态内存分配之小内存管理模块方法的一点理解 > 内存初始化后的布局示意 lfree指向内存空闲区首地址 /** * @ingroup Sys ...

随机推荐

  1. kbmMWLog同时输出日志到多个日志管理器

    kbmMWLog日志框架,针对不同的业务情况,提供了多种日志管理器: TkbmMWStreamLogManager TkbmMWLocalFileLogManager TkbmMWSystemLogM ...

  2. JAVA_关键词01_instanceof的应用

    A instanceof  B: 对象A是否是 B类的一个实例 应用举例:

  3. 2016 多校联赛7 Joint Stacks (优先队列)

    A stack is a data structure in which all insertions and deletions of entries are made at one end, ca ...

  4. React Native项目集成iOS原生模块

    今天学习一下怎么在React Native项目中集成iOS原生模块,道理和在iOS原生项目中集成React Native模块类似.他们的界面跳转靠的都是iOS原生的UINavigationContro ...

  5. ecmall 的一些方法说明

    ecmall/eccore /ecmall.php 常量: define('START_TIME', ecm_microtime()); define('IS_POST', (strtoupper($ ...

  6. thinkphp5.0自定义验证器

    虽然我早就会些php基础语法,我套过数据,自己写的控制器层,不是用的api方式,那个公司是为了锻炼我,所以才那样做的,基本上的东西都是用的框架自带的,重来自己没有去封装过这些东西,所以编程思想上,还很 ...

  7. 使用Git来撤销修改

    首先进入一个有Git管理的文件夹下: 当我们在文件编写过程中出现了一个错误怎么办呢?如下: 但是此时你并没有将文件提交缓冲区,你可以去手动打卡文件删除这个错误. 当然你也可以查看一下状态: 发现这个文 ...

  8. vs2015连接mysql进行数据库操作

    要求:电脑提前安装好vs,mysql. 1.在需要连接mysql的项目上右键选择“属性” -> “C/C++” -> “常规” ->选择“附加包含目录” 在弹出窗口中添加mysql的 ...

  9. java list 的遍历

    import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.I ...

  10. P2279 消防局的设立(贪心+dp)

    题目链接:传送门 题目大意: 给定一棵树(N个基地N-1条边): 用半径为2的消防局覆盖这N个基地,问最小的消防局数量. (树上距离为k的最小覆盖问题) 思路: 每次贪心地找到不被覆盖的最深的一个节点 ...