heap queque(堆队列),是一个完全二叉树,并且满足一个条件:每个节点(叶节点除外)的值都大于等于(或小于等于)它的子节点。提供了构建小顶堆的方法和一些小顶堆的基本操作方法(如入堆、出堆等),可以用于实现堆排序算法。

创建堆的两种方法:

import heapq

lists = [3, 10, 20, 52, 2, 83, 52, 81, 51]
#一、 创建空列表,然后使用heappush将数据添加到空列表中,每添加一个新数据后,该列表都满足小顶堆特性。
heap = []
for i in lists:
heapq.heappush(heap, i)

print("lists: ",lists)
print("heap: ",heap)

# 二、使用heapify直接将数据列表调整为小顶堆格式
heapq.heapify(lists)
print("The lists after heap is : ",lists)

注:小顶堆含义,每个节点(叶节点除外)的值都小于等于其子节点的值,根节点的值是所有节点中最小的。大顶堆反之。

使用heapq进行堆排序:

import heapq

lists = [3, 10, 20, 52, 2, 83, 52, 81, 51]
# 这里需要先构建堆,否则直接heappop得不到排序后的结果
heap = []
for i in lists:
heapq.heappush(heap, i) print(heap[0])
# heappop(heap),依次取出堆顶的值,并将剩余的数据构造成新的小顶堆
heap_sort = [heapq.heappop(heap) for _ in range(len(heap))]
print("heap sort result: ", heap_sort)

获取堆中的最大值和最小值

import heapq

lists = [3, 10, 20, 52, 2, 83, 52, 81, 51]
# 这里的heapq.heapify(lists)写与不写效果一样
heapq.heapify(lists)
# heapq.nlargest和heapq.nsmallest两个函数可以用于堆,也可以用于列表,功能相同。所以前面无需构造堆
print(heapq.nlargest(2, lists))
print(heapq.nsmallest(3, lists))

堆中元素的替换方法

import heapq

# 这里演示heappushpop和heapreplace的用法
# heappushpop,先入堆再出堆,所以堆元素不变化
array_c = [10, 7, 15, 8]
heapq.heapify(array_c)
print("before: ",array_c)
# 先push再pop
item = heapq.heappushpop(array_c, 5)
print("after: ",array_c)
print(item) # heapreplace,先出堆,再将新元素入堆,堆元素发生变化
array_d = [10, 7, 15, 8]
heapq.heapify(array_d)
print("before: ",array_d)
item = heapq.heapreplace(array_d, 5)
print("after: ",array_d)
print(item)

堆的方法:

heapq.heapify(x):创建堆,将list转化为堆

heapq.heappush(heap, item): 添加新元素到堆

heapq.heappop(heap):弹出堆顶元素,并将剩余元素组成新的小顶堆

heap.heappushpop(heap, item):先将item入堆,再将item出堆

heapq.merge(*iterables, key = None, reverse = False):暂未了解

heapq.heapreplace(heap, item):先弹出堆顶元素,再将item入堆

heapq.nlargest(n, iterable, key = None):取堆、队列中最大的n个值,key为关键字,使用示例:cheap = heapq.nsmallest(3, portfolio, key = lambda s:s['price'])

heapq.nsmallest(n, iterable, key = None)

python的十大数据结构之堆队列heapq(heap queue)的更多相关文章

  1. python实现十大经典排序算法

    Python实现十大经典排序算法 代码最后面会给出完整版,或者可以从我的Githubfork,想看动图的同学可以去这里看看: 小结: 运行方式,将最后面的代码copy出去,直接python sort. ...

  2. 一篇夯实一个知识点系列--python实现十大排序算法

    写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...

  3. Python实现十大经典排序算法(史上最简单)。

    十大排序算法(Python实现)一. 算法介绍及相关概念解读 算法分类十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn), ...

  4. Python实现十大经典排序算法(史上最简单)

    十大排序算法(Python实现)一. 算法介绍及相关概念解读 算法分类十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn), ...

  5. 用Python实现十大经典排序算法-插入、选择、快速、冒泡、归并等

    本文来用图文的方式详细讲解了Python十大经典排序算法 —— 插入排序.选择排序.快速排序.冒泡排序.归并排序.希尔排序.插入排序.桶排序.基数排序.计数排序算法,想要学习的你们,继续阅读下去吧,如 ...

  6. 排序算法——(2)Python实现十大常用排序算法

    上期为大家讲解了排序算法常见的几个概念: 相关性:排序时是否需要比较元素 稳定性:相同元素排序后是否可能打乱 时间空间复杂度:随着元素增加时间和空间随之变化的函数 如果有遗忘的同学可以看排序算法——( ...

  7. C++数据结构之链式队列(Linked Queue)

    C++数据结构之链式队列,实现的基本思想和链式栈的实现差不多,比较不同的一点也是需要注意的一点是,链式队列的指向指针有两个,一个是队头指针(front),一个是队尾指针(rear),注意指针的指向是从 ...

  8. Python不能用于大型项目?人们对Python的十大误解

    Python 类型系统的特点是拥有强大.灵活的类型操作. 维基百科上对此作出的阐述. 而存在一个不争而有趣的事实是, Python 是比Java更加强类型的. Java 对于原生类型和对象区分了类型系 ...

  9. python实现十大核心算法(桶排没实例)

    # author:sevenduke # 2019-06-11 # 一.交换排序 # 排序算法的温故:冒泡排序 def dubblesort(arr): for i in range(0, len(a ...

  10. 人工智能+Python:十大Markdown语法简明教程

    Markdown 是一种轻量级的标记语言,用户可以使用诸如 * # 等简单的标记符号以最小的输入代价生成极富表现力的文档,目前也被越来越多的写作爱好者,撰稿者广泛使用.本文希望用直观的方法来讲述Mar ...

随机推荐

  1. 【Java】【常用类】Date 日期类

    java.util.Date java.sql.Date 创建日期对象和打印结果 public class DateTest { public static void main(String[] ar ...

  2. 【Spring-Security】Re10 Oauth2协议 P1 授权码模式 & 密码模式

    一.Oauth2协议: 第三方登录,即忘记本站密码,但是登录界面中提供了一些第三方登录,例如微信.支付宝.QQ.等等,通过第三方授权实现登录 第三方认证技术主要解决的时认证标准,各个平台的登录要遵循统 ...

  3. 【Layui】03 按钮 Button

    文档位置: https://www.layui.com/doc/element/button.html 01.[按钮主题] <div> <button type="butt ...

  4. 【转载】 介绍具有代表性的CPG控制机器人

    原文地址: https://www.cnblogs.com/zhaochenliang/p/10453255.html ---------------------------------------- ...

  5. java获取包下所有的类

    1.背景 给一个Java的包名,获取包名下的所有类.. 根据类上的注解,可以展开很多统一操作的业务 2.直接看代码-spring环境下 package com.qxnw.digit.scm.commo ...

  6. Apache DolphinScheduler支持Flink吗?

    随着大数据技术的快速发展,很多企业开始将Flink引入到生产环境中,以满足日益复杂的数据处理需求.而作为一款企业级的数据调度平台,Apache DolphinScheduler也跟上了时代步伐,推出了 ...

  7. 【金猿人物展】白鲸开源CEO郭炜:数据要素是未来数据“新能源”产业么?

    纵观2023年中国数据行业发展与2024年数据产业趋势,就不得不提到2023年全年国家全年强调的数据要素的概念以及在2023年12月中国国家数据局等17个部门联合印发了<"数据要素×& ...

  8. 深入理解 PHP 高性能框架 Workerman 守护进程原理

    大家好,我是码农先森. 守护进程顾名思义就是能够在后台一直运行的进程,不会霸占用户的会话终端,脱离了终端的控制.相信朋友们对这东西都不陌生了吧?如果连这个概念都还不能理解的话,建议回炉重造多看看 Li ...

  9. 使用BizyAir,没有显卡,也能玩AI绘图

    或许很多人跟我一样,没有显卡,但又很想玩AI绘图,但本地绘图怕是无缘了,只能借助云GPU的方式了. 今天跟大家分享一下一个简单目前可白嫖无门槛的方法实现无显卡也能玩AI绘图. 方案就是ComfyUI+ ...

  10. 淘宝打单发货接口,淘宝打单发货API

    许多做系统功能的小伙伴经常面对的一个功能是对接淘宝开放平台,在自己系统中进行打单发货. 但是,目前淘宝开放平台,已经关闭了相关的相关的权限申请,具体可查看相关公告.有需要这个权限的,可以站内信联系我, ...