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

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.堆的特点:

  1. 完全二叉树:堆是一种完全二叉树,即除了最后一层节点可以不满外,其它层节点都必须满足。
  2. 有序性:堆中的每个节点都比其子节点大或小(具体取决于堆的类型),满足堆的有序性。
  3. 快速插入和删除:由于堆的特殊结构,可以在O(log n)的时间复杂度内进行插入和删除操作。

C++中有两种类型的堆:最大堆(Max Heap)和最小堆(Min Heap)。最大堆的每个节点都比其子节点大,而最小堆的每个节点都比其子节点小。通常使用头文件中的priority_queue类来实现堆。

priority_queue类特点:

  • 自动排序:priority_queue会自动按照元素的大小进行排序,因此每次取出的元素都是当前最大(或最小)的元素。
  • 高效的插入和删除操作:priority_queue使用堆的数据结构,插入和删除元素的时间复杂度为O(log
    n),其中n是容器中的元素数量。
  • 支持随机访问:虽然priority_queue本身不支持随机访问,但是可以通过其底层的容器(默认是vector)来实现随机访问。

2.使用场景:

  1. 找到数组或序列中的第K大或第K小元素;
  2. 求一组数据的中位数;
  3. 排序算法,如堆排序、选择排序等;
  4. 优先队列,如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&#xff08;堆Heap&#xff09;简介1.堆的特点&#xff1a;2.使用场景&#xff1a;二.成员函数1.构造函数&#xff1a;priority_queue构造函数方式&#xff1a;2.push()函数&#xff1a;向priority_queue中插入一个元素&#xff1a;3.pop()…...

miniprogram-to-uniapp使用指南(各种小程序项目转换为uni-app项目)

小程序分类&#xff1a;uni-app qq小程序 支付宝小程序 百度小程序 钉钉小程序 微信小程序 小程序转成uni_app 小程序转为uni_app 小程序转uni_app 小程序转换 工具现在支持npm全局库、HBuilderX插件两种方式使用&#xff0c;任君选择&#xff0c;HBuilderX插件地址&#xff1a…...

BZOJ2720: [Violet 5]列队春游 【概率与期望】

题意自行理解,先讲一下概率和期望怎么算 概率 概率准确的定义自行百度&#xff0c;这里就不赘述了 概率的计算其实很简单&#xff0c;就是将符合条件的情况除以总共的情况 下面以掷骰子为例&#xff1a; 问题&#xff1a;将一个骰子掷出&#xff0c;666朝上的概率是多少 …...

脉诊之脉象——平脉,常见病脉,七绝脉

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

第05章_存储引擎

第05章_存储引擎 &#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前在某…...

【新2023Q2押题JAVA】华为OD机试 - 挑选字符串

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:挑选字符串 题目 给定a-z,…...

职场「OKR」,魔幻又内卷

个人习惯称之为【O-KR-KPI】组合&#xff1b; 01从进厂实习那天开始&#xff0c;就接触了KPI的概念&#xff1b; 互联网公司&#xff0c;年初入职&#xff0c;可能因为那天是周五&#xff0c;又赶上月底&#xff0c;少不了要把KPI搬出来折腾一番&#xff1b; 天时&#xff0c…...

mysql8计算商家距离,按照由近及远排序

要计算商家距离并按照距离排序&#xff0c;可以使用MySQL 8中的空间函数和索引。以下是一个例子&#xff1a; 创建商家表 CREATE TABLE merchants (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50),location POINT,SPATIAL INDEX (location) ) EngineInnoDB;插入商家数据…...

c语言函数使用记录

1.sscanf函数的用法sscanf()&#xff1a;将 C 语言字符串中数据按 指定的格式 将数据存储在对应的参数中。// sscanf() 会从 buffer 里读进数据&#xff0c;依照 format 的格式将数据写入到 argument 里&#xff0c; //注意这里的 argument 需要使用地址符号 // 转换格式参考 s…...

VBA智慧办公4——符号运算及语法结构

目录 运算符 一、算术运算符 二、连接运算符 三、比较运算符 四、逻辑运算符 语法结构 一、if语句 二、select case语句 三、for语句 四、while语句&#xff1a; 五、with语句 运算符 VBA中运算符的作用也是相当重要&#xff0c;本章我们要着重了解VBA中运算符下设的…...

ChatGPT角色扮演提示语

ChatGPT角色扮演提示语 使用ChatGPT角色扮演提示语&#xff0c;你可以将GPT调教成各种专业角色&#xff0c;因此你也会获得更好的对话体验&#xff0c;学会调教GPT&#xff0c;你就会发现GPT实际上非常的强大。此处会长期更新GPT角色提示词&#xff0c;方便各位学习使用GPT… …...

【Java面试题】设计模式之七种结构性模式——代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式

目录 一、代理模式 二、适配器模式 三、桥接模式 四、装饰模式 五、外观模式 六、享元模式 七、组合模式 一、代理模式 概念: 代理模式是为其他对象提供一种以代理控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合或者不能直接引用另一个对象&#xff0…...

【从零开始学习 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 的数据可视化库&#xff0c;它能够轻松创建各种类型的图表和图形&#xff1b;Matplotlib 可以在 Jupyter Notebooks、交互式应用程序和脚本中使用&#xff0c;并支持多种绘图样式和格式&#xff1b; Matplotlib 最初是为科学计算而设计的&#xff0c…...

3.24-3.26学习总结

目录 一.方法methed 二.构造方法&#xff08;构造器&#xff09; 三.方法重载 四.方法覆写 一.方法methed 1.定义&#xff1a; 修饰符 方法返回类型 方法名(参数列表&#xff09;{ 系列语句&#xff1b; return 返回值&#xff1b; } 2.public方法/字段&#xff1a; 公开给…...

OpenAI Translator 基于 ChatGPT API 的划词翻译工具

OpenAI Translator&#xff0c;一款基于 ChatGPT API 的划词翻译浏览器插件和跨平台桌面端应用&#xff0c;使用 ChatGPT API 进行划词翻译和文本润色&#xff0c;借助了 ChatGPT 强大的翻译能力&#xff0c;帮助用户更流畅地阅读外语和编辑外语&#xff0c;允许跨 55 种不同语…...

git常用指令---复习向

git常见的指令&#xff1a; 本地仓库 1.创建仓库&#xff1a; git init 会出现.git文件夹 2.查看git状态&#xff1a;git status 3.添加一个文件&#xff1a; git add <fileName> 4.添加所有文件&#xff1a;git add . 5.提交并附加信息&#xff1a;git commit -m&…...

安卓开发学习记录(持续学习)

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

【redis】AOF日志:宕机了,Redis如何避免数据丢失

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

第三章Vue中的Ajax

文章目录Vue脚手架配置代理为什么要配置代理服务器什么是跨域&#xff1f;代理跨域CORS跨域利用Vue-CLI配置代理服务器GitHub用户搜索案例本案例需要下载axios库&#xff1a; npm install axiosVue脚手架配置代理 为什么要配置代理服务器 什么是跨域&#xff1f; 跨域资源共…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...