PyMOTW: heapq¶
PyMOTW: heapq — PyMOTW Document v1.6 documentation
PyMOTW: heapq¶
- 模块: heapq
- 目的: 就地堆排序算法
- python版本:New in 2.3 with additions in 2.5 2.3+, 2.5中有所增加
heapq实现了适用于Python列表的小顶堆排序算法.
描述¶
堆是一种树型数据结构, 其父子节点间具有顺序关系. 二进制堆可以使用一个列表或数组来表示, 其中元素N的孩子所在位置为2*N+1 和 2*N+2(以0开始计算位置). 这种特征让就地重排成为可能, 这样在增加或删除元素时就不需要重新分配内存空间.
大顶堆确保每个父元素都大于或等于他的任一个孩子元素. 而小顶堆则需要每个父元素都要小于或等于他的任一个孩子元素. Python的heapq模块实现的是小顶堆.
创建一个堆¶
有两个基本的堆创建方式, 分别是heappush()和heapify().
使用heappush(), 堆中元素排序顺序是随着新元素的不断增加而不断更新的.
import heapq
from heapq_showtree import show_tree
from heapq_heapdata import data heap = []
print 'random :', data
print for n in data:
print 'add %3d:' % n
heapq.heappush(heap, n)
show_tree(heap)$ python heapq_heappush.py
random : [19, 9, 4, 10, 11, 8, 2] add 19: 19
------------------------------------ add 9: 9
19
------------------------------------ add 4: 4
19 9
------------------------------------ add 10:
4
10 9
19
------------------------------------ add 11: 4
10 9
19 11
------------------------------------ add 8: 4
10 8
19 11 9
------------------------------------ add 2: 2
10 4
19 11 9 8
------------------------------------如果数据已经在内存中了, 使用heapify()进行就地排序会更有效.
import heapq
from heapq_showtree import show_tree
from heapq_heapdata import data print 'random :', data
heapq.heapify(data)
print 'heapified :'
show_tree(data)$ python heapq_heapify.py
random : [19, 9, 4, 10, 11, 8, 2]
heapified : 2
9 4
10 11 8 19
------------------------------------访问堆¶
成功建立堆之后, 可以使用heappop()删除堆中最小的元素. 下面的例子改编自标准库文档中的例子, heapify()和heappop()用于对一个列表进行排序.
import heapq
from heapq_showtree import show_tree
from heapq_heapdata import data print 'random :', data
heapq.heapify(data)
print 'heapified :'
show_tree(data)
print inorder = []
while data:
smallest = heapq.heappop(data)
print 'pop %3d:' % smallest
show_tree(data)
inorder.append(smallest)
print 'inorder :', inorder$ python heapq_heappop.py
random : [19, 9, 4, 10, 11, 8, 2]
heapified : 2
9 4
10 11 8 19
------------------------------------ pop 2: 4
9 8
10 11 19
------------------------------------ pop 4: 8
9 19
10 11
------------------------------------ pop 8: 9
10 19
11
------------------------------------ pop 9: 10
11 19
------------------------------------ pop 10: 11
19
------------------------------------ pop 11: 19
------------------------------------ pop 19: ------------------------------------ inorder : [2, 4, 8, 9, 10, 11, 19]使用heapreplace()可以删除现有元素和用新的值替换已存元素.
import heapq
from heapq_showtree import show_tree
from heapq_heapdata import data heapq.heapify(data)
print 'start:'
show_tree(data) for n in [0, 7, 13, 9, 5]:
smallest = heapq.heapreplace(data, n)
print 'replace %2d with %2d:' % (smallest, n)
show_tree(data)这个功能让你维持了一个固定大小的堆, 这在具有优先级任务队列中是很用的.
$ python heapq_heapreplace.py
start: 2
9 4
10 11 8 19
------------------------------------ replace 2 with 0: 0
9 4
10 11 8 19
------------------------------------ replace 0 with 7: 4
9 7
10 11 8 19
------------------------------------ replace 4 with 13: 7
9 8
10 11 13 19
------------------------------------ replace 7 with 9: 8
9 9
10 11 13 19
------------------------------------ replace 8 with 5: 5
9 9
10 11 13 19
------------------------------------数据极值¶
heapq也包含了2个用于检查迭代对象中最大或最小的值范围. 使用nlargest()和nsmallest()可以获得相对最小或最大的n个数, n一般大于1, 但在有些情况下不能获得正确的值.
import heapq
from heapq_heapdata import data print 'all :', data
print '3 largest :', heapq.nlargest(3, data)
print 'from sort :', list(reversed(sorted(data)[-3:]))
print '3 smallest:', heapq.nsmallest(3, data)
print 'from sort :', sorted(data)[:3]$ python heapq_extremes.py
all : [19, 9, 4, 10, 11, 8, 2]
3 largest : [19, 11, 10]
from sort : [19, 11, 10]
3 smallest: [2, 4, 8]
from sort : [2, 4, 8]Navigation
PyMOTW: heapq¶的更多相关文章
- python中使用heapq查看最大与最小的N个元素列表
怎么从一个集合中获取最大或最小的N个元素列表? heapq模块有两个函数:nlargest() 和 nsmallest() 可以完美解决这个问题. In [39]: import heapq In [ ...
- 每日一“酷”之heapq
作用:heapq模块实现一个适用于Python列表的最小堆排序算法 堆(heap)是一个属性数据结构,其中子节点与父节点是一种有序关系.二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全 ...
- python heapq
这个模块(build-in)实现了一个堆的数据结构,完美的解决了Top-K问题,以后解决Top-K问题的时候,直接把这个模块拿来用就可以了 注意,默认的heap是一个小顶堆! heapq模块提供了如下 ...
- Python使用heapq实现小顶堆(TopK大)、大顶堆(BtmK小)
Python使用heapq实现小顶堆(TopK大).大顶堆(BtmK小) | 四号程序员 Python使用heapq实现小顶堆(TopK大).大顶堆(BtmK小) 4 Replies 需1求:给出N长 ...
- [Python] heapq简介
[Python] heapq简介 « Lonely Coder [Python] heapq简介 judezhan 发布于 2012 年 8 月 8 日 暂无评论 发表评论 假设你需要维护一个列表,这 ...
- Python -- 堆数据结构 heapq - I love this game! - 博客频道 - CSDN.NET
Python -- 堆数据结构 heapq - I love this game! - 博客频道 - CSDN.NET Python -- 堆数据结构 heapq 分类: Python 2012-09 ...
- Python heapq 模块的实现 - A Geek's Page
Python heapq 模块的实现 - A Geek's Page Python heapq 模块的实现
- heapq
heapq-Guest-ChinaUnix博客 假设你需要维护一个列表,这个列表不断有新的元素加入,你需要在任何时候很方便的得到列表中的最大(小)值,因此要求列表始终处于排序完毕状态,怎么办呢 最简单 ...
- Python系列之heapq内置模块
heapq 是 python 的内置模块,源码位于 Lib/heapq.py ,该模块提供了基于堆的优先排序算法. 堆的逻辑结构就是完全二叉树,并且二叉树中父节点的值小于等于该节点的所有子节点的值.这 ...
随机推荐
- Java Socket实现HTTP客户端来理解Session和Cookie的区别和联系
HTTP协议本身是无状态的,即使是同一台电脑同一个浏览器打开同一个页面两次,服务器不知道这两次请求是同一个客户端发送过来的,两次请求是完全独立的.例如,第一次请求时已经登录了,第二次再请求服务器会“忘 ...
- TPersistent的三个用途(读写DFM文件,Assign,RTTI),最主要还是第三个用途
不是什么类对象都需要RTTI,如果把它放在TObject,除了增加可执行文件的大小以及运行内存空间以外,没什么好处.
- 基于visual Studio2013解决C语言竞赛题之1028平均值
题目 解决代码及点评 /* 已知有9个数,请求出这些数中的最大值.最小值及平均值,以及有多少个数等于平均值? */ #include<stdio.h> ...
- Juuluu 旗下企业站点管理系统3.0.1公布!
KgE金刚企业站点管理系统是广州聚龙软件为国内中小企业开发的一款企业站点管理系统,KgE採用可视化的标签模型,可在Dreamvear等网页编辑下可视化编辑,KgE使用javaeemsyqlyuijqu ...
- Swift - 使用Media Player播放本地视频,在线视频
Media Player框架用于播放本地视频.音频,也可以在线播放视频和音频. 1,播放器MPMovieControlStyle样式有如下几种: (1)None: 没有播放控制控件 (2)Embedd ...
- 50个Android开发技巧(11 为文字加入特效)
问题:怎样构建一个模拟LED数字时钟的页面?效果例如以下图所看到的: (原文地址:http://blog.csdn.net/vector_yi/article/details/24460227) 分析 ...
- EasyUI - Layout 布局控件
效果: Html代码: <div id="cc" class="easyui-layout" style="width: 600px; heig ...
- Delphi反射
最近在写一个框架,需要用到反射,与C# java这些原生支持反射的语言不同,delphi对反射的支持相对要弱一些,但也够用了,其实C#的大部分的思想还是从 delphi而来,毕竟都是安德鲁斯的杰作. ...
- 菜鸟级springmvc+spring+mybatis整合开发用户登录功能(下)
昨天介绍了mybatis与spring的整合,今天我们完成剩下的springmvc的整合工作. 要整合springmvc首先得在web.xml中配置springmvc的前端控制器DispatcherS ...
- 深入浅出OpenStack云计算平台管理(nova-compute/network)
一.本课程是怎么样的一门课程(全面介绍) 1.1. 课程的背景 OpenStack是 一个由Rackspace发起.全球开发者共同参与的开源项目,旨在打造易于部署 ...