当前位置: 首页 > news >正文

05_Priority Queues 优先队列


title: 05_Priority Queues 优先队列
categories: 02_Silver
tags:

  • 优先队列
  • Priority Queue
  • Heap

Priority Queues 优先队列

简介

优先队列(Priority Queue 或 Heap)支持以下操作:

  • 插入元素
  • 删除最高优先级元素
  • 获取最高优先级元素

以上操作的时间复杂度均为O(log N)

优先队列比集合更简单更快,应尽可能使用优先队列。

Python 实现

注意:Python(与 C++ 不同)中删除和获取的是最小元素

heapq不是封装好的类,而是直接操作传入的列表,将其转换为堆。

警告:由于堆的结构特性,打印 pq 不会按排序顺序打印元素,而是直接打印列表。

基本操作

importheapq pq=[]# 对于长度大于1的列表,需要用 heapify 转换为堆heapq.heapify(pq)heapq.heappush(pq,7)# [7]heapq.heappush(pq,2)# [7, 2]heapq.heappush(pq,1)# [7, 2, 1]heapq.heappush(pq,5)# [7, 5, 2, 1]print(pq[0])# 1 (获取最小元素)heapq.heappop(pq)# 弹出最小值 [7, 5, 2]heapq.heappop(pq)# 弹出最小值 [7, 5]heapq.heappush(pq,6)# [7, 6, 5]

常用方法

方法说明
heapq.heappush(pq, x)插入元素 x
heapq.heappop(pq)弹出并返回最小值
heapq.heapreplace(pq, x)弹出最小值并插入 x(原子操作)
heapq.heapify(pq)将列表转换为堆

大顶堆

Python 的 heapq 只支持小顶堆。要实现大顶堆,可以取负值:

# 大顶堆heapq.heappush(heap,-x)# 存入负值-x=-heapq.heappop(heap)# 取出时取负

例题:Room Allocation

CSES - Room Allocation

问题描述

给定 n 个客户的到达和离开时间,求所需的最少房间数。

思路

  1. 按到达时间排序所有客户
  2. 维护一个小顶堆,存储已处理客户的离开时间
  3. 对于每个客户:
    • 如果堆顶的离开时间 < 新客户的到达时间,说明有房间空出,弹出堆顶并放入新客户的离开时间
    • 否则,所有房间都满了,需要分配新房间

代码

importheapqimportsys n=int(sys.stdin.readline())timetable=[]forcustomerinrange(n):arrival,departure=map(int,sys.stdin.readline().split())timetable.append((arrival,departure,customer))timetable.sort(key=lambdax:x[0])# 按到达时间排序priority_queue=[]# 存储 (离开时间, 客户编号)room_numbers=[-1]*n# 房间分配结果forarrival,departure,customerintimetable:ifpriority_queueandarrival>priority_queue[0][0]:# 有空房间room_numbers[customer]=room_numbers[priority_queue[0][1]]heapq.heapreplace(priority_queue,(departure,customer))else:# 需要新房间heapq.heappush(priority_queue,(departure,customer))room_numbers[customer]=len(priority_queue)print(len(priority_queue))print(*room_numbers)

复杂度

  • 时间复杂度:O(n log n)
  • 空间复杂度:O(n)

更多例题

思路总结

优先队列常用于:

  1. 贪心算法:每次选择最小/最大的元素
  2. 多路归并:合并多个有序序列
  3. 求 Top K:维护最大的 K 个元素
  4. 任务调度:按优先级处理任务
  5. 滑动窗口:维护窗口内的最值
http://www.jsqmd.com/news/503372/

相关文章:

  • 彻底搞懂 Java 垃圾回收(GC)
  • OpenCV实战:5分钟搞定图像模板匹配(NCC算法+C++代码详解)
  • 6.4 日志到底怎么写才有用?排障效率提升的底层方法
  • 教学实验规范下的AI审核与IACheck:让样品分析检测报告更严谨与可复核
  • 鸿蒙HarmonyOS无线调试全攻略:摆脱USB线束缚的5个关键步骤
  • HBase实战:用Python+Thrift实现电商用户行为数据存储(含Region分裂优化)
  • 别再乱用Transform了!用MONAI处理医学图像,这5个核心操作你得先搞懂
  • 别再踩坑了!Vue中使用postMessage传值的5个注意事项(含window.opener最佳实践)
  • U8g2自定义中文字库实战:从零构建Arduino OLED专属字体
  • 华为防火墙双线路故障切换避坑指南:健康检查配置常见误区解析
  • Llava-v1.6-7b模型部署教程:Linux环境一键安装指南
  • QGIS插件开发避坑指南:从安装Plugin Builder到第一个Hello World插件
  • 多语言情感分析挑战与解决方案
  • 锤子科技Android开源项目深度解析:一步与大爆炸的创新实现
  • LingBot-Depth实测分享:在RTX 4090上实现1080p深度图实时精炼
  • 6.5 Git协作不踩坑:提交规范分支策略冲突处理全流程
  • YOLOv5后处理全流程拆解:从6万个候选框到最终结果的‘过滤漏斗’
  • 探索C# WPF MVVM大屏看板3D立体可视化大屏监控源码
  • AGENTS.md 高效开发指南:3个核心操作技巧
  • Jetson Orin NX深度学习环境搭建:PyTorch与CUDA的完美结合
  • 戴森吸尘器电池复活完整指南:开源固件解锁隐藏功能
  • 2024年一级建造师通信与广电工程备考攻略:5G与广电新技术考点全解析
  • Python 实战2:新浪新闻静态 + 动态数据采集与清洗全流程
  • 7.1 从localhost到公网:一次讲清部署全过程
  • AI智能二维码工坊自动化集成:CI/CD中调用生成脚本实战
  • 开关电源EMC整改实录:用WSX系列共模电感搞定30MHz辐射超标
  • Element Plus 2.2.27 的单选框 Radio 组件,选中一个选项后,全部选项都变为选中状态
  • Qwen3-ASR-0.6B在Vue前端项目中的集成方案
  • 【AI】linux-windows即将消亡,未来模型即系统
  • 碳纤维行业全产业链 VOCs 解析及碳化工段废气治理方案+案例