[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 中的数据。
作用: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()。
创建堆有两种基本方式: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() 删除有最小值的元素。
访问堆的内容
一旦堆已正确组织,就可以使用 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 还包括两个检查可迭代对象的函数,查找其中包含的最大值或最小值的范围。
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
- [Python标准库]heapq——堆排序算法
- heapq--Python列表的最小堆排序算法
- python: 堆操作 (heapq库)
- Python -- 堆数据结构 heapq
- [Python]heapq 堆模块
- python标准库:collections和heapq模块
- python 堆结构 heapq模块
- 5.4 heapq--堆队列算法
- python学习笔记(十三)标准库heapq
- 算法导论—堆排序(python)
- 排序算法—堆排序算法分析与实现(Python)
- python学习——heapq模块
- Python 库之heapq
- 浅析Python heapq模块 堆数据结构
- 从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构
- Python:堆排序算法
- 排序算法—堆和堆排序
- 排序算法—堆排序
- theano学习笔记
- 常用字符串处理函数
- Memcached原理深度分析详解
- bash常用快捷键
- Tomcat启动
- [Python标准库]heapq——堆排序算法
- ./configure 命令详解
- 安装JDK过程中的一些注意事项
- 数据结构之图(邻接表存储,DFS和BFS遍历)
- iOS中单例模式的创建
- Python学习笔记 基础语法
- ITOO4.1之LocalStorage 本地存储
- 大数据的启蒙
- php rewrite模式