每日一“酷”之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 ...
随机推荐
- [经典算法] 字符串搜索Boyer-Moore
题目说明: 今日的一些高阶程式语言对于字串的处理支援越来越强大(例如Java.C#.Perl等),不过字串搜寻本身仍是个值得探讨的课题,在这边以Boyer- Moore法来说明如何进行字串说明,这个方 ...
- Operation与GCD的不同
最大并发数: 什么是并发数? 同时执行的任务数.比如同时开启三个线程执行三个任务,并发数就是3. 最大并发数相关的方法: -(NSInteger)maxConcurrentOperationCount ...
- error和exception的区别,RuntimeException和非RuntimeException的区别
error和exception的区别,RuntimeException和非RuntimeException的区别 1. 异常机制 异常机制是指当程序出现错误后,程序如何处理.具体来说, ...
- Spring学习总结二——SpringIOC容器二
一:指定bean的依赖关系 例如examplebean对象依赖examplebean1对象,那么在创建examplebean对象之前就 需要先创建examplebean1对象. 1:创建Example ...
- js实现hashtable的赋值、取值、遍历
哈希表(Hashtable)这个概率应该是#c里面的概念,用来赋值.取值.遍历.排序操作提高效率.想起这个东西其实使我们以前经常遇到这样的面试题,一个很大的数组可能有100000个,如何快速知道它里面 ...
- Speex回声消除代码分析
先说明下,这里的代码流程是修改过的Speex流程,但与Speex代码差异不大,应该不影响阅读. (1)用RemoveDCoffset函数进行去直流 (2)远端信号预加重后放入x[i+frame_s ...
- codeforces 590C C. Three States(bfs+连通块之间的最短距离)
题目链接: C. Three States time limit per test 5 seconds memory limit per test 512 megabytes input standa ...
- oracle查看允许的最大连接数和当前连接数等信息
目前总结的语句,在查看数据的连接情况很有用 ,写完程序一边测试代码一边查看数据库连接的释放情况有助于分析优化出一个健壮的系统程序来. 1.Sql代码1.select count(*) from v$p ...
- 【转】https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
正需要这个,写的很好,就转过来了 转自: http://www.cnblogs.com/naniannayue/ 一:什么是https SSL(Security Socket Layer)全称 ...
- ASP流程控制语句
ASP流程控制语句 1.if...then语句 单行: if 条件 then 语句 多行: if 条件 then elseif 条件 then 语句 elseif 条件 then 语句 else en ...