priority_queue(堆)干货归纳+用法示例
10.priority_queue
- 一.priority_queue(堆Heap)简介
- 1.堆的特点:
- 2.使用场景:
- 二.成员函数
- 1.构造函数:priority_queue构造函数方式:
- 2.push()函数:向priority_queue中插入一个元素:
- 3.pop()函数:弹出priority_queue中的队首元素:
- 4.top()函数:获取priority_queue中的队首元素:
- 5.size()函数:获取priority_queue中的元素个数:
- 6.empty()函数:判断priority_queue是否为空:
- 三.程序示例
一.priority_queue(堆Heap)简介
在C++中,堆(Heap)是一种特殊的树状数据结构,其中每个节点都比其子节点大或小(具体取决于堆的类型)。堆通常用于实现优先队列和排序算法。
1.堆的特点:
- 完全二叉树:堆是一种完全二叉树,即除了最后一层节点可以不满外,其它层节点都必须满足。
- 有序性:堆中的每个节点都比其子节点大或小(具体取决于堆的类型),满足堆的有序性。
- 快速插入和删除:由于堆的特殊结构,可以在O(log n)的时间复杂度内进行插入和删除操作。
C++中有两种类型的堆:最大堆(Max Heap)和最小堆(Min Heap)。最大堆的每个节点都比其子节点大,而最小堆的每个节点都比其子节点小。通常使用头文件中的priority_queue类来实现堆。
priority_queue类特点:
- 自动排序:priority_queue会自动按照元素的大小进行排序,因此每次取出的元素都是当前最大(或最小)的元素。
- 高效的插入和删除操作:priority_queue使用堆的数据结构,插入和删除元素的时间复杂度为O(log
n),其中n是容器中的元素数量。 - 支持随机访问:虽然priority_queue本身不支持随机访问,但是可以通过其底层的容器(默认是vector)来实现随机访问。
2.使用场景:
- 找到数组或序列中的第K大或第K小元素;
- 求一组数据的中位数;
- 排序算法,如堆排序、选择排序等;
- 优先队列,如Dijkstra算法、Prim算法等。
priority_queue的使用场景:
- 求Top K元素:如果需要求一个序列中最大(或最小)的K个元素,可以使用priority_queue。
- 任务调度:如果有多个任务需要按照优先级进行执行,可以将任务按照优先级放入priority_queue中,每次从队列中取出优先级最高的任务进行执行。
- Dijkstra算法:Dijkstra算法是求解单源最短路径的经典算法之一,其中需要使用priority_queue来维护当前距离起点最短的点
。
二.成员函数
1.构造函数:priority_queue构造函数方式:
- 默认构造函数:创建一个空的priority_queue(默认使用std::less函数对象来进行排序,也就是说它是一个大根堆,将最大值放在队首)。
priority_queue<int> q; // 创建一个空的priority_queue
- 带参构造函数:创建一个priority_queue,并将参数中的元素放入其中。
priority_queue<int> q({1, 2, 3, 4}); // 创建一个priority_queue,并将元素1、2、3、4放入其中
- 自定义比较函数的构造函数:可以通过自定义比较函数来指定priority_queue的排序方式。
auto cmp = [](int a, int b) { return a > b; };
priority_queue<int, vector<int>, decltype(cmp)> q(cmp); // 创建一个priority_queue,使用自定义的比较函数
2.push()函数:向priority_queue中插入一个元素:
q.push(10); // 向priority_queue中插入元素10
3.pop()函数:弹出priority_queue中的队首元素:
q.pop(); // 弹出priority_queue中的队首元素
4.top()函数:获取priority_queue中的队首元素:
int x = q.top(); // 获取priority_queue中的队首元素
5.size()函数:获取priority_queue中的元素个数:
int s = q.size(); // 获取priority_queue中的元素个数
6.empty()函数:判断priority_queue是否为空:
bool is_empty = q.empty(); // 判断priority_queue是否为空
三.程序示例
下是一个使用最大堆求一组数据的前K大元素的例子:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;vector<int> topk(vector<int>& nums, int k) {priority_queue<int, vector<int>, less<int>> pq; // 最大堆for (int num : nums) {pq.push(num);}vector<int> result;while (!pq.empty() && result.size() <k ) {result.push_back(pq.top());pq.pop();}return result;
}int main() {vector<int> nums = { 3, 2, 10, 5, 6, 4,3,7 };int k = 2;vector<int> result = topk(nums, k);for (int num : result) {cout << num << " ";}return 0;
}
该程序使用最大堆求一组数据的前K大元素,将数据依次插入堆中,如果堆的大小小于K,则直接插入;否则,将堆顶元素与当前元素比较,如果堆顶元素比当前元素小,则弹出堆顶元素并插入当前元素。最后,将堆中所有元素依次取出并返回即可。
相关文章:

priority_queue(堆)干货归纳+用法示例
10.priority_queue一.priority_queue(堆Heap)简介1.堆的特点:2.使用场景:二.成员函数1.构造函数:priority_queue构造函数方式:2.push()函数:向priority_queue中插入一个元素:3.pop()…...

miniprogram-to-uniapp使用指南(各种小程序项目转换为uni-app项目)
小程序分类:uni-app qq小程序 支付宝小程序 百度小程序 钉钉小程序 微信小程序 小程序转成uni_app 小程序转为uni_app 小程序转uni_app 小程序转换 工具现在支持npm全局库、HBuilderX插件两种方式使用,任君选择,HBuilderX插件地址:…...

BZOJ2720: [Violet 5]列队春游 【概率与期望】
题意自行理解,先讲一下概率和期望怎么算 概率 概率准确的定义自行百度,这里就不赘述了 概率的计算其实很简单,就是将符合条件的情况除以总共的情况 下面以掷骰子为例: 问题:将一个骰子掷出,666朝上的概率是多少 …...

脉诊之脉象——平脉,常见病脉,七绝脉
平脉与病脉诊脉纲领平人脉象常见病脉浮脉沉脉迟脉数脉虚脉实脉涩脉洪脉细脉滑脉弦脉紧脉长脉短脉弱脉芤脉结脉代脉七绝脉釜沸脉鱼翔脉虾游脉屋漏脉雀啄脉解索脉弹石脉预后诊脉纲领 脉跳动的力度:有力者,气足也。无力者,气不足也。 脉…...

第05章_存储引擎
第05章_存储引擎 🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某…...

【新2023Q2押题JAVA】华为OD机试 - 挑选字符串
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:挑选字符串 题目 给定a-z,…...
职场「OKR」,魔幻又内卷
个人习惯称之为【O-KR-KPI】组合; 01从进厂实习那天开始,就接触了KPI的概念; 互联网公司,年初入职,可能因为那天是周五,又赶上月底,少不了要把KPI搬出来折腾一番; 天时,…...
mysql8计算商家距离,按照由近及远排序
要计算商家距离并按照距离排序,可以使用MySQL 8中的空间函数和索引。以下是一个例子: 创建商家表 CREATE TABLE merchants (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50),location POINT,SPATIAL INDEX (location) ) EngineInnoDB;插入商家数据…...

c语言函数使用记录
1.sscanf函数的用法sscanf():将 C 语言字符串中数据按 指定的格式 将数据存储在对应的参数中。// sscanf() 会从 buffer 里读进数据,依照 format 的格式将数据写入到 argument 里, //注意这里的 argument 需要使用地址符号 // 转换格式参考 s…...
VBA智慧办公4——符号运算及语法结构
目录 运算符 一、算术运算符 二、连接运算符 三、比较运算符 四、逻辑运算符 语法结构 一、if语句 二、select case语句 三、for语句 四、while语句: 五、with语句 运算符 VBA中运算符的作用也是相当重要,本章我们要着重了解VBA中运算符下设的…...
ChatGPT角色扮演提示语
ChatGPT角色扮演提示语 使用ChatGPT角色扮演提示语,你可以将GPT调教成各种专业角色,因此你也会获得更好的对话体验,学会调教GPT,你就会发现GPT实际上非常的强大。此处会长期更新GPT角色提示词,方便各位学习使用GPT… …...
【Java面试题】设计模式之七种结构性模式——代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式
目录 一、代理模式 二、适配器模式 三、桥接模式 四、装饰模式 五、外观模式 六、享元模式 七、组合模式 一、代理模式 概念: 代理模式是为其他对象提供一种以代理控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象࿰…...

【从零开始学习 UVM】6.3、UVM 激励产生 —— start() 方法执行sequence详解
文章目录 start方法解析简单sequence flow继承的seqeunce flow生成sequence flowstart方法解析 virtual task start ( uvm_sequencer_base sequencer,uvm_sequence_base parent_sequence = null,int this_priority = -1...

「Python 机器学习」Matplotlib 数据探索
Matplotlib 是一个 Python 的数据可视化库,它能够轻松创建各种类型的图表和图形;Matplotlib 可以在 Jupyter Notebooks、交互式应用程序和脚本中使用,并支持多种绘图样式和格式; Matplotlib 最初是为科学计算而设计的,…...
3.24-3.26学习总结
目录 一.方法methed 二.构造方法(构造器) 三.方法重载 四.方法覆写 一.方法methed 1.定义: 修饰符 方法返回类型 方法名(参数列表){ 系列语句; return 返回值; } 2.public方法/字段: 公开给…...

OpenAI Translator 基于 ChatGPT API 的划词翻译工具
OpenAI Translator,一款基于 ChatGPT API 的划词翻译浏览器插件和跨平台桌面端应用,使用 ChatGPT API 进行划词翻译和文本润色,借助了 ChatGPT 强大的翻译能力,帮助用户更流畅地阅读外语和编辑外语,允许跨 55 种不同语…...
git常用指令---复习向
git常见的指令: 本地仓库 1.创建仓库: git init 会出现.git文件夹 2.查看git状态:git status 3.添加一个文件: git add <fileName> 4.添加所有文件:git add . 5.提交并附加信息:git commit -m&…...

安卓开发学习记录(持续学习)
文章目录前言工具创建项目简单控件即UI一、界面显示与逻辑处理二、文本三、布局四、按钮五、控件综合训练(简易计算器)六、Activity七. 中级控件前言 最近在有在持续学习Java的安卓开发,不断的把知识记录下。 工具 Android Studio安装 [Studio安装][1] [1]: https…...

【redis】AOF日志:宕机了,Redis如何避免数据丢失
专题3-AOF日志:宕机了,Redis如何避免数据丢失 因为redis的数据是存在内存中的,一旦服务器宕机,内存中的数据会全部丢失。 AOF:redis先执行命令,把数据写入内存,然后才记录日志。 AOF优点&…...

第三章Vue中的Ajax
文章目录Vue脚手架配置代理为什么要配置代理服务器什么是跨域?代理跨域CORS跨域利用Vue-CLI配置代理服务器GitHub用户搜索案例本案例需要下载axios库: npm install axiosVue脚手架配置代理 为什么要配置代理服务器 什么是跨域? 跨域资源共…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...

Spring是如何实现无代理对象的循环依赖
无代理对象的循环依赖 什么是循环依赖解决方案实现方式测试验证 引入代理对象的影响创建代理对象问题分析 源码见:mini-spring 什么是循环依赖 循环依赖是指在对象创建过程中,两个或多个对象相互依赖,导致创建过程陷入死循环。以下通过一个简…...