本模块实现了堆队列算法,也叫作优先级队列算法。堆队列是一棵二叉树。而且拥有这样特点,它的父节点的值小于等于不论什么它的子节点的值,假设採用数组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--堆队列算法的更多相关文章

  1. 『Python CoolBook:heapq』数据结构和算法_heapq堆队列算法&容器排序

    一.heapq堆队列算法模块 本模块实现了堆队列算法,也叫作优先级队列算法.堆队列是一棵二叉树,并且拥有这样特点,它的父节点的值小于等于任何它的子节点的值. 本模块实际上实现了一系列操作容器的方法,使 ...

  2. 从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构

    Top N问题在搜索引擎.推荐系统领域应用很广, 如果用我们较为常见的语言,如C.C++.Java等,代码量至少也得五行,但是用Python的话,只用一个函数就能搞定,只需引入heapq(堆队列)这个 ...

  3. 双有序队列算法——处理哈夫曼K叉树的高效算法

    算法介绍: 哈夫曼树的思路及实现众所周知,大部分是用堆来维护和实现,这种思路比较清晰,在K比较小的时候处理较快(具体例子接下来再说),而且编程复杂度不是很高,利于应用.但是,其所用的数据结构是树,是在 ...

  4. Python标准库模块之heapq – 堆构造

    Python标准库模块之heapq – 堆构造 读前福利:几百本经典书籍https://www.johngo689.com/2158/ 原文链接:https://www.johngo689.com/2 ...

  5. php队列算法[转]

    <?php/*** php队列算法* * Create On 2010-6-4* Author Been* QQ:281443751* Email:binbin1129@126.com**/cl ...

  6. JS里的居民们4-数组((堆)队列

    编码1(队头在最右) 练习如何使用数组来实现队列,综合考虑使用数组的 push,pop,shift,unshift操作 基于代码,实现如按钮中描述的功能: 实现如阅读材料中,队列的相关入队.出队.获取 ...

  7. 【STL学习】堆相关算法详解与C++编程实现(Heap)

    转自:https://blog.csdn.net/xiajun07061225/article/details/8553808 堆简介   堆并不是STL的组件,但是经常充当着底层实现结构.比如优先级 ...

  8. python 之 heapq (堆)

    堆的实现通过构造二叉堆,实为二叉树的一种:这种数据结构具有以下性质: 任意节点小于(或大于)它的后裔,最小元(或最大元)在堆的根上 堆总是一颗完整树.即除了最低层,其它层的节点都被元素填满,且最低层极 ...

  9. python中heapq堆的讲解

    堆的定义: 堆是一种特殊的数据结构,它的通常的表示是它的根结点的值最大或者是最小. python中heapq的使用 列出一些常见的用法: heap = []#建立一个常见的堆 heappush(hea ...

随机推荐

  1. 关于MySQL建表对DML的影响【转】

    本文来自这里 今天一位同学问到线上曾经碰到过连续建表,导致阻塞普通的insert.update等.不过也没有保留现场.因此有疑问为什么建表会影响DML? 分析          首先这个现象不是在所有 ...

  2. [译] Pandas中根据列的值选取多行数据

    # 选取等于某些值的行记录 用 == df.loc[df['column_name'] == some_value] # 选取某列是否是某一类型的数值 用 isin df.loc[df['column ...

  3. c3p0数据库连接池无法连接数据库—错误使用了username关键字

    一.问题描述 上篇博客说到了关于maven无法下载依赖jar包的问题,这篇博客再说一下关于在本个项目中遇到的关于使用C3P0连接池连接数据库的问题,真心很奇葩,在此,也请大家引起注意.首先看我的项目基 ...

  4. 九度oj 题目1372:最大子向量和(连续子数组的最大和)

    题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但 ...

  5. redhat linux 从/home目录扩展空间至/根目录

    查看分区大小 [root@easdb01 ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/vg_easdb01-lv_ro ...

  6. 【bzoj4800】[Ceoi2015]Ice Hockey World Championship 折半搜索

    题目描述 有n个物品,m块钱,给定每个物品的价格,求买物品的方案数. 输入 第一行两个数n,m代表物品数量及钱数 第二行n个数,代表每个物品的价格 n<=40,m<=10^18 输出 一行 ...

  7. 归并排序,时间复杂度nlogn

    思路: /*   考点:   1. 快慢指针:2. 归并排序.   此题经典,需要消化吸收.   复杂度分析:              T(n)            拆分 n/2, 归并 n/2 ...

  8. 旅行问题(bzoj 2746)

    Description yz是Z国的领导人,他规定每个地区的名字只能为26个小写拉丁字母的一个.由于地 区数有可能超过26个,便产生了一个问题,如何辨别名字相同的地区?于是yz规定,一个 地区的描述必 ...

  9. 【CF173B】Chamber of Secrets(二分图,最短路)

    题意:给你一个n*m的地图,现在有一束激光从左上角往右边射出,每遇到‘#’,你可以选择光线往四个方向射出,或者什么都不做,问最少需要多少个‘#’往四个方向射出才能使关系在n行往右边射出. 思路:将每一 ...

  10. 天梯赛 - L2-002 链表去重

    GG思密达,第二个测试点的三分怎么也拿不上,我还是比较熟悉指针,用指针来写~,写完去上概率论 题目链接:https://www.patest.cn/contests/gplt/L2-002 #incl ...