作用: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
print
return

2、创建堆

创建堆的两种基本方式:heappush()和heapify()

 import heapq
from heapq_heapdata import data
from heapq_showtree import show_tree heap = []
print 'random : ' , data
print
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)
print
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的更多相关文章

  1. 每日一“酷”之Cookie

    Cookie---Http Cookie 作用:Cookie模块定义一些类来解析和创建HTTP cookie首部 Cookie模块为大多数符合RFC 2109的cookie实现一个解析器.这个实现没有 ...

  2. 每日一“酷”之Queue

    Queue—线程安全的FIFO实现 作用:提供一个线程安全的FIFO实现 Queue模块提供了一个适用于多线程编程的先进先出(first-in,first-out)数据结构,可以用来在生产者和消费者线 ...

  3. 每日一“酷”之pprint

    pprint – 美观打印 作用:美观打印数据结构 pprint 包含一个“美观打印机”,用于生成数据结构的一个美观视图.格式化工具会生成数据结构的一些表示,不仅可以由解释器正确地解析,而且便于人类阅 ...

  4. 每日一“酷”之copy

    Copy – 复制对象 作用:提供一些函数,可以使用浅副本或深副本语义复制对象. copy模块包括两个函数copy()和deepcopy(),用于复制现有的对象 1.  浅副本 copy()创建的浅副 ...

  5. 每日一“酷”之bisect

    作用:维护有序列表,而不必在每次想列表增加一个元素时调用sort排序 bisect 模块实现了一个算法用于向列表中插入元素,同时仍保持列表有序.有些情况下,这比反复对一个了表序列更高效,另外也比构建一 ...

  6. 每日一“酷”之array

    array--国定类型数据序列 array模块定义一个序列数据结构,看起来和list非常相似,只不过所有成员都必须是相同的基本类型. 1.初始化 array实例化时可以提高一个参数来描述允许哪个种数据 ...

  7. 每日一“酷”之difflib

    介绍:difflib 比较序列.该模块包含一些用来计算和处理序列直接差异的工具.她对于比较文本尤其用,其中包含的函数可以使用多种常用差异格式生成报告. 测试数据(splitlines()按行划分为序列 ...

  8. 每日一“酷”之textwrap

    介绍:需要美观打印时,可以使用textwrap模块来格式化要输出的文本,这个模块允许通过编程提高类似段落自动换行或填充特性等功能. 1 创建实例数据 sample_text = ''' I’m ver ...

  9. 每日一“酷”之string

    介绍:string模块可以追溯到最早的Python版本中.现在很多的被移植为str和unicode对象的方法,在python3.0中会被完全去除.string模块中,有很多有用的常量和累,用来处理st ...

随机推荐

  1. IE浏览器部分版本不支持background-siza属性问题

    background-size是CSS3新增的属性,但是IE8以下还是不支持,可以通过滤镜来实现这样的一个效果 background-size:contain; // 缩小图片来适应元素的尺寸(保持像 ...

  2. An instance 0x172b8600 of class UITableView was deallocated while key value

    从带有tableview并且使用Mj下拉刷新的视图调用popViewControllerAnimated的时候,控制台打印这个: An instance 0x15d7aa00 of class UIT ...

  3. 上架第一个APP到苹果商店被拒绝5次

    - : Metadata Rejected (APP中的注册时跳转的 - 用户协议视图没有内容).Waiting For Review 6天  In Review 1天 第二次被拒绝 -- : Met ...

  4. 【CSS3】---嵌入字体@font-face

    @font-face能够加载服务器端的字体文件,让浏览器端可以显示用户电脑里没有安装的字体. 语法: @font-face { font-family : 字体名称; src : 字体文件在服务器上的 ...

  5. part 3 Controllers in AngularJS

    What happens if the controller name is misspelled? When the controller name is misspelled, 2 things ...

  6. Excel VBA 快捷键 代码

    一. 在ThisWorkbook中 Private Sub Workbook_Open() '%对应alt键 宏不能加() Application.OnKey "%q", &quo ...

  7. 用宏定义封装LoadLibrary,方便的动态加载dll

    同学们动态加载dll的时候是不是感觉挺麻烦的,每次都::LoadLibrary,::GetProcAddress,还要typedef一堆函数.最近闲来无聊,用宏封装了一下,可以少写不少代码,用来也挺方 ...

  8. 清除windows的EFS加密

        所使用软件为aefsdr_setup_en,搜索名为advanced.efs.data.recovery   1.         创建需要加密的文件   2.         进行加密   ...

  9. Cocos2d-JS坐标系

    在图形图像和游戏应用开发中坐标系是非常重要的,我们在Android和iOS等平台应用开发的时候使用的二维坐标系它的原点是在左上角的.而在Cocos2d-JS坐标系中它原点是在左下角的,而且Cocos2 ...

  10. 20141201--JS Window

    一.window.screen 包含有关用户屏幕的信息. window.screen 对象在编写时可以不使用 window 这个前缀. 一些属性: screen.availWidth - 可用的屏幕宽 ...