【C++】优先队列

优先队结构的不同物理结构与常用操作算法

优先队列是一种特殊的队列,队列中的元素具有优先级,每次弹出操作会弹出优先级最高的元素。

优先队列常用的物理结构有:

1. 数组:简单但不高效,插入和删除操作需要移动大量元素,时间复杂度高。

2. 二叉堆:是一种完全二叉树,通常用数组表示。插入和删除操作时间复杂度为O(logn)

3. 二叉搜索树:节点值大于左子树所有节点,小于右子树所有节点。插入和删除操作时间复杂度取决于树的高度,平衡二叉搜索树时间复杂度为O(logn)

常用操作设计:

1. 插入元素:将新元素插入到合适的位置,维持堆的性质。

2. 删除最大/最小元素:删除根节点元素,并调整堆的结构。

3. 获取最大/最小元素:直接返回堆顶元素。

4. 堆大小:返回堆中的元素个数。

5. 堆空:判断堆是否为空。

使用数组结构实现最小堆的代码:

#include <iostream>using namespace std;template <typename T>
class PriorityQueue
{
private:T *arr;int capacity;int size;public:PriorityQueue(int cap)  //创造队列{capacity = cap;size = 0;arr = new T[cap];}int getSize(){return size;}bool isEmpty(){return size == 0;}void insert(T elem){if (size == capacity){return;}size++;arr[size - 1] = elem;int i = size - 1;while (i > 0 && arr[i] < arr[(i - 1) / 2]){swap(arr[i], arr[(i - 1) / 2]);i = (i - 1) / 2;}}T getMin() // 返回最小值{return arr[0];}T extractMin() // 提取最小值{if (isEmpty()){return -1;}T root = arr[0];arr[0] = arr[size - 1];size--;int i = 0;while (2 * i + 1 < size){int leftChild = 2 * i + 1;int rightChild = 2 * i + 2;if (rightChild < size && arr[leftChild] > arr[rightChild]){leftChild = rightChild;}if (arr[i] <= arr[leftChild]){break;}swap(arr[i], arr[leftChild]);i = leftChild;}return root;}bool find(T elem)  //查找{for (int i = 0; i < size; i++){if (arr[i] == elem){return true;}}return false;}void deleteElem(T elem)  //删除队列元素{if (isEmpty() || !find(elem)){return;}int i;for (i = 0; i < size; i++){if (arr[i] == elem){break;}}arr[i] = arr[size - 1];size--;while (i < size && arr[i] < arr[(i - 1) / 2]){swap(arr[i], arr[(i - 1) / 2]);i = (i - 1) / 2;}while (2 * i + 1 < size){int leftChild = 2 * i + 1;int rightChild = 2 * i + 2;if (rightChild < size && arr[leftChild] > arr[rightChild]){leftChild = rightChild;}if (arr[i] <= arr[leftChild]){break;}swap(arr[i], arr[leftChild]);i = leftChild;}}
};int main()
{PriorityQueue<int> pq(5);pq.insert(3);pq.insert(1);pq.insert(4);cout << pq.getMin() << endl;cout << pq.extractMin() << endl;cout << pq.getSize() << endl;pq.deleteElem(4);cout << pq.find(4) << endl;return 0;
}

运行结果截图:

最小堆和最大堆只有比较函数不同。最小堆使用 < 比较,最大堆使用 > 比较。所以要将最小堆修改为最大堆,只需要修改比较函数即可。这里对应的修改代码为:

T getMax() // 返回最大值 
{ return arr[0]; 
}T extractMax() // 提取最大值
{ if (isEmpty()) { return -1; } T root = arr[0]; arr[0] = arr[size - 1]; size--; int i = 0; while (2 * i + 1 < size) { int leftChild = 2 * i + 1; int rightChild = 2 * i + 2; if (rightChild < size && arr[leftChild] < arr[rightChild]) { leftChild = rightChild; }if (arr[i] >= arr[leftChild]) { break; } swap(arr[i], arr[leftChild]); i = leftChild; } return root; 
}

可以看到,这里把 < 改为 > ,将 getMin() 改为 getMax(),将 extractMin() 改为 extractMax()。这样,堆中最大的值会在堆顶,所以这就是一个最大堆了。

总结

优先队列是一种抽象数据结构,定义了插入、删除和获取最大/最小元素等操作。堆是一种具体的数据结构,可以用来实现优先队列。堆是一个近似完全二叉树,并且满足堆序性质:父节点的值总是大于(或小于)子节点的值。

二叉堆是一种特殊的堆,完全二叉树,通常用数组表示。二叉堆很适合实现优先队列,时间复杂度为O(logn) 。优先队列强调数据元素的优先级与排序,堆提供了一种数据结构来高效实现这一功能。

参考文献

[1]张铭,王腾蛟,赵海燕编著,《数据结构与算法》,高等教育出版社,2008.6

[2] (美) 乔兹德克(Drozdek, A.) 著 徐丹,吴伟敏 译  C++数据结构与算法(第4版)(国外计算机科学经典教材)清华大学出版社2014-10-01

[3] (美)萨尼 著,王立柱,刘志红 译,数据结构、算法与应用 C++语言描述(原书第2版)机械工业出版社,2015-04-01

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2980772.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

新技术前沿-2024-大型语言模型LLM的本地化部署

参考快速入门LLM 参考究竟什么是神经网络 1 深度学习 1.1 神经网络和深度学习 神经网络是一种模拟人脑神经元工作方式的机器学习算法,也是深度学习算法的基本构成块。神经网络由多个相互连接的节点(也称为神经元或人工神经元)组成,这些节点被组织成层次结构。通过训练,…

Keil和VSCode协同开发STM32程序

系列文章 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 配置环境 2. 测试打开工程 3. 测试编译工程 随着项目的复杂度上升&#xff0c;开发者不仅需要强大的硬件支持&#xff0c;还需要一个高效和灵活的开发环境。 vscode是一款集成大量可以便携开发插件的代码…

Redis入门到通关之Redis数据结构-List篇

文章目录 ☃️概述☃️数据结构☃️源码☃️其他 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端…

FSRCNN:加速超分辨率卷积神经网络,SRCNN的加速版

paper&#xff1a;https://arxiv.org/pdf/1608.00367 code: https://github.com/yjn870/FSRCNN-pytorch/tree/master 目录 1. 动机 2. 方法 3. 代码对比 4. 实验结果 1. 动机 作者此前提出的SRCNN证明了CNN在图像超分领域的有效性。然而&#xff0c;SRCNN计算效率较低&#…

《Beginning C++20 From Novice to Professional》第五章 Arrays and Loops

循环和数组确实是联系比较紧密的两个基础语法&#xff0c;数组让我们管理大量同类对象&#xff0c;循环可以简单地遍历一个范围内的元素 本章我们可以学到&#xff1a; Arrays 数组开辟一段连续空间存储同类元素&#xff0c;我们通过【】下标来访问某个元素 如果无符号整型占…

javascript(第三篇)原型、原型链、继承问题,使用 es5、es6实现继承,一网打尽所有面试题

没错这是一道【去哪儿】的面试题目&#xff0c;手写一个 es5 的继承&#xff0c;我又没有回答上来&#xff0c;很惭愧&#xff0c;我就只知道 es5 中可以使用原型链实现继承&#xff0c;但是代码一行也写不出来。 关于 js 的继承&#xff0c;是在面试中除了【 this 指针、命名提…

Python网络爬虫-详解XPath匹配网页数据

前言 XPath&#xff0c;全称XML Path Language&#xff0c;即XML路径语言&#xff0c;它是一门在XML文档中查找信息的语言。XPath使用路径表达式来选取XML文档中的节点或节点集。这些节点是通过沿着路径&#xff08;path&#xff09;或者步&#xff08;steps&#xff09;来选取…

Linux下的UDEV机制/守护进程

一. Udev机制概念引入 ( 需要在 etc/udev/rules.d/ 下创建设备的相关规则&#xff0c;不然有可能udev机制生成的设备文件不具备可读可写的权限&#xff0c;adb无法成功通过该设备文件访问设备 ) a. 创建文件夹 sudo vim Xiaomi-audroid.rules b. 添加规则 …

tiktok如何影响用户行为的分析兼论快速数据分析的策略

tiktok如何影响用户行为的分析 快速数据分析的策略流程&#xff1a; 1.确定指标变量&#xff0c;也就确定了数据分析想要回答的问题。想回答不同的问题&#xff0c;就选择不同的指标变量。 变量筛选方法选出指标变量相关的变量&#xff1b; 针对筛选出的变量进行描述性分析和因…

Linux系统安全:从面临的攻击和风险到安全加固、安全维护策略(文末有福利)

1. Linux面临的攻击与风险 1.1. Linux系统架构 Linux系统架构解读&#xff1a; 用户之间隔离内核态与用户态之间隔离用户进程一般以低权限用户运行系统服务一般以特权服务运行用户态通过系统调用进入内核态内核对系统资源进行管理和分配 1.2. Linux系统常见安全威胁 1.2.1.…

Swift-27-类的初始化与销毁

Swift的初始化是一个有大量规则的固定过程。初始化是设置类型实例的操作&#xff0c;包括给每个存储属性初始值&#xff0c;以及一些其他准备工作。完成这个过程后&#xff0c;实例就可以使用了。 简单来讲就是类的构造函数&#xff0c;基本语法如下&#xff1a; 注意&#xff…

【webrtc】Chrome和Firefox在SDP协商过程中,针对localhost的不同处理

内网下chrome端webrtc协商失败 现象 我有一个webrtc服务器在局域网内&#xff0c;使用chrome浏览器访问时&#xff0c;发现webrtc在做媒体协商时失败。 具体表现是&#xff0c;在交换sdp后&#xff0c;ice的状态是oniceconnectionstatechange: failed 但是换成Firefox浏览器…

计算机网络相关知识总结

一、概述 计算机网络可以极大扩展计算机系统的功能机器应用范围&#xff0c;提高可靠性&#xff0c;在为用户提供放方便的同时&#xff0c;减少了整体系统费用&#xff0c;提高性价比。 计算机网络的功能主要有&#xff1a;1. 数据共享&#xff1b;2. 资源共享&#xff1b;3. 管…

前端实现将二进制文件流,并下载为excel文件

目录 一、关于二进制流二、项目实践三、常见问题及解决 一、关于二进制流 含义&#xff1a;二进制流是一种计算机文件格式&#xff0c;它的数据以二进制形式存储&#xff0c;与文本文件不同。 二进制文件可以包含任意类型的数据&#xff0c;例如&#xff1a;图像、音频、视频…

Prompt Engineering,提示工程

什么是提示工程&#xff1f; 提示工程也叫【指令工程】。 Prompt发送给大模型的指令。比如[讲个笑话]、[用Python编个贪吃蛇游戏]、[给男/女朋友写情书]等看起来简单&#xff0c;但上手简单精通难 [Propmpt]是AGI时代的[编程语言][Propmpt]是AGI时代的[软件工程][提示工程]是…

Pytorch常用的函数(八)常见优化器SGD,Adagrad,RMSprop,Adam,AdamW总结

Pytorch常用的函数(八)常见优化器SGD,Adagrad,RMSprop,Adam,AdamW总结 在深度学习中&#xff0c;优化器的目标是通过调整模型的参数&#xff0c;最小化&#xff08;或最大化&#xff09;一个损失函数。 优化器使用梯度下降等迭代方法来更新模型的参数&#xff0c;以使损失函数…

C#仿QQ抽屉式窗体的设计方法:创建特殊窗体

目录 1.WindowFromPoint函数 2.GetParent函数 3.实例 &#xff08;1&#xff09; 图片集合编辑器 &#xff08;2&#xff09;Form1.Designer.cs &#xff08;3&#xff09;Form1.cs 4.生成效果 QQ软件对于绝大多数的人来说再熟悉不过了&#xff0c;它以使用方便、界面美…

MySQL创建数据库与表

要求&#xff1a; 1.在本机安装数据库 2.创建一个数据库db_classes 3.创建一行表db_hero 4.将四大名著中的常见人物插入这个英雄表 目录 要求&#xff1a; 过程&#xff1a; 结果&#xff1a; 命令总结&#xff1a; 过程&#xff1a; 1.安装数据库 http://t.csdnimg…

【软件工程】【第一章概述】d1

关键字&#xff1a; 什么是软件、软件危机、软件工程定义、软件生命周期、软件过程、瀑布模型

设计模式学习笔记 - 开源实战四(中):剖析Spring框架中用来支持扩展的设计模式

概述 上篇文章&#xff0c;学习了 Spring 框架背后蕴含的设计思想&#xff0c;比如约定优于配置、低侵入松耦合、模块化轻量级等等。这些设计思想可以借鉴到其他框架开发中&#xff0c;在大的设计层面提高框架的代码质量。 除了上篇文章降到的设计思想&#xff0c;实际上&…