前引: 在算法竞赛中,选手们常常能在0.01秒内分出胜负;在实时交易系统中,毫秒级的延迟可能意味着数百万的盈亏;在高并发服务器中,每秒需要处理数万条不同优先级的请求——这些系统背后,都隐藏着同一种强大的数据结构:​优先队列(priority_queue)​作为C++标准库中最优雅的数据结构适配器,priority_queue完美封装了堆算法的高效性,却只需几行代码即可实现复杂优先级管理。本文将深入剖析:

(1)​堆原理与优先队列的机械美学​

(2)定制化优先级策略的高级技巧​

(3)实战性能对比与编译器级优化​

(4)在万亿级数据处理中的独特优势

目录

优先队列介绍

优先队列的渊源

实例化

插入元素

访问元素

获取元素个数

判断优先队列是否为空

删除堆顶元素

·

优先队列的模拟实现

类模板

插入元素

访问元素

获取元素个数

判断优先队列是否为空

删除堆顶元素

效果展示


优先队列介绍

优先队列priority_queue 是 C++ 标准模板库(STL)中的一个容器适配器,提供了堆数据结构的实现(默认为最大堆)。它在需要高效访问最大/最小元素的场景下非常有用!

如果需要使用小顶堆,可以这样传参 priority_queue< int , vector<int> , greater<int> > 

它是默认基于(大顶)堆实现的,例如一颗用数组存储的完全二叉树:

特点总结:

(1)采用数组形式存储

(2)默认基于最大堆实现

(3)适配器容器底层为 vector (使用需要包含#include<queue>) 

(4)每次只能访问队列顶部的元素,即优先级最高的元素

(5)复杂度:访问O(1)、插入O(log n)、删除顶部元素O(log n)

优先队列的渊源

我们通过 优先队列 的容器结构应该猜到,它的底层容器是 vector ,为什么不取名叫优先维克托呢

问:为什么底层容器是vector?

连续内存结构适合堆的随机访问需求,缓存友好,且动态数组支持高效尾部操作

问:为什么头文件是queue?

作为容器适配器,优先队列在概念上属于队列的一种,与queue共用同一头文件,体现了接口的一致性,比如队列的各种接口刚好吻合它的访问、插入、删除行为:

priority_queue --> "<queue>头文件" : 声明接口

问:为什么叫优先队列而不是优先维克托?

名称语义分解​:

优先(Priority):元素按内在重要性排序,而非插入顺序

队列(Queue):仅允许特定端点访问的操作模型(队尾插入,队首访问)

​行为本质​:

插入操作:push(),时间复杂度 O(log n)

访问操作:top(),总是获取优先级最高的元素

删除操作:pop(),移除当前最高优先级元素

实例化

采用:priority_queue<数据类型> 变量名;

我们可以选择默认初始化:

priority_queue<int> V1;

也可以选择范围初始化:

priority_queue<int> V2(arr,arr+n);
//或者用另一个容器去初始化
priority_queue<int> V3(V1.begin(),V1.end());

效果展示: 

插入元素

V.push(val);

访问元素

遵循堆的性质,只能访问堆顶元素

V.top();

获取元素个数

V.size();

判断优先队列是否为空

V.empty();

为空返回 true ;不为空返回 false

删除堆顶元素

V.pop();

优先队列的模拟实现

类模板

template<class T, class contain = vector<T>>
class priority_queue
{
public://构造可以不写,因为可以直接使用vector//函数实现
private:contain x;
}

既然底层是 vector,我们用缺省参数直接实例化出一个 vector 类型的变量就可以作为底层实现了

插入元素

插入元素调用vector的接口就行了,这里由于需要满足优先队列的性质(大顶堆),我们还需要在插入之后使用向上调整,保证堆顶(首元素)是最大的

插入元素:

//插入数据
void push(const T& date)
{x.push_back(date);//向上调整Upgrade(size() - 1);
}

向上调整:

//向上调整
void Upgrade(int child)
{//父节点int parent = (child - 1) / 2;//如果孩子节点大于父节点,就向上调整交换(根节点可能也需要调整)while (parent >= 0){//只要进入循环,那么节点下标一定是在合法范围if (x[child] > x[parent]){//交换swap(x[child], x[parent]);//更新孩子、父节点child = parent;parent = (child - 1) / 2;}elsebreak;}
}

这样经过向上调整就可以达到下面的效果:

访问元素

访问第一个元素即可(堆顶元素)

//访问元素
T top()
{return x[0];
}

获取元素个数

//计算元素个数
T size()
{return x.size();
}

判断优先队列是否为空

//判断是否为空
bool empty()
{return x.empty();
}

删除堆顶元素

这里的删除调用 vector的尾删即可。

删除的方法:先交换堆顶 和 尾部元素,再删除,再使用向下调整保证大顶堆的性质

//删除堆顶元素
void pop()
{Eliminate(size() - 1);
}

向下调整: 

//向下调整
void Eliminate(int child)
{//交换堆顶和末尾元素swap(x[child], x[0]);//去尾x.pop_back();//父子节点int parent = 0;child = 2 * parent + 1;//开始调整(子节点不能超过范围)while (child < x.size()){//如果右节点大于左节点if (x[child] < x[child + 1]){child++;}//如果父节点小于子节点if (x[parent] < x[child]){swap(x[parent], x[child]);//更新parent = child;child = 2 * parent + 1;}elsebreak;}
}

效果展示

void text1_t()
{priority_queue<int> V1;//插入元素V1.push(10);V1.push(15);V1.push(5);V1.push(20);V1.push(0);V1.push(25);//元素个数cout << V1.size() << endl;//访问堆顶元素cout << V1.top() << endl;//出堆顶元素V1.pop();//访问堆顶元素cout << V1.top() << endl;//判断是否为空cout << V1.empty() << endl;
}

                                                   【雾非雾】期待与你的下次相遇! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87723.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87723.shtml
英文地址,请注明出处:http://en.pswp.cn/web/87723.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、Dify 私有部署、本地安装教程(LInux-openeuler)

官网&#xff1a;Dify AI Plans and Pricing 1.找到下载的位置。 2.可以切换文档为中午文档。 3.本次安装使用Docker Compose 安装&#xff0c;可以大致看一下文档描述的配置信息要求。 4.各个版本信息&#xff0c;本次下载1.5.1版本&#xff0c;你也可以选择安装其他版本。 …

GASVM+PSOSVM+CNN+PSOBPNN+BPNN轴承故障诊断

一、各算法基本原理与技术特点 1. GASVM&#xff08;遗传算法优化支持向量机&#xff09; 原理&#xff1a; 利用遗传算法&#xff08;GA&#xff09;优化SVM的超参数&#xff08;如惩罚因子 C C C 和核函数参数 g g g&#xff09;。遗传算法通过模拟自然选择机制&#xff…

Python实例练习---魔法方法

&#xff08;主页有对应知识点^V^&#xff09; 【练习要求】 针对知识点Python面向对象的魔法方法安排的本实例。要求实现&#xff1a;用__init__魔法方法定义书的长&#xff0c;宽&#xff0c;高&#xff0c;最后用__str__输出返回值 【重要步骤提示】 定义class书类 2、使…

【从0-1的CSS】第3篇:盒子模型与弹性布局

文章目录 盒子模型内容区content内边距padding边框border外边距margin元素的宽度高度box-sizing属性content-box&#xff1a;设置的width和height就是内容区的width和heightborder-box:设置的width和height是context padding border的width和height 弹性布局Flex容器的属性fl…

设置LInux环境变量的方法和区别_Ubuntu/Centos

Linux环境变量可以通过export实现&#xff0c;也可以通过修改几个文件来实现 1 通过文件设置LInux环境变量 首先是设置全局环境变量&#xff0c;对所有用户都会生效 /etc/profile&#xff1a;该文件为系统的每个用户设置环境信息&#xff0c;当用户登录时&#xff0c;该文件…

python缓存装饰器实现方案

写python的时候突然想着能不能用注解于是就写了个这个 文章目录 原始版改进点 原始版 import os import pickle import hashlib import inspect import functoolsdef _generate_cache_filename(func, *args, **kwargs):"""生成缓存文件名的内部函数""…

使用 java -jar xxxx.jar 运行 jar 包报错: no main manifest attribute

1、问题描述 在Linux服务器上本想运行一下自己写的一个JAR&#xff0c;但是报错了&#xff01; no main manifest attribute, in first-real-server-1.0-SNAPSHOT.jar 2、解决办法 在自己的Spring项目的启动类&#xff08;xxx.xxx.xxx.XXXXApplication&#xff09;所在的Mo…

信号与槽的总结

信号与槽的总结 QT中的信号与Linux的信号对比 1&#xff09;信号源 2&#xff09;信号的类型 3&#xff09;信号的处理方式 QT信号与Linux信号的深度对比分析 一、信号源对比 QT信号 用户定义信号 &#xff1a;由开发者通过 signals:关键字在QObject派生类中显式声明 cl…

Python Mitmproxy详解:从入门到实战

一、Mitmproxy简介 Mitmproxy是一款开源的交互式HTTPS代理工具&#xff0c;支持拦截、修改和重放HTTP/HTTPS流量。其核心优势在于&#xff1a; 多平台支持&#xff1a;兼容Windows、macOS、Linux三端工具&#xff1a;提供命令行(mitmproxy)、Web界面(mitmweb)、数据流处理(mi…

刷题笔记--串联所有单词的子串

题目&#xff1a;1、我的写法&#xff08;超时&#xff09;从题面自然想到先用回溯算法把words的全排列先算出来&#xff0c;然后遍历字符串s一次将符合条件的位置加入结果全排列计算所有可能字符串算法写法&#xff1a;这是一个模板用于所有全排列算法的情况&#xff0c;本质思…

操作系统【1】【硬件结构】【操作系统结构】

一、CPU如何执行程序&#xff1f; 提纲 图灵机工作方式冯诺依曼模型线路位宽CPU位宽程序执行基本过程执行具体过程 1. 图灵机工作方式 图灵机可以视作“一台带规则的自动草稿机” 图灵机基本组成&#xff1a; 纸带&#xff08;内存&#xff09;&#xff1a;连续格子组成&…

SQLite与MySQL:嵌入式与客户端-服务器数据库的权衡

SQLite与MySQL&#xff1a;嵌入式与客户端-服务器数据库的权衡 在开发应用程序时&#xff0c;数据库选择是一个至关重要的决策&#xff0c;它会影响应用的性能、可扩展性、部署难度和维护成本。SQLite和MySQL是两种广泛使用的关系型数据库管理系统&#xff0c;它们各自针对不同…

CppCon 2018 学习:Smart References

“强类型别名”&#xff08;strong typedefs&#xff09; 的动机和实现&#xff0c;配合一个简单例子说明&#xff1a; 动机&#xff08;Motivation&#xff09; 用 using filename_t string; 和 using url_t string; 来区分不同的字符串类型&#xff08;比如文件名和网址&…

高性能高准确度的CPU电压与温度监测软件HWInfo

&#x1f5a5;️ 一、软件概述 Windows版&#xff1a;图形化界面&#xff0c;支持实时监控&#xff08;温度、电压、风扇转速等&#xff09;、基准测试及报告生成&#xff0c;兼容Windows XP至Windows 11系统。Linux版&#xff1a;命令行工具&#xff0c;由openSUSE社区维护&a…

H3C WA6322 AP版本升级

1、查看当前版本&#xff1a;R2444P01 2、官网下载升级文件&#xff1a; WA6300系列版本说明H3C WA6300系列(适用于WA6330、 WA6322、WA6320H、WA6320、 WTU630H、WTU630、WA6330-LI、WA6320-C、WA6320-D、WA6320H-LI、WA6338、WA6322H、WTU632H-IOT、WAP922E、WAP923、WA6320…

用 YOLOv8 + DeepSORT 实现目标检测、追踪与速度估算

【导读】 目标检测与追踪技术是计算机视觉领域最热门的应用之一&#xff0c;广泛应用于自动驾驶、交通监控、安全防护等场景。今天我们将带你一步步实现一个完整的项目&#xff0c;使用YOLOv8 DeepSORT实现目标检测、追踪与速度估算。>>更多资讯可加入CV技术群获取了解…

Python实例题:基于 Python 的简单聊天机器人

Python实例题 题目 基于 Python 的简单聊天机器人 要求&#xff1a; 使用 Python 构建一个聊天机器人&#xff0c;支持以下功能&#xff1a; 基于规则的简单问答系统关键词匹配和意图识别上下文记忆功能支持多轮对话可扩展的知识库 使用tkinter构建图形用户界面。实现至少 …

相机:Camera原理讲解(使用OpenGL+QT开发三维CAD)

相机为三维场景提供了灵活便捷的视角变换和交互能力&#xff0c;通过相机操作可以实现全方位、各角度的场景浏览。 怎样在三维场景中引入相机&#xff0c;怎样处理和实现视角的放缩、移动、旋转&#xff1f;在视角旋转时以指定目标为中心又该怎样处理&#xff1f; 原文&#…

开源的虚拟电厂预测数据:资源、应用与挑战

引言 虚拟电厂(Virtual Power Plant, VPP)是一种通过聚合分布式能源资源(如太阳能、风能、储能系统、电动汽车和可控负荷)来优化电力系统运行的数字化能源管理平台。准确的预测数据是虚拟电厂高效运行的关键,而开源数据为研究者和企业提供了低成本、高透明度的解决方案。…

IDE全家桶专用快捷键----------个人独家分享!!

给大家分享一下我个人整理的快捷键&#xff0c;其中包含对电脑的操作&#xff0c;以及在编写代码时的操作&#x1f680;Window系列1 WindowsR 开启运行对话框--->输入cmd启动黑窗口​2 WindowsE 快速打开我的电脑 ​3 WindowsL 电脑锁屏 ​4 WindowsD 显示/恢复桌面 ​5 Win…