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

【优先队列介绍】

文章目录

  • 前言
  • 一、优先队列是什么?
  • 二、优先队列的实现
  • 三、C++实现优先队列
    • 1. 引入库
    • 2. 创建优先队列
      • 示例:大根堆
      • 输出:
      • 示例:小根堆
      • 输出:


前言

在数据结构中,队列(Queue)是一种先进先出(FIFO, First In First Out)的数据结构。除了普通的队列,还有一种变种叫做优先队列(Priority Queue)。与普通队列不同,优先队列是根据元素的优先级来决定出队顺序的,而不是根据元素入队的顺序。


一、优先队列是什么?

优先队列是一种特殊的队列,其中的每个元素都关联一个优先级。在优先队列中,元素的出队顺序是由其优先级决定的,而不是由入队的顺序决定的。具有更高优先级的元素会先被处理。

常见的优先队列应用场景:

  • 任务调度:操作系统中的任务调度系统通常会根据任务的优先级来决定任务的执行顺序。
  • 图算法:如Dijkstra算法中的优先队列,用于处理最短路径问题。
  • 事件驱动仿真系统:事件根据优先级进行排序和处理。

二、优先队列的实现

优先队列通常可以通过以下两种方式实现:

  1. 数组或链表:每次插入时按优先级排序,出队时直接删除最大优先级元素。
  2. :通过堆结构(如二叉堆)来实现,这种方法具有较高的效率。

在实际应用中,二叉堆是最常用的实现方式,因为它能在O(log n)时间内完成插入和删除操作。


三、C++实现优先队列

C++标准库中提供了一个priority_queue容器适配器,它基于堆(默认是大根堆)实现。可以直接使用它来构建优先队列。

1. 引入库

#include <iostream>
#include <queue>
#include <vector>

2. 创建优先队列

C++的priority_queue默认是一个大根堆,即优先级较高的元素会先出队。可以通过std::greater来实现小根堆,改变元素的优先级顺序。

示例:大根堆

#include <iostream>
#include <queue>
#include <vector>int main() {// 创建一个优先队列,默认是大根堆std::priority_queue<int> pq;// 向优先队列中插入元素pq.push(10);pq.push(20);pq.push(5);pq.push(15);// 打印并删除优先队列中的元素(按优先级出队)std::cout << "Priority Queue (Max-Heap):\n";while (!pq.empty()) {std::cout << pq.top() << " "; // 打印优先队列中的最大元素pq.pop(); // 删除最大元素}std::cout << std::endl;return 0;
}

输出:

Priority Queue (Max-Heap):
20 15 10 5

示例中,priority_queue<int>创建了一个默认的大根堆,每次pq.pop()都会删除当前队列中优先级最高的元素(即最大值)。

示例:小根堆

实现一个小根堆,即优先级低的元素先出队,可以通过std::greater来实现。

#include <iostream>
#include <queue>
#include <vector>int main() {// 创建一个优先队列,使用std::greater来构造小根堆std::priority_queue<int, std::vector<int>, std::greater<int>> pq;// 向优先队列中插入元素pq.push(10);pq.push(20);pq.push(5);pq.push(15);// 打印并删除优先队列中的元素(按优先级出队)std::cout << "Priority Queue (Min-Heap):\n";while (!pq.empty()) {std::cout << pq.top() << " "; // 打印优先队列中的最小元素pq.pop(); // 删除最小元素}std::cout << std::endl;return 0;
}

输出:

Priority Queue (Min-Heap):
5 10 15 20

通过使用std::greater<int>,将队列改为了小根堆,每次pq.pop()都会删除当前队列中优先级最低的元素(即最小值)。

http://www.dtcms.com/a/490177.html

相关文章:

  • 初识HTNL
  • 笔试强训(四)
  • 【深入浅出PyTorch】--7.2.PyTorch可视化2
  • 商城系统-自动化测试报告
  • 递归-面试题08.06.汉诺塔问题-力扣(LeetCode)
  • 珠海网站建设 骏域网站域名 空间 网站制作
  • AI视频生成工具完全指南:从Sora到开源替代方案全解析
  • 多模态大模型研究每日简报【2025-10-16】
  • Azure Workbooks 权限配置完整指南
  • 公司做网站需要哪些资料百度蜘蛛抓取网站模块
  • 后端定义两个实体参数,前端如何传值
  • **点云处理:发散创新,探索前沿技术**随着科技的飞速发展,点云处理技术在计算机视觉、自动驾驶、虚拟现实等领域的应用愈发广
  • HarmonyOS分布式硬件共享:调用手机摄像头的手表应用
  • 网站开发英语英语山东教育网站开发公司
  • 手表东莞网站建设技术支持网站搭建公司加盟
  • DevTunnel:免费安全穿透内网网页
  • el-input 输入框宽度自适应宽度
  • [嵌入式系统-126]:CUDA运行在CPU上,还是运行在GPU之上?
  • 启动模板创建AWS EC2 Auto Scaling指南
  • 【LeetCode_160】相交链表
  • HUAWEI A800I A2 aarch64架构服务器鲲鹏920开启虚拟化功能
  • Java-151 深入浅出 MongoDB 索引详解 性能优化:慢查询分析 索引调优 快速定位并解决慢查询
  • 微信小程序快速入门【02】
  • YOLO-V1 与 YOLO-V2 技术详解:从经典到优化的目标检测演进
  • 天津市网站制作公司百度seo点击器
  • 建设部网站燃气管理部门网络软件开发
  • 三种思路彻底掌握 BST 判断(递归与迭代全解析)——力扣98.验证二叉搜索树
  • 基于k8s环境的mongodb多副本高可用方案
  • 汽车免拆诊断案例 | 2014 款宝马 M4 车冷起动后发动机抖动
  • 横泉水库建设管理局网站鄂州网站建设哪家专业