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

c++学习笔记——堆

堆(heap)是一种特殊的完全二叉树堆中某个节点的值总是不大于或不小于其父节点的值

应用场景堆类型核心原理时间复杂度
Top-K 问题小顶堆(找最大K个)
大顶堆(找最小K个)
维护大小为K的堆,堆顶是第K大的候选O(n log k)
优先队列最大堆/最小堆按优先级动态调度,优先级高的先出队push O(log n)
pop O(log n)
堆排序最大堆建堆O(n) + 反复弹出堆顶O(n log n)O(n log n)
合并K个有序链表小顶堆每次弹出最小值,加入下个节点O(N log k)
数据流中位数大顶堆 + 小顶堆大顶堆放较小一半,小顶堆放较大一半O(log n) 插入
O(1) 获取中位数
Dijkstra 最短路小顶堆每次取出距离最小的节点O((V+E) log V)
Prim 最小生成树小顶堆每次取出边权最小的节点O((V+E) log V)
哈夫曼编码小顶堆每次合并频率最小的两个节点O(n log n)
滑动窗口最大值大顶堆(+延迟删除)维护窗口内元素的最大值O(n log k)
CPU 任务调度小顶堆(按时间)
大顶堆(按优先级)
按执行时间或优先级调度O(log n) 调度
求第K大元素小顶堆(大小K)维护K个最大元素,堆顶即答案O(n log k)
区间合并/覆盖小顶堆(按起点)按起点排序后堆化O(n log n)
多路日志合并小顶堆按时间戳合并多个日志流O(N log k)
实时排行榜小顶堆(Top-K)动态维护前K名O(log K) 更新

将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆——

大根堆:父结点的值 大于或等于 其子结点的值


小根堆:父结点的值 小于或等于 其子结点的值

1. 建堆过程(大根堆)——底层逻辑

void maxHeapify(vector<int>& a,int i,int heapSize){ //堆化函数(向下调整) int l = i*2+1; int r = i*2+2; int largest = i; //找出父节点i、左子l、右子r中的最大值 if(l<heapSize && a[l]>a[largest]) largest = l; if(r<heapSize && a[r]>a[largest]) largest = r; //如果最大值不是父节点i,交换并递归调整 if(largest!=i){ swap(a[i],a[largest]); maxHeapify(a,largest,heapSize); } } void buildMaxHeap(vector<int>& a,int heapSize){ //建堆函数 for(int i = heapSize/2-1;i>=0;--i){ // heapSize/2-1 是最后一个非叶子节点的索引 //从下往上、从右向左建堆,保证每个节点的子树都满足堆性质 maxHeapify(a,i,heapSize); } }

2. 使用过程—— priority_queue<>

// 大根堆(默认) priority_queue<int> pq; // 小根堆 auto cmp = [](int a,int b){return a>b;}; //a>b即为顶最小 priority_queue<int, vector<int>, decltype(cmp)> pq(cmp); // 小根堆(键值对——按值排序) auto cmp = [](pair<int,int>& a,pair<int,int>& b){return a.second>b.second;}; priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> q(cmp);
http://www.cnnetsun.cn/news/1931617.html

相关文章:

  • 没做这4类边界测试就部署AI服务?:金融/医疗/客服场景下 hallucination 爆发的3小时应急响应流程
  • AI服务注册延迟超800ms?2024年最严苛生产环境实测:3种服务发现方案TPS对比(含Latency P999数据)
  • 机器学习之预测概率问题
  • 朱雀AI检测率高怎么降?嘎嘎降AI使用教程:3步降到5%以下
  • Harness Engineering 入门指南:从提示词到AI系统设计的完整跃迁
  • Java开发者面对大模型,到底在焦虑什么?
  • 毕业论文降AI免费检测全攻略:SpeedAI科研小助手实测指南
  • PyTorch实战:5种模型剪枝方法对比与避坑指南(附代码)
  • PX4+Gazebo+MAVROS仿真环境搭建保姆级教程:从环境变量到模型文件,一次搞定所有坑
  • Anthropic Mythos 模型:CTF 测试创新高,“最后一步”凸显网络攻击潜力
  • EXCEL跨工作簿高效搜索:一键定位多表数据并提取目标单元格
  • 电力系统优化调度:MATLAB代码实现机组组合问题的混合整数线性模型
  • SQL嵌套查询如何避免全表扫描_合理使用索引辅助子查询
  • 如何实现容器滚动到底部后无缝切换至页面滚动
  • STM32 Bootloader内存规划避坑指南:H7双Bank Flash与分散加载文件(.sct)详解
  • 避坑指南:在Vue2 + docx-preview中实现文本高亮搜索,你可能遇到的3个DOM陷阱与解决方案
  • hermes安装篇
  • 360°全景拼接相机开发避坑指南:海思3403平台4目方案常见问题解析
  • 5个关键步骤掌握Postman便携版:零安装API测试神器
  • ngx_signal_handler
  • Java 8升级Java 17实战:用AWS Transform Custom自动化迁移Spring Boot项目完整教程
  • NX二次开发体收集器进阶——实体与片体的精准筛选与染色(2)
  • 以太网底层设计原理:从帧结构到全双工演进
  • 我做了一款视频下载神器 软件免费开源 无水印高清视频
  • Python算法保护实战:PyArmor与Docker的完美结合
  • ESP32项目实战:如何为以太网和Wi-Fi设置优先级?一个配置让关键数据走有线
  • TASK04 | Reasoning Kindom流形假设——高维数据的隐秩序
  • 网文新手逆袭秘籍:AI助我签约成功了,没想到困难变成了助手
  • Scrapy分布式爬虫(单机模拟多节点):豆瓣Top250项目设置与数据流全解析
  • 5分钟掌握高等数学积分:从基本公式到实战例题(附常见错误解析)