【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://www.mzph.cn/web/2650.shtml

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

相关文章

Nacos采坑:非集群Nacos不要使用同一个MySQL数据库

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Nacos 致力于帮助您…

【Linux】使用Jenkins + svn + springboot自动构建jar包并自动打包在服务器上运行

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

面包屑新玩法,ReactRouter+Ant Design实现动态渲染

在Ant Design中,可以通过Breadcrumb组件结合react-router库实现动态生成面包屑导航。具体步骤如下: 定义路由配置数据结构 我们需要在路由配置中添加额外的面包屑相关信息,例如面包屑标题、icon等。例如: const routes [{path: /,breadcrumbName: 首页},{path: /users,brea…

remote: HTTP Basic: Access deniedfatal: Authentication failed for

$ git push -u origin main remote: HTTP Basic: Access denied fatal: Authentication failed for https://gitcode.com/edenl/GD32E350_hid_keyboard.git/ 使用访问令牌做为密码登录即可。

拼多多面试题——力扣版测试用例纠错

最近我看到力扣上这个题目&#xff0c;用了三种方法&#xff0c;结果没有一种正确&#xff0c;我就纳闷儿了&#xff0c;为何总有一个测试用例过不了&#xff0c;结果我发现这个测试用例确实有问题啊。。。。。 题目&#xff1a; 表&#xff1a;Logs ----------------------…

LeetCode_链表的回文结构

✨✨所属专栏&#xff1a;LeetCode刷题专栏✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 题目描述&#xff1a; 对于一个链表&#xff0c;请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法&#xff0c;判断其是否为回文结构。给定一个链表的头指针A&#xff0c;请返回一个bo…

JS----前端不同格式的 UUID生成

前端 UUID生成 export const generateUUID () > {let timestamp new Date().getTime()let performanceNow (typeof performance ! undefined && performance.now && performance.now() * 1000) || 0return xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx.replac…

基于智能推荐的校园兼职招聘平台

3协同过滤算法简介 目前&#xff0c;推荐算法有很多种&#xff0c;可以应用于日常生活的许多领域&#xff0c;对大量数据进行处理和分析&#xff0c;然后进行分类。它将显示用户可能感兴趣的内容&#xff0c;这是推荐算法的主要功能之一[1]。 协同过滤算法通常包括两类&#…

详解数据结构:栈

一、顺序栈 顺序栈的存储方式如下&#xff1a; 从图中可以看出&#xff0c;顺序栈需要两个指针&#xff0c;base指向栈底&#xff0c;top指向栈顶。 typedef struct SqStack {ElemType *base; //栈底指针ElemType *top; //栈顶指针}SqStack; 说明&#xff1a; ElemType是元…

【智能算法】水循环算法(WCA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2012年&#xff0c;H Eskandar等人受到自然水循环过程启发&#xff0c;提出了水循环算法&#xff08;Water Cycle Algorithm, WCA&#xff09;。 2.算法原理 2.1算法思想 WCA模拟了大自然水循环过…

稳态视觉诱发电位 (SSVEP) 分类学习系列 (1) :FFT-CNN-CCA

稳态视觉诱发电位分类学习系列:FFT-CNN-CCA 0. 引言1. 主要贡献2. 提出的方法2.1 数据处理2.2 卷积神经网络的结构 3. 结果3.1 健康参与者结果比较3.2 卒中患者结果比较 4. 总结欢迎来稿 论文地址&#xff1a;https://ieeexplore.ieee.org/document/8708243 论文题目&#xff1…

日志分析简单总结

1、分析日志的目的 误报&#xff1a;不是攻击而上报成攻击 漏报&#xff1a;是攻击而没有防御的情况 日志分析可以判断是否误判或者漏判&#xff0c;可以溯源攻击行为 在护网作为防守方必备的技能&#xff08;分析NGAF和态势感知&#xff0c;发现异常&#xff09; 2、攻击出现…

探索比特币符文热:市场趋势与持续性分析

在加密货币世界中&#xff0c;比特币一直是备受关注的焦点之一。然而&#xff0c;近年来&#xff0c;随着DeFi&#xff08;去中心化金融&#xff09;的兴起&#xff0c;一种新的潮流开始崭露头角——比特币符文。本文将探讨比特币符文的兴起&#xff0c;分析市场趋势&#xff0…

iOS 17上如何恢复数据?iOS 17 数据恢复软件

“您好&#xff0c;我正在为我的 iPhone 寻找一款iOS 17 数据恢复软件。升级到 iOS 17 后&#xff0c;我丢失了 iPhone 上的所有照片、联系人和消息。有什么建议吗&#xff1f;” ——丹尼 iOS 17数据恢复软件下载 升级到iOS 17后如何恢复丢失的数据&#xff1f;由于在 iPhone…

聊聊 Linux iowait

哈喽大家好&#xff0c;我是咸鱼。 我们在使用 top 命令来查看 Linux 系统整体 CPU 使用情况的时候&#xff0c;往往看的是下面这一列&#xff1a; %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 68.0 wa, 0.0 hi, 0.0 si, 0.0 st其中&#xff0c;man 手册解释 wa 表示 …

异地组网、内部网络需求同时满足,贝锐企业路由器G300开箱体验

由于公司最近新增了办事处&#xff0c;作为IT管理员的我不仅需要搞定办事处的网络&#xff0c;还需要解决远程访问公司内部办公系统以及文件存储服务器的问题。 在此之前&#xff0c;只有少量人员出差时&#xff0c;我们采用了虚拟专网方案来进行远程访问。然而&#xff0c;新…

深度学习基础之《TensorFlow框架(15)—神经网络》

一、神经网络基础 1、什么是神经网络 人工神经网络&#xff08;Artificial Neural Network&#xff0c;简写为ANN&#xff09;。也简称为神经网络&#xff08;NN&#xff09; 是一种模仿生物神经网络&#xff08;动物的中枢神经系统&#xff0c;特别是大脑&#xff09;结构和功…

电脑虚拟机有免费的吗?常见的虚拟机工具软件有哪些?Parallels Desktop19最新版本好用吗

PD虚拟机&#xff0c;即Parallels Desktop&#xff0c;是一款专为Mac用户设计的虚拟机软件&#xff0c;由Parallels公司开发&#xff0c;它允许用户在Mac操作系统上无缝运行Windows、Linux以及其他操作系统&#xff0c;并在这些系统中安装程序或者游戏&#xff0c;无需重启即可…

MySQL权限管理大揭秘:用户、组、权限解析

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 MySQL权限管理大揭秘&#xff1a;用户、组、权限解析 前言用户和组的概念用户和组的概念创建和管理用户创建和管理角色 权限的类型和分配MySQL中的权限类型分配不同类型的权限给用户和组 权限验证与日…

Unity系统学习笔记

文章目录 1.基础组件的认识1.0.组件继承关系图1.1.项目工程文件结构&#xff0c;各个文件夹都是做什么的&#xff1f;1.2.物体变化组件1.2.3.三维向量表示方向1.2.4.移动物体位置附录&#xff1a;使用变换组件实现物体WASD移动 1.3.游戏物体和组件的显示和禁用1.3.1.界面上的操…