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

STL优先级队列的比较函数与大堆小堆的关系

STL中的priority_queue(优先级队列)通过比较函数来确定元素的优先级顺序,从而决定其内部是形成大堆还是小堆。以下是关键点总结:

  1. 默认行为与大堆

    • 默认情况下,priority_queue使用std::less<T>作为比较函数,形成大堆(最大堆)。
    • 大堆特性:父节点的值总大于或等于子节点,堆顶元素为最大值。
    • 比较逻辑:当a < b返回true时,认为b的优先级更高,较大的元素会被置于堆顶。
  2. 小堆的实现

    • 若使用std::greater<T>作为比较函数,则形成小堆(最小堆)。
    • 小堆特性:父节点的值总小于或等于子节点,堆顶元素为最小值。
    • 比较逻辑:当a > b返回true时,认为b的优先级更高,较小的元素会被置于堆顶。
  3. 比较函数的作用

    • 比较函数Compare接受两个参数ab,返回值为true表示第二个参数b的优先级更高
    • 元素的插入和堆调整均基于此规则,确保堆结构始终符合比较函数定义的顺序。
  4. 示例说明

    // 默认大堆,使用less<T>
    priority_queue<int> max_heap;// 显式小堆,使用greater<T>
    priority_queue<int, vector<int>, greater<int>> min_heap;
    
  5. 自定义比较函数

    • 可通过自定义函数或仿函数定义特殊优先级规则。例如,实现按绝对值大小排列的堆:
    struct AbsCompare {bool operator()(int a, int b) {return abs(a) < abs(b); // 返回true时,b的绝对值更大,优先级更高}
    };
    priority_queue<int, vector<int>, AbsCompare> abs_max_heap;
    

总结:比较函数通过定义元素的优先级顺序(第二个参数是否应优先于第一个参数),直接决定priority_queue是大堆还是小堆。理解比较函数参数的顺序及其返回值对优先级的影响,是正确使用优先级队列的关键。

http://www.xdnf.cn/news/12480.html

相关文章:

  • Kubernetes任务调度:深入理解Job与CronJob
  • Linux 常用命令与 Shell 简介
  • chatshare.xyz注册登录后,提示过期的解决方式!
  • Day130 | 灵神 | 回溯算法 | 子集型 电话号码的字母组合
  • 【DAY40】训练和测试的规范写法
  • OpenWRT prplOS-- ubus命令配置参数
  • sanitizer工具
  • 基于Pandas数据分析的设备巡检计划生成算法设计及实现
  • 设置Linux时区环境变量TZ
  • Java常用工具类方法详解及使用案例
  • 【大模型:知识库管理】--开源工具Ragflow介绍+本地搭建
  • 美化显示LLDB调试的数据结构
  • c#基础010(程序结构)
  • Spring Boot论文翻译防丢失 From船长cap
  • 搜广推特征数据变更灰度为什么实现很困难
  • float、double 这类 浮点数 相比,DECIMAL 是另一种完全不同的数值类型
  • 【地图 - 问题】公司etm地图:聚合功能重复添加,导致图标重复添加,导致部分重复添加的图标无法清除
  • 计算机组成原理(计算篇)
  • AIGC赋能前端开发
  • 多进程与多线程:核心差异与实战选择
  • AIGC-SD3、控制
  • 在亚马逊选品时,可依托数据驱动的关键词分析体系
  • vue2.0高频面试题汇总--持续更新
  • 基于STM32的DS18B20温度远程监测LCD1602显示
  • Vue3.5 企业级管理系统实战(二十三):权限指令
  • 【快速预览经典深度学习模型:CNN、RNN、LSTM、Transformer、ViT全解析!】
  • 根据指定日期和cron表达式生成下一周期的执行时间
  • C++类二
  • 吞咽与营养并重:进行性核上性麻痹患者的饮食管理方案
  • 龙虎榜——20250605