每日一“酷”之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 ...
随机推荐
- 【开源项目5】测滑菜单MenuDrawer的使用以及解析
在安卓中左右侧滑菜单的使用用的比ios多得多,可能是谷歌带的头吧,几乎所有的谷歌应用都有侧滑菜单.谷歌没有开放这个源码,在一个成熟的开源代码出现之前,大家都是各自为战,偶尔能看到一个勉强实现了的.Me ...
- 【原创】mac 上如何安装及切换输入法
1. 安装输入法 刚购入mac mini一台,默认只有英文输入法,而自己用习惯了sogou输入法,于是就在网上下载安装了一个sogou拼音输入 for mac. 下载完毕后,在屏幕下方的dock区域右 ...
- 浅议tomcat与classloader
关于tomcat和classloader的文章,网上多如牛毛,且互相转载,所以大多数搜到的基本上是讲到了tomcat中classloader的几个层次,对于初接触classloader,看了之后还是只 ...
- Could not load the "btn_020.disable.png" image referenced from a nib in the bundle with identifier "com.xxx.---0710"
照此方法打开引用你这个图片的sb或者xib: 然后搜索你的这个图片名称: 删除这个图片名称的引用.如果还是不行的话,就删除此sb或xib文件然后重新创建.
- 24 MUST HAVE ESSENTIAL LINUX APPLICATIONS IN 2016
Brief: Whare the must have applications for Linux? The answer is subjective and it depends on for wh ...
- 【CSS3】---text-overflow 与 word-wrap
text-overflow用来设置是否使用一个省略标记(...)标示对象内文本的溢出. 语法: 但是text-overflow只是用来说明文字溢出时用什么方式显示,要实现溢出时产生省略号的效果,还须定 ...
- 无需操作系统和虚拟机,直接运行Python代码
Josh Triplett以一个“笑点”开始了他在PyCon 2015上的演讲:移植Python使其无需操作系统运行:他和他的英特尔同事让解释器能够在GRUB引导程序.BIOS或EFI系统上运行.连演 ...
- SQL 存储过程 执行效率优化提升 (显示估计)
在sql server 查询区 通过执行 "显示估计的执行计划" ,可以给出 存储过程 缺少索引的提示,并自动生成建立相应 索引 的代码 显示估计的执行计划 执行结果提示: 哦,算 ...
- Apache windows多线程设置
# WinNT MPM # ThreadsPerChild: constant number of worker threads in the server process # MaxRequests ...
- c#中sqlhelper类的编写(二)
上一篇文章讲了简易版的SqlHelper类的编写,我们在这里就上一篇文章末尾提出的问题写出解决方案. sql语句注入攻击已经是众所周知的了.我们如何在C#中保护自己的数据库不被这样的方式攻击呢? 不用 ...