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 ,该模块提供了基于堆的优先排序算法. 堆的逻辑结构就是完全二叉树,并且二叉树中父节点的值小于等于该节点的所有子节点的值.这 ...
随机推荐
- 在Myeclipse中安装java Decompiler
由于在myeclipse中的Help选项中没有Install New Software,所以在eclipse中安装插件的方法并不适应于Myeclipse,但是我们可以通过点击Windows->P ...
- mysql服务无法启动
可能是没有data文件夹,可以新建或拷贝以前的data文件夹到安装目录.
- 怎样实现cocos2d-x之文字渲染
// 1.创建一段文本 // create函数的三个参数分别为:文本内容.字体和字体大小 CCLabelTTF *font=CCLabelTTF::create("Hello World&q ...
- VC实现URL编解码器
//变化UTF8为了中国 void UTF8ToGB(CString& szstr) { WCHAR* strSrc; TCHAR* szRes; int i = MultiByteToWid ...
- ssh登录的时候,根本不给输入密码的机会,直接拒绝,是因为BatchMode的设置
BatchMode no“BatchMode”如果设为“yes”,passphrase/password(交互式输入口令)的提示将被禁止.当不能交互式输入口令的时候,这个选项对脚本文件和批处理任务十分 ...
- 开源数据库连接池之Tomcat内置连接池
本篇介绍几种开源数据库连接池,同时重点讲述如何使用Tomcat服务器内置的数据库连接池. 之前的博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式.这样能减少数 ...
- Cocos2d-x教程第(11)讲-利用遮罩(蒙版)CCLayerColor制作新手引导界面(上)
欢迎转载,转载时请注明原文出处:http://blog.csdn.net/u012945598/article/details/17280019 源码下载地址:http://download.csdn ...
- php调用dll
http://download.csdn.net/detail/pinghe2005/5108556
- hbase memstorelab
关于MemStore的补充 在通过HStore.add向store中加入�一个kv时,首先把数据写入到memstore中.这一点没有什么说明: publiclongadd(finalKeyValue ...
- Entity - 使用EF框架进行增删改查 - 数据库先行
数据库先行:先创建数据库,然后进行增删查该操作. 要操作的表结构(表名:Tb_Category): 创建一个控制台程序: 添加一个ADO.NET实体数据模型: 1.对控制台程序右键 2.选择ADO.N ...