5.4 heapq--堆队列算法
本模块实现了堆队列算法,也叫作优先级队列算法。堆队列是一棵二叉树。而且拥有这样特点,它的父节点的值小于等于不论什么它的子节点的值,假设採用数组array实现,能够把它们的关系表示为:heap[k] <= heap[2*k+1] 和 heap[k] <= heap[2*k+2]。对于全部k值都成立,k值从0開始计算。作为比較,能够觉得不存的元素是无穷大的。堆队列有一个比較重要的特性。它的最小值的元素就是在根:heap[0]。
以下的API与教科书上堆算法有两点区别:(a)使用0開始的索引。
这样可能会让大家看到节点层次的索引上有点别扭的,但这样更适合python语言处理,由于python是以0为開始计算数组和列表的索引。(b)弹出的方法返回的值是最小值,而不是最大值(在教科书上叫作最小堆,最大堆在教科书更通用地使用来教学。由于它更适合排序算法)。
基于上面两点能够查看一个堆:heap[0]返回一个最小值的项,heap.sort()对整个堆进行排序。
创建一个堆队列,能够使用一个列表[],也能够使用heapify(x)函数。
heapq.heappush(heap, item)
把一项值压入堆heap,同一时候维持堆的排序要求。
样例:
#python 3.4
import heapq
h = []
heapq.heappush(h, 5)
heapq.heappush(h, 2)
heapq.heappush(h, 8)
heapq.heappush(h, 4)
print(heapq.heappop(h))
结果输出例如以下:
2
heapq.heappop(heap)
弹出并返回堆里最小值的项。调整堆排序。
假设堆为空,抛出异常IndexError。
样例:
#python 3.4
import heapq
h = []
heapq.heappush(h, 5)
heapq.heappush(h, 2)
heapq.heappush(h, 8)
heapq.heappush(h, 4)
print(heapq.heappop(h))
print(heapq.heappop(h))
结果输出例如以下:
2
4
heapq.heappushpop(heap, item)
向堆里插入一项。并返回最小值的项。
组合了前面两个函数。这样更加有效率。
样例:
#python 3.4
import heapq
h = []
heapq.heappush(h, 5)
heapq.heappush(h, 2)
heapq.heappush(h, 8)
print(heapq.heappushpop(h, 4))
结果输出例如以下:
2
heapq.heapify(x)
就地转换一个列表为堆排序。时间为线性。
样例:
#python 3.4
import heapq
h = [9, 8, 7, 6, 2, 4, 5]
heapq.heapify(h)
print(h)
结果输出例如以下:
[2, 6, 4, 9, 8, 7, 5]
heapq.heapreplace(heap, item)
弹出最小值的项。并返回对应的值,最后把新项压入堆。假设堆为空抛出异常IndexError。
样例:
#python 3.4
import heapq
h = [9, 8, 7, 6, 2, 4, 5]
heapq.heapify(h)
print(h)
print(heapq.heapreplace(h, 1))
print(h)
结果输出例如以下:
[2, 6, 4, 9, 8, 7, 5]
2
[1, 6, 4, 9, 8, 7, 5]
heapq.merge(*iterables)
合并多个堆排序后的列表,返回一个迭代器訪问全部值。
样例:
#python 3.4
import heapq
h = [9, 8, 7, 6, 2, 4, 5]
heapq.heapify(h)
l = [19, 11, 3, 15, 16]
heapq.heapify(l)
for i in heapq.merge(h,l):
print(i, end = ',')
结果输出例如以下:
2,3,6,4,9,8,7,5,11,19,15,16,
heapq.nlargest(n, iterable, key=None)
从数据集iterable里获取n项最大值,以列表方式返回。假设參数 key提供,key是一个比較函数。用来比較元素之间的值。
样例:
#python 3.4
import heapq
h = [9, 1, 7, 6, 2, 4, 5]
l = heapq.nlargest(3, h)
print(l)
结果输出例如以下:
[9, 7, 6]
heapq.nsmallest(n, iterable, key=None)
从数据集iterable里获取n项最小值,以列表方式返回。假设參数 key提供,key是一个比較函数,用来比較元素之间的值。相当于:sorted(iterable, key=key)[:n]
样例:
#python 3.4
import heapq
h = [9, 1, 7, 6, 2, 4, 5]
l = heapq.nsmallest(3, h)
print(l)
结果输出例如以下:
[1, 2, 4]
在最后这两个函数中,假设数量比較少时使用起来比較高效,假设数据量比較大,要使用sorted()函数。假设n=1最好使用内置函数min()或max()。
採用堆算法来实现排序:
样例:
#python 3.4
import heapq
def heapsort(iterable):
'实现与sorted(iterable)同样的功能'
h = []
for value in iterable:
heapq.heappush(h, value)
return [heapq.heappop(h) for i in range(len(h))]
print(heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0]))
结果输出例如以下:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
蔡军生 QQ:9073204 深圳
5.4 heapq--堆队列算法的更多相关文章
- 『Python CoolBook:heapq』数据结构和算法_heapq堆队列算法&容器排序
一.heapq堆队列算法模块 本模块实现了堆队列算法,也叫作优先级队列算法.堆队列是一棵二叉树,并且拥有这样特点,它的父节点的值小于等于任何它的子节点的值. 本模块实际上实现了一系列操作容器的方法,使 ...
- 从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构
Top N问题在搜索引擎.推荐系统领域应用很广, 如果用我们较为常见的语言,如C.C++.Java等,代码量至少也得五行,但是用Python的话,只用一个函数就能搞定,只需引入heapq(堆队列)这个 ...
- 双有序队列算法——处理哈夫曼K叉树的高效算法
算法介绍: 哈夫曼树的思路及实现众所周知,大部分是用堆来维护和实现,这种思路比较清晰,在K比较小的时候处理较快(具体例子接下来再说),而且编程复杂度不是很高,利于应用.但是,其所用的数据结构是树,是在 ...
- Python标准库模块之heapq – 堆构造
Python标准库模块之heapq – 堆构造 读前福利:几百本经典书籍https://www.johngo689.com/2158/ 原文链接:https://www.johngo689.com/2 ...
- php队列算法[转]
<?php/*** php队列算法* * Create On 2010-6-4* Author Been* QQ:281443751* Email:binbin1129@126.com**/cl ...
- JS里的居民们4-数组((堆)队列
编码1(队头在最右) 练习如何使用数组来实现队列,综合考虑使用数组的 push,pop,shift,unshift操作 基于代码,实现如按钮中描述的功能: 实现如阅读材料中,队列的相关入队.出队.获取 ...
- 【STL学习】堆相关算法详解与C++编程实现(Heap)
转自:https://blog.csdn.net/xiajun07061225/article/details/8553808 堆简介 堆并不是STL的组件,但是经常充当着底层实现结构.比如优先级 ...
- python 之 heapq (堆)
堆的实现通过构造二叉堆,实为二叉树的一种:这种数据结构具有以下性质: 任意节点小于(或大于)它的后裔,最小元(或最大元)在堆的根上 堆总是一颗完整树.即除了最低层,其它层的节点都被元素填满,且最低层极 ...
- python中heapq堆的讲解
堆的定义: 堆是一种特殊的数据结构,它的通常的表示是它的根结点的值最大或者是最小. python中heapq的使用 列出一些常见的用法: heap = []#建立一个常见的堆 heappush(hea ...
随机推荐
- Leetcode207--->课程表(逆拓扑排序)
题目: 课程表,有n个课程,[0, n-1]:在修一个课程前,有可能要修前导课程: 举例: 2, [[1,0]] 修课程1前需要先修课程0 There are a total of 2 courses ...
- 爬虫Scrapy框架-Crawlspider链接提取器与规则解析器
Crawlspider 一:Crawlspider简介 CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能外,还派生除了其自己独有的更加强大的特性和功能.其中最显著 ...
- PDO 使用prepared statement 预处理LIMIT等非表字段参数
由于一些驱动不支持原生的预处理语句,因此PDO可以完全模拟预处理.PDO的模拟预处理是默认打开的,即便MYSQL驱动本身支持预处理,在默认打开的状态下,PDO是不会用到MYSQL本身提供的预处理功能. ...
- 九度oj 题目1361:翻转单词顺序
题目描述: JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,“stu ...
- C++之Effective STL学习笔记Item7
假设我们现在有以下代码: void doSomething() { vector<Widget*> vwp; ; i < SOME_MAGIC_NUMBER; ++i) vwp.pu ...
- 计算机、程序和java概述
1.1 计算机.程序和java概述计算机包括硬件(hardware)软件(software)两部分.硬件包括计算机中看得见的物理部分,软件提供看不见的指令,指令控制硬件并且使得硬件完成特定的任务.一台 ...
- javascript进阶一
一 window对象 http://www.w3school.com.cn/jsref/dom_obj_window.asp 二 setInterval的应用 模拟计时器 <!DOCTYPE h ...
- hdu 3625 Examining the Rooms 轮换斯特林数
题目大意 n个房间对应n把钥匙 每个房间的钥匙随机放在某个房间内,概率相同. 有K次炸门的机会,求能进入所有房间的概率 一号门不给你炸 分析 我们设\(key_i\)为第i间房里的钥匙是哪把 视作房间 ...
- luogu 2735 电网 皮克公式
题目链接 题意 给定一个格点三角形,三个顶点分别为(0,0),(n,m),(p,0),求三角形内部的格点个数. 思路 皮克公式: \[S = \frac{i}{2}+b-1\] \(S\)为三角形面积 ...
- PatentTips - MPLS Network System
MPLS (Multi Protocol Label Switching) network system has been watched with keen interest as a techni ...