每日一“酷”之heapq
作用:heapq模块实现一个适用于Python列表的最小堆排序算法
堆(heap)是一个属性数据结构,其中子节点与父节点是一种有序关系。二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树)。可以使用以下如下方式组织的列表或数表示,即元素N的子元素位于2*N+1和2*N+2。这种布局允许原地重新组织堆,从而不必再增加或删除元素时分配大量内存。
最大堆确保父节点大于或等于其两个子节点。最小堆要求父节点小雨或等于其子节点。Python的heqpq模块实现了一个最小堆。
1、示例数据
数据存储在:heapq_heapdata.py中
data = [19,9,4,10,11]
堆的输出存储在heapq_showtree.py
import math
import cStringIO def show_tree(tree,total_width=36,fill=' '):
output = cStringIO.StringIO()
last_row = -1
for i,n in enumerate(tree):
if i :
row = int(math.floor(math.log(i+1,2)))
else:
row = 0
if row != last_row:
output.write('\n')
columns = 2 ** row
col_width = int(math.floor((total_width * 1.0) / columns))
output.write(str(n).center(col_width,fill))
last_row = row
print output.getvalue()
print '-' * total_width
return
2、创建堆
创建堆的两种基本方式:heappush()和heapify()
import heapq
from heapq_heapdata import data
from heapq_showtree import show_tree heap = []
print 'random : ' , data
for n in data:
print 'add %3d:' % n
heapq.heappush(heap,n)
show_tree(heap)
运行结果:
使用heappush()时,从数据源增加新元素时会保持元素的堆顺序
如果数据已经存在内存中,使用heaoify()原地重新组合字列表中的元素会更高效
import heapq
from heapq_heapdata import data
from heapq_showtree import show_tree heap = []
print 'random : ' , data
heapq.heapify(data)
print 'heapifed : '
show_tree(data)
运行结果:
如果按堆顺序一次一个元素构建列表,其结果与构建一个无序列表在调用heapify()是一样的。
3、访问堆内容
一旦堆已正确组织,就可以使用heappop()删除有最小值的元素
import heapq
from heapq_heapdata import data
from heapq_showtree import show_tree print 'random :', data
heapq.heapify(data)
print 'heapifed : '
show_tree(data)
for i in xrange(2):
smallest = heapq.heappop(data)
print 'pop %3d:' % smallest
show_tree(data)
运行结果:
这个例子是由stdlib文档改写的,其中使用了heapify()和heappop()对一个数组列表排序。
如果希望在一个操作中删除现有元素并替换新值,可以使用heapreplace()。
import heapq
from heapq_heapdata import data
from heapq_showtree import show_tree heapq.heapify(data)
print 'start:'
show_tree(data)
for n in [0,13]:
smallest = heapq.heapreplace(data, n)
print 'replace %2d with %3d' % (smallest,n)
show_tree(data)
运行结果:
通过原地替换元素,这样可以维持一个固定大小的堆,如按优先级排序的作业队列。
4、堆的数据极值
Heapq还包括两个检查可迭代对象的函数,查找其中包含最大值或最小值的范围
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]
运行结果:
只有当n值(n>1)相对小时使用nlargest()和nsmallest()才算高效,不过有些情况下这两个函数会很方便。
每日一“酷”之heapq的更多相关文章
- 每日一“酷”之Cookie
Cookie---Http Cookie 作用:Cookie模块定义一些类来解析和创建HTTP cookie首部 Cookie模块为大多数符合RFC 2109的cookie实现一个解析器.这个实现没有 ...
- 每日一“酷”之Queue
Queue—线程安全的FIFO实现 作用:提供一个线程安全的FIFO实现 Queue模块提供了一个适用于多线程编程的先进先出(first-in,first-out)数据结构,可以用来在生产者和消费者线 ...
- 每日一“酷”之pprint
pprint – 美观打印 作用:美观打印数据结构 pprint 包含一个“美观打印机”,用于生成数据结构的一个美观视图.格式化工具会生成数据结构的一些表示,不仅可以由解释器正确地解析,而且便于人类阅 ...
- 每日一“酷”之copy
Copy – 复制对象 作用:提供一些函数,可以使用浅副本或深副本语义复制对象. copy模块包括两个函数copy()和deepcopy(),用于复制现有的对象 1. 浅副本 copy()创建的浅副 ...
- 每日一“酷”之bisect
作用:维护有序列表,而不必在每次想列表增加一个元素时调用sort排序 bisect 模块实现了一个算法用于向列表中插入元素,同时仍保持列表有序.有些情况下,这比反复对一个了表序列更高效,另外也比构建一 ...
- 每日一“酷”之array
array--国定类型数据序列 array模块定义一个序列数据结构,看起来和list非常相似,只不过所有成员都必须是相同的基本类型. 1.初始化 array实例化时可以提高一个参数来描述允许哪个种数据 ...
- 每日一“酷”之difflib
介绍:difflib 比较序列.该模块包含一些用来计算和处理序列直接差异的工具.她对于比较文本尤其用,其中包含的函数可以使用多种常用差异格式生成报告. 测试数据(splitlines()按行划分为序列 ...
- 每日一“酷”之textwrap
介绍:需要美观打印时,可以使用textwrap模块来格式化要输出的文本,这个模块允许通过编程提高类似段落自动换行或填充特性等功能. 1 创建实例数据 sample_text = ''' I’m ver ...
- 每日一“酷”之string
介绍:string模块可以追溯到最早的Python版本中.现在很多的被移植为str和unicode对象的方法,在python3.0中会被完全去除.string模块中,有很多有用的常量和累,用来处理st ...
随机推荐
- 【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』
作者:阿里云用户mr_wid ,z)NKt# @I6A9do 如果感觉该评测对您有所帮助, 欢迎投票给本文: UO<claV RsfTUb)< 投票标题: 28.[阿里云 ...
- page80-栈用例-算术表达式求值
表达式由括号, 运算符和操作数(数字)组成.我们根据以下4中情况从左到右逐个将这些实体送入栈处理. (1)将操作数压入操作数栈: (2)将运算符压入运算符栈: (3)忽略左括号: (4)在遇到右括号时 ...
- Oracle language types(语言种类) 表的相关操作 DDL数据定义语言
数据定义语言 Data Definition Language Statements(DDL)数据操纵语言 Data Manipulation Language(DML) Statements事务控制 ...
- Picker组件封装
在开发APP的过程中,我们可能会遇上软件中需要有很多下拉选择样式,就像之前我做的那个<房贷计算器>一样,有很多下拉选择,如果没有将Picker封装起来共用是很麻烦的. 安装插件 在Reac ...
- 剑指Offer21 二叉树的层序遍历
/************************************************************************* > File Name: 21_PrintT ...
- Codeforces Round #198 (Div. 1) B,C 动态规划
比赛时,开了大号去做,算了半天发现不会做A,囧.于是跑去看B,发现很水?于是很快敲完了,但是A不会,没敢交.于是去看C,一直找规律啊,后来总算调了出来,看了一下榜,发现还是算了吧,直接去睡觉了.第二天 ...
- [转]如何编译tizen源码(图文教程)?
http://blog.csdn.net/flydream0/article/details/9004746 前一篇文章已经介绍了如何下载tizen源码(http://blog.csdn.net/fl ...
- 锋利的jQuery第2版学习笔记6、7章
第6章,jQuery与Ajax的应用 Ajax的优势和不足 Ajax的优势 1.不需要插件支持 2.优秀的用户体验 3.提高Web程序的性能 4.减轻服务器和带宽的负担 Ajax的不足 1.浏览器对X ...
- 兼容性调试-- 在谷歌浏览器中,td 设置colspan的失效的问题
通过设置table width="100%"table-layout="fixed" 解决
- [老老实实学WCF] 第三篇 在IIS中寄存服务
老老实实学WCF 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型,包括定义和实现服务协定.配置服务.寄宿服务.通过添加服务引用的方式配置客户端并访问服务.我 ...