[Python标准库]heapq——堆排序算法

来源:互联网 发布:top gear 知乎 编辑:程序博客网 时间:2024/05/17 10:06
[Python标准库]heapq——堆排序算法
        作用:headpq 模块实现了一个适用于 Python 列表的最小堆排序算法。
        Python 版本:2.3 版本中新增,并在 2.5 版本中做了补充
        堆(heap)是一个树形数据结构,其中子节点与父节点是一种有序关系。二叉堆(Binary heap)可以使用如下方式组织的列表或数组表示,即元素 N 的子元素位于 2*N+1 和 2*N+2(索引从 0 开始)。这种布局允许原地重新组织堆,从而不必在增加或删除元素时分配大量内存。
        最大堆(max-heap)确保父节点大于或等于其两个子节点。最小堆(min-heap)要求父节点小于或等于其子节点。Python 的 heapq 模块实现了一个最小堆。
示例数据
        示例将使用 heapq_heapdata.py 中的数据。
# This data was generated with the random module.data = [19, 9, 4, 10, 11]
        堆输出使用 heapq_showtree.py 打印。
import mathfrom cStringIO import StringIOdef show_tree(tree, total_width=36, fill=' '):    """Pretty-print a tree."""    output = 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
创建堆
        创建堆有两种基本方式:heappush() 和 heapify()。
import heapqfrom heapq_showtree import show_treefrom heapq_heapdata import dataheap = []print 'random :', dataprintfor n in data:    print 'add %3d:' % n    heapq.heappush(heap, n)    show_tree(heap)
        使用 heappush() 时,从数据源增加新元素时会保持元素的堆顺序。
        如果数据已经在内存中,使用 heapify() 原地重新组织列表中的元素会更高效。
import heapqfrom heapq_showtree import show_treefrom heapq_heapdata import dataprint 'random    :', dataheapq.heapify(data)print 'heapified :'show_tree(data)
        如果按堆排序一次一个元素地构建列表,其结果与构建一个无序列表再调用 heapify() 是一样的。
访问堆的内容
        一旦堆已正确组织,就可以使用 heappop() 删除有最小值的元素。
import heapqfrom heapq_showtree import show_treefrom heapq_heapdata import dataprint 'random    :', dataheapq.heapify(data)print 'heapified :'show_tree(data)printfor i in xrange(2):    smallest = heapq.heappop(data)    print 'pop    %3d:' % smallest    show_tree(data)
        如果希望在一个操作中删除现有元素并替换为新值,可以使用 heapreplace()。
import heapqfrom heapq_showtree import show_treefrom heapq_heapdata import dataheapq.heapify(data)print 'start:'show_tree(data)for n in [0, 13]:    smallest = heapq.heapreplace(data, n)    print 'replace %2d with %2d:' % (smallest, n)    show_tree(data)
        通过原地替换元素,这样可以维持一个固定大小的堆,如按优先级排序的作业队列。
堆的数据极值
        heapq 还包括两个检查可迭代对象的函数,查找其中包含的最大值或最小值的范围。
import heapqfrom heapq_heapdata import dataprint 'all       :', dataprint '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() 才算高效,不过有些情况下这两个函数会很方便。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 助班面试你的学生不喜欢你怎么办 上三年级的小孩不愿做作业怎么办 快一年了孩子上幼儿园总哭怎么办 宝宝吃多了吐了很多怎么办 一岁宝宝只吃母乳不吃辅食怎么办 孩子平常考得好正式考不好怎么办 平常成绩好期末却考不好怎么办 初中生去国外上学国内的学校怎么办 孩子在学校不受老师的重视怎么办 孩子上二年级了不爱学习怎么办 接别人的班被学生讨厌怎么办 孩子在学校老师打孩子家长怎么办? 宝宝不听话我老忍不住打他怎么办 两岁宝宝断母乳不愿意喝奶粉怎么办 2岁半的宝宝叛逆不听话怎么办? 2岁半宝宝说什么不听话怎么办? 误把脱毛膏当牙膏用了刷牙怎么办 儿子1岁5个月了不说话怎么办 两岁小儿不会说话和智商低怎么办 宝宝不会说话教他说他不愿意怎么办 25个月宝宝不愿意学说话怎么办 老师说小孩在幼儿园老是说话怎么办 在外留学想领养一个外国小孩怎么办 三岁半的宝宝想去美国上学怎么办 农村新房边的老老祖坟不搬怎么办 倒西太阳晒的房子夏天很热怎么办 客厅壁纸用的浅灰色影视墙怎么办 我喜欢玩手机游戏妈妈很生气怎么办 家里墙上有很多白色的虫子怎么办 3岁半宝宝学数字学不会怎么办 小孩子读一年级拼音读不好要怎么办 4个月的婴儿恶心干呕怎么办 生了小孩后胆汁酸偏高怎么办 9个月宝宝吃盐了怎么办 两个月宝宝母乳拉大便太稀怎么办呀 两个月的宝宝不拉大便怎么办 两个月宝宝五天没拉大便怎么办 4个月宝宝不拉大便怎么办 2个月宝宝3天没拉大便怎么办 宝宝拉不出大便老是憋的哭怎么办 九个月的宝宝不爱吃水果怎么办