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

优先队列全面讲解

主题:

优先队列是一种非常有用的数据结构,它让你能够管理一组数据,使得每次访问或移除数据时,总是得到当前集合中优先级最高(或最低)的那个元素。这个特性让优先队列非常适用于需要快速访问集合中最重要元素的场景,例如任务调度、路径寻找等。

优先队列的特点

优先队列与普通队列的主要区别在于,优先队列中的元素排序并不是按照进入队列的顺序,而是按照元素的优先级排序的。这意味着元素的入队和出队顺序可能完全不同。

在C++中,优先队列是通过标准库中的priority_queue模板类提供的。它是一个容器适配器,其底层通常由堆(heap)数据结构实现,以支持快速的访问(O(1)时间复杂度)当前拥有最高优先级的元素,以及添加和移除元素都是O(log n)的时间复杂度。

如何定义一个优先队列

在C++中定义一个优先队列的基本语法如下:

#include <queue>
using namespace std;// 定义一个默认的最大优先队列
priority_queue<int> myMaxPQ;// 定义一个最小优先队列
priority_queue<int, vector<int>, greater<int>> myMinPQ;

这里,priority_queue<int>意味着创建了一个优先队列,其中的元素类型为int,并且默认情况下,数值大的元素优先级更高,也就是所谓的最大优先队列。

为了创建一个最小优先队列,即优先级最低的元素(即数值最小的元素)总是排在队列前面,我们需要传入两个额外的参数:底层容器类型(这里使用vector<int>)和元素比较方式,即使用greater<int>比较函数。

基本操作

优先队列的基本操作包括元素的入队(push)、访问队首元素(top)和出队(pop)。

入队

入队操作将新元素添加到优先队列中,并自动根据其优先级调整位置。

myMaxPQ.push(10);
myMaxPQ.push(5);
myMaxPQ.push(20);

访问队首元素

top 方法可以访问当前优先级最高的元素,但不会移除它。

cout << "最高优先级的元素:" << myMaxPQ.top() << endl; // 输出 20

出队

pop 方法移除当前优先级最高的元素。

myMaxPQ.pop();
std::cout << "现在最高优先级的元素:" << myMaxPQ.top() << std::endl; // 输出 10

优先队列的应用示例

优先队列可以用于多种场合,例如任务调度、Dijkstra最短路径算法等。以下是一个简单的示例:

// ToDo任务管理器
std::priority_queue<int> tasks;
tasks.push(3); // 低优先级任务
tasks.push(1); // 高优先级任务
tasks.push(4); // 低优先级任务
tasks.push(2); // 中优先级任务while (!tasks.empty()) {std::cout << "执行任务优先级:" << tasks.top() << std::endl;tasks.pop();
}

这段代码创建了一个任务管理器,其中包含了不同优先级的任务。通过不断的出队操作,我们可以按优先级顺序执行任务。

结语

希望这篇博客能帮助你全面了解优先队列的概念、用法和实际应用。如果你还有更多疑问,欢迎随时提问!

http://www.lryc.cn/news/346563.html

相关文章:

  • 即插即用篇 | YOLOv8 引入多光谱通道注意力 | 频率领域中的通道注意力网络
  • Topaz Video AI 5.0.3激活版 AI视频无损缩放增强
  • ppt通过修改幻灯片母版修改页脚
  • 【数组算法】598. 区间加法
  • Java | Leetcode Java题解之第68题文本左右对齐
  • Windows安装MySQL 8.4.0免安装版
  • 初识java--javaSE(3)--方法,递归,数组,
  • AWS ECS Fargate: 如何获取正在运行的服务
  • Rust 常用 Web 开源代码库
  • 零代码平台助力中国石化江苏油田实现高效评价体系
  • [优选算法]------滑动窗⼝——209. 长度最小的子数组
  • 简述a标签target属性的取值和作用
  • uniapp管理后台编写,基于uniadmin和vue3实现uniapp小程序的管理后台
  • FFmpeg常用API与示例(四)——过滤器实战
  • 解决springboot项目的网站静态页面显示不全问题
  • 表面的相似,本质的不同
  • 问题:幂等性 分布式session
  • Golang | Leetcode Golang题解之第66题加一
  • c++ STL 之栈—— stack 详解
  • 鸿蒙开发接口Ability框架:【(窗口扩展能力)】
  • AutoCAD中密集的填充打散后消失的问题
  • 基于Matplotlib的模型性能可视化工作
  • KAN网络最全解析——比肩MLP和Transformer?
  • ASP.NET学生信息管理系统
  • 图片改大小尺寸怎么改?几招教你搞定图片修改
  • Scala编程入门:从零开始的完整教程
  • Proxmox VE 8 SDN创建VLAN隔离用户网络
  • API低代码平台介绍3-异构数据源的数据查询功能
  • 【Linux】-网络请求和下载、端口[6]
  • Github2024-05-10开日报 Top10