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

优先队列——延迟删除

延迟删除是一种结合优先队列(堆)懒标记的技巧,用于解决堆不支持直接删除任意元素的问题。

为什么需要延迟删除?

std::priority_queue只允许访问堆顶,无法直接移除堆中间的元素。但在许多算法(如天际线、Dijkstra 中的边松弛)中,我们可能需要将某个已入堆的元素标记为“无效”,待它自然上升到堆顶时再丢弃。

实现原理

  1. 额外维护一个“待删除”计数器(哈希表)unordered_map<ValueType, int> toRemove

  2. 逻辑删除:当需要删除某个值v时,不直接在堆中操作,而是toRemove[v]++

  3. 物理清理:每次取堆顶前,检查当前堆顶是否在toRemove中有待删除计数。若有,则弹出堆顶并减少计数,重复该过程直到堆顶是真正活跃的元素。

通用模板

cpp

priority_queue<T> pq; // 最大堆 unordered_map<T, int> pending; // 待删除计数 void insert(T val) { pq.push(val); } void lazy_erase(T val) { pending[val]++; } T top() { while (!pq.empty() && pending[pq.top()] > 0) { pending[pq.top()]--; pq.pop(); } return pq.top(); // 调用前需确保非空 }

注意事项

  • 重复值处理:必须用计数器(int),不能用简单的bool,因为可能有多个相同值的元素需要分别删除。

  • 性能:每个元素至多入堆、出堆一次,哈希表操作 O(1) 均摊,整体复杂度不受影响。

  • 适用场景:任何需要动态删除堆中非顶部元素的场合,如天际线问题Dijkstra 松弛优化(改用pair<dist,node>且不修改而是插入新距离,旧距离被懒惰丢弃)。

天际线问题中的实际代码(片段)

cpp

priority_queue<int> pq; // 最大堆,存高度 unordered_map<int, int> toRemove; pq.push(0); for (事件 e : events) { if (e.isLeft) pq.push(e.height); else toRemove[e.height]++; // 清理堆顶已标记删除的高度 while (!pq.empty() && toRemove[pq.top()] > 0) { toRemove[pq.top()]--; pq.pop(); } int curHeight = pq.top(); // 处理高度变化... }

总之,延迟删除是堆结构的一种经典补丁,以较小的额外空间和时间代价,模拟了“可删除优先队列”的行为。

http://www.jsqmd.com/news/760717/

相关文章:

  • OpenClaw用户如何通过Taotoken CLI快速写入配置并开始使用
  • World-To-Image算法:重构AIGC图像生成新范式
  • 使用Python通过Taotoken一键调用Claude与GPT模型
  • 【计算机网络】第10篇:距离矢量路由算法——Bellman-Ford方程与RIP协议的特性分析
  • R 4.5边缘AI上线倒计时:2024Q3起CRAN将强制要求静态链接声明——你还没适配R 4.5.0+新LinkingTo规范?
  • 26.人工智能实战:模型升级后线上效果反而变差?从 Prompt 回归测试到灰度发布的完整工程治理方案
  • 告别网络卡顿:用华为eNSP模拟真实办公网,实战QoS限速保障关键业务
  • 运行mysql
  • Video-Thinker-7B:视频理解与推理的开源模型解析
  • 江浙沪皖宣传栏定制厂家技术标准与落地指南 - 奔跑123
  • 3步快速实现AnyFlip电子书永久保存:终极免费下载指南
  • 2026年川渝滇陕附近工程机械维修厂家选择:工程机械维修电话、工程机械配件、成都工程机械维修、AGV叉车、内燃叉车选择指南 - 优质品牌商家
  • 教育领域AI情感分析技术解析与应用实践
  • 新手教程使用 Python 快速接入 Taotoken 并调用多模型完成对话
  • 2026北京豪华考斯特租车哪家靠谱:北京考斯特出租、北京考斯特包车、北京考斯特的商务车租赁、北京长期租车费用、带司机包车多少钱北京选择指南 - 优质品牌商家
  • AI代理安全新范式:BlindKey盲注机制与凭证管理实战
  • 【阿贝云】免费服务器使用感受(二)
  • 扩散模型强化学习优化:TreeGRPO算法解析与实践
  • SSRAM技术解析:高速缓存与存储系统的核心组件
  • AI生成多层级测试用例的工程实践与架构设计
  • 【计算机网络】第11篇:链路状态路由协议——Dijkstra算法与OSPF的分区架构
  • 如何用MaxBot抢票机器人轻松买到演唱会门票:2025年完整使用指南
  • CDL Practice Tests - AI
  • LangChain、LangGraph、Deep Agents傻傻分不清?一文彻底搞懂,AI开发者的进阶指南!
  • C# 使用 YOLOv8n.ONNX Runtime AI监测海康威视频流实时识别人员并保存标注图片
  • VS2022离线安装避坑指南:从下载到安装,我踩过的那些‘雷’都帮你排好了
  • 视觉语言模型安全:BEAT后门攻击与防御实践
  • 多模态大语言模型评估新基准VDR-Bench解析
  • 别再被HLA和RTI搞晕了!用一张图+一个例子,带你搞懂分布式仿真的核心架构
  • 3分钟搞定电脑风扇噪音!FanControl免费软件终极指南