算法题Python常用内置函数、方法、技巧汇总(其五:堆/优先队列)

文章目录

优先队列相关操作

注意,优先队列priority queue )也叫做heap)。谈到优先队列时,一般强调其功能或应用,谈到堆时,一般强调其树形结构,但这两个词是可以进行同义替换的,大部分时候不用做严格区分。

在python中,我们使用内置库heapq来实现优先队列的相关操作。需要先导入heapq库。即

python 复制代码
from heapq import *

或者

python 复制代码
from heapq import heapify, heappush, heappop    # 导入最常用的三个API

虽然优先队列的底层原理是用完全二叉树 来实现的,但由于完全二叉树通过层序遍历 (即树的BFS)可以得到序列化的结果(即数组),故通常而言我们无需显式地构建出一棵完全二叉树来实现堆,而是使用heapq内置库来对一个列表进行堆化和堆操作

堆化

使用heapq内置库中的内置函数heapify()来实现一个列表的堆化。所谓堆化,是指令一个列表按照堆排序的要求来排序的过程。

python 复制代码
heap = [1, 3, 4, 2]        # 构建一个叫做heap的列表
heapify(heap)              # 令heap堆化
print(heap)                # 输出[1, 2, 4, 3],是heap按照堆排序后的结果

从单词heapify()也可以看出,这是一个动词,故该函数是功能对heap列表进行原地排序,没有返回值。

堆化/堆排序的时间复杂度是O(NlogN)

入堆

使用heapq内置库中的内置函数heappush(heap, element)来实现将元素element加入堆heap中。

python 复制代码
heap = [1, 3, 4, 2]        # 构建一个叫做heap的列表
heapify(heap)              # 令heap堆化
heappush(heap, 5)          # 令元素5入堆
print(heap)                # 输出[1, 2, 4, 3, 5],是5入堆后的结果
heappush(heap, 0)          # 令元素0入堆
print(heap)                # 输出[0, 2, 1, 3, 5, 4],是0入堆后的结果

入堆操作的时间复杂度为O(logN)heappush()函数是没有返回值的。

出堆

使用heapq内置库中的内置函数heappop(heap)来实现弹出堆heap的堆顶元素。

python 复制代码
heap = [0, 1, 2, 3, 4, 5]  # 构建一个叫做heap的列表
heapify(heap)              # 令heap堆化
top = heappop(heap)        # 弹出堆顶元素
print(top, heap)           # 输出0和[1, 3, 2, 5, 4],是堆顶元素0出堆后的结果
top = heappop(heap)        # 弹出堆顶元素
print(top, heap)           # 输出1和[2, 3, 4, 5],是堆顶元素1出堆后的结果

出堆操作的时间复杂度为O(logN)heappop()函数是有返回值的,返回出堆的堆顶元素。

获取堆顶元素

堆顶元素总是位于列表heap索引为0的位置,故直接使用索引操作即可获得堆顶元素。

python 复制代码
heap = [5, 4, 2, 0, 3, 1]  # 构建一个叫做heap的列表
heapify(heap)              # 令heap堆化
print(heap[0])             # 输出堆顶元素0

小根堆与大根堆

小根堆是指较小值具有更高优先级的堆,在树形结构上体现为,每一个节点的值都小于其子节点的值。

大根堆是指较大值具有更高优先级的堆,在树形结构上体现为,每一个节点的值都大于其子节点的值。

在python的heapq库中,默认的操作是构建****小根堆

如果想要构建一个大根堆,可以通过储存元素相反值的方式来构建一个伪大根堆 ,即实际上仍然按照小根堆来操作,但由于储存了相反数,原先的最大值会变成绝对值最大的最小值而储存在堆顶。如

python 复制代码
heap = [0, 1, 2, 3, 4, 5]      # 构建一个叫做heap的列表
heap = [-num for num in heap]  # 储存相反数
heapify(heap)                  # 令heap堆化,得到一个伪大根堆
top = -heappop(heap)           # 弹出堆顶元素,再取反,可以得到原heap中的最大值
print(top, heap)               # 输出5和[-4, -3, -2, 0, -1],是堆顶元素-5出堆后的结果
heappush(heap, -10)            # 往堆中存入元素10,应该存入其相反数-10
print(heap)                    # 输出[-10, -3, -4, 0, -1, -2],可以看到-10位于堆顶heap[0]的位置

华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

相关推荐
南宫生5 分钟前
Java迭代器【设计模式之迭代器模式】
java·学习·设计模式·kotlin·迭代器模式
seabirdssss22 分钟前
通过动态获取项目的上下文路径来确保请求的 URL 兼容两种启动方式(IDEA 启动和 Tomcat 部署)下都能正确解析
java·okhttp·tomcat·intellij-idea
程序员小赵同学27 分钟前
AI Agent设计模式二:Parallelization
开发语言·python·设计模式
杰克逊的日记33 分钟前
CentOs系统部署DNS服务
linux·python·centos·dns
kill bert1 小时前
第30周Java分布式入门 消息队列 RabbitMQ
java·分布式·java-rabbitmq
qystca1 小时前
蓝桥云客---九宫幻方
算法·深度优先·图论
Bruce_Liuxiaowei1 小时前
基于Flask的DeepSeek~学术研究领域智能辅助系统设计与实现
后端·python·flask·deepseek
Swift社区1 小时前
轻松搞定!Mac 用户的 ESP-IDF 安装全攻略
python·嵌入式
明月清了个风1 小时前
数据结构与算法学习笔记----贪心区间问题
笔记·学习·算法·贪心算法
努力毕业的小土博^_^1 小时前
【EI/Scopus双检索】2025年4月光电信息、传感云、边缘计算、光学成像、物联网、智慧城市、新材料国际学术盛宴来袭!
人工智能·神经网络·物联网·算法·智慧城市·边缘计算