heapify( )

heapify()函数用于将一个序列转化为初始化堆

nums=[16,7,3,20,17,8,-1]
print('nums:',nums)
show_tree(nums) nums: [16, 7, 3, 20, 17, 8, -1] 16
7 3
20 17 8 -1
------------------------------------ heapq.heapify(nums)
print('nums:',nums)
show_tree(nums) nums: [-1, 7, 3, 20, 17, 8, 16] -1
7 3
20 17 8 16
------------------------------------

heappush( )

heappush()是实现将元素插入到堆的操作
heappush()操作前一定要先将序列初始化成堆!heappush是对于"堆"的操作!不然是没有意义

nums=[16,7,3,20,17,8,-1]
print(nums)
show_tree(nums) [16, 7, 3, 20, 17, 8, -1] 16
7 3
20 17 8 -1
------------------------------------
heapq.heapify(nums)
print('初始化成堆:',nums)
show_tree(nums) 初始化成堆: [-1, 7, 3, 20, 17, 8, 16] -1
7 3
20 17 8 16
------------------------------------
for i in random.sample(range(1,8),2):
print("本次push:",i)
heapq.heappush(nums,i)
print(nums)
show_tree(nums) 本次push: 5
[-1, 5, 3, 7, 17, 8, 16, 20] -1
5 3
7 17 8 16
20
------------------------------------ 本次push: 7
[-1, 5, 3, 7, 17, 8, 16, 20, 7] -1
5 3
7 17 8 16
20 7
------------------------------------

heappop( )

heappop()是实现将元素删除出堆的操作
同样的操作前一定要先将序列初始化成堆,否则也没什么意义

nums=[16,7,3,20,17,8,-1]
print(nums)
show_tree(nums) [16, 7, 3, 20, 17, 8, -1] 16
7 3
20 17 8 -1
------------------------------------ heapq.heapify(nums)
print('初始化成堆:',nums)
show_tree(nums) 初始化成堆: [-1, 7, 3, 20, 17, 8, 16] -1
7 3
20 17 8 16
------------------------------------
for i in range(0,2):
print("本次pop:",heapq.heappop(nums))
print(nums)
show_tree(nums) 本次pop: -1
[3, 7, 8, 20, 17, 16] 3
7 8
20 17 16
------------------------------------ 本次pop: 3
[7, 16, 8, 20, 17] 7
16 8
20 17
------------------------------------

nlargest( )/nsmallest( )

sorted(iterable, key=key, reverse=True)[:n]

  • nlargest(n,iterable) 求序列iterable中的TopN | nsmallest(n,iterable) 求序列iterable中的BtmN
import heapq
nums=[16,7,3,20,17,8,-1]
print(heapq.nlargest(3,nums))
print(heapq.nsmallest(3,nums)) [20, 17, 16]
[-1, 3, 7]
  • nlargest(n, iterable, key=lambda) | nsmallest(n, iterable, key=lambda) key接受关键字参数,用于更复杂的数据结构中
def print_price(dirt):
for i in dirt:
for x,y in i.items():
if x=='price':
print(x,y) portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09},
{'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': 'YHOO', 'shares': 45, 'price': 16.35},
{'name': 'ACME', 'shares': 75, 'price': 115.65}
] cheap=heapq.nsmallest(3,portfolio,key=lambda x:x['price'])
expensive=heapq.nlargest(3,portfolio,key=lambda y:y['price'])
print_price(cheap)
print_price(expensive) price 16.35
price 21.09
price 31.75 price 543.22
price 115.65
price 91.1

关于heap和heap sort

对于上面的nums=[16,7,3,20,17,8,-1]序列,图解了:

构造堆的操作(点击查看)

push堆的操作(点击查看)

pop堆的操作(点击查看)

参考文章

详解Python中heapq模块的用法(包括show_tree())

详解堆排序

浅谈算法和数据结构: 五 优先级队列与堆排序

[PY3]——heap模块 和 堆排序的更多相关文章

  1. 模块 heapq_堆排序

    _heapq_堆排序 该模块提供了堆排序算法的实现.堆是二叉树,最大堆中父节点大于或等于两个子节点,最小堆父节点小于或等于两个子节点. 创建堆 heapq有两种方式创建堆, 一种是使用一个空列表,然后 ...

  2. [数据结构]——堆(Heap)、堆排序和TopK

    堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...

  3. PAT Advanced 1098 Insertion or Heap Sort (25) [heap sort(堆排序)]

    题目 According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and ...

  4. [PY3]——实现一个优先级队列

    import heapq class PriorityQueue: def __init__(self): self._queue=[] self._index=0 def push(self,ite ...

  5. 【算法】堆排序(Heap Sort)(七)

    堆排序(Heap Sort) 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父 ...

  6. 算法 排序NB二人组 堆排序 归并排序

    参考博客:基于python的七种经典排序算法     常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储 ...

  7. 有k个list列表, 各个list列表的元素是有序的,将这k个列表元素进行排序( 基于堆排序的K路归并排序)

    解题思路: 排序方法:多路归并排序 每次将n个list的头元素取出来,进行排序(堆排序),最小元素从堆中取出后,将其所在list的下一个元素 放入堆中,调整堆序列. 函数实现原型: void list ...

  8. day39 算法基础

    参考博客: http://www.cnblogs.com/alex3714/articles/5474411.html http://www.cnblogs.com/wupeiqi/articles/ ...

  9. fasttext源码剖析

    fasttext源码剖析   目的:记录结合多方资料以及个人理解的剖析代码: https://heleifz.github.io/14732610572844.html http://www.cnbl ...

随机推荐

  1. 新入门PGSQL数据库(尝试利用PGPOOL实现分布式),摘录笔记

    概念: PostgreSQL (pronounced "post-gress-Q-L") is an open source relational database managem ...

  2. 只是误以为导入了maven依赖

    背景: 之前用Spring Boot 开发了一个小项目,考虑将代码迁到Git服务器,由于之前没用过Git,在将代码正式签入Git服务器前, 我想先签入一个最简单的Spring Boot程序代码作为试验 ...

  3. docker : RabbitMQ ElasticSearch

    docker  运行RabbitMQ容器 docker run -d -p 5672:5672 -p 15672:15672 --name 命名 CONTAINER ID 放出5672  /  156 ...

  4. [HNOI2003]消防局的设立(树上距离为k的最小覆盖问题)

    题目的大概意思现在有一棵树,在树上找半径小于等于2的最小覆盖点的最小个数. 题目链接 讲一讲此类题的贪心策略: 就是每次寻找最低没有被覆盖的点,显然对于覆盖它的所有点中,在他的祖先处设立一个点最优.所 ...

  5. Mysql内置功能《五》 函数

    一 函数 MySQL中提供了许多内置函数,例如: 一.数学函数 ROUND(x,y) 返回参数x的四舍五入的有y位小数的值 RAND() 返回0到1内的随机值,可以通过提供一个参数(种子)使RAND( ...

  6. [转] Linux 硬件设备查看命令

    linux查看设备命令 系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # ...

  7. Postman使用手册1——导入导出和发送请求查看响应

    导读: 现在的web和移动开发,常常会调用服务器提供restful接口进行数据请求,为了调试,一般会先用工具进行测试,通过测试后才开始在开发中使用.这里介绍一下如何在chrome浏览器利用postma ...

  8. P4304 [TJOI2013]攻击装置 最小割

    $ \color{#0066ff}{ 题目描述 }$ 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照"日"字攻击其周围的8个位置(x-1, ...

  9. Win10通电自动开机的解决办法

    前几天Win10强推系统升级,更新后无意中发现每次通电电脑就自动开机了. 解决办法: 打开控制面板>电源选项>选择电源按钮的功能,把关机设置里的“启用快速启动(推荐)”选项去掉就可以了. ...

  10. Boost内存池使用与测试

    目录 Boost内存池使用与测试 什么是内存池 内存池的应用场景 安装 内存池的特征 无内存泄露 申请的内存数组没有被填充 任何数组内存块的位置都和使用operator new[]分配的内存块位置一致 ...