deque和优先级队列

news2025/1/21 5:51:29

咱学完栈和队列之后,又了解到了vector和list,更深入的了解到了它们各自的优势,那么有没有可能结合它们的优点摒弃弱点呢,其实是有人这么试过的,不过咱还在学vector和list就证明他可能没成功,不过并不影响我们理解它。

deque

deque的结构大概是这样的,它外部是一个指针数组,一般称为中控数组,每个位置存一个指针,的地址,指针指向一块相同大小的空间。而他把指针又做了一些处理,first指向数据的起始位置,last指向数据的结束位置,cur指向当前数据位置,node则指向它在中控数组的位置,这样我们想访问某一个位置只需要 / 就可以知道它在中控数组哪个位置,再 % 就可以知道它的具体位置。

而插入数据则分为头插尾插,如果是尾插,那么我们的cur指向最后一个数据,如果它不等于last,那么代表没满,直接插入即可,如果满了就扩容。而头插,上图是满了的情况,实际情况是从最后开始往前插的,只要cur不等于first,那就可以一直插入。这也是为什么中控数组从中间开始逐渐往两边,头插如果满了则node-- ,就可以往前,尾插如果满了node++,就可以往后。如果满了中控数组无非扩容一下,而中控数组的扩容代价很低,拷贝点地址罢了,同时头插尾插效率也很高。它头插的底层其实是你要插入的位置 n + (cur - first) 这样很巧妙的计算出了它的位置。

不过上面的优点说完,它一定有致命缺陷才导致他无法替代vector和list。那就是如果中间插入,那么涉及到移动数据以及扩容的问题,如果扩容,有两种方法解决,一种是直接增加数组的长度,但是这样会导致中控数组里的各个数组大小不同意,就不能用 / 和 % 快速找到位置了。而另一种方法就是插入位置之后的数据都往后移,这两种方法无疑是效率很低的,而它的头插尾插效率又很高,所以我们在特殊情况下才使用deque。

优先级队列  priority_queue

当初我们学排序的时候应该感受到了一个堆排序的优秀,不是最强,但是速度很稳定,但是我们使用的时候又分向上调整和向下调整的建堆,这让我们很苦恼,有时候写完以后因为某些需求又要改,实在麻烦,所以产生了一个叫仿函数的东西。

仿函数

template <class T>
class greater
{
public:
	bool operator()(const T& x, const T& y)
	{
		return x > y;
	}
};

template <class T>
class less
{
public:
	bool operator()(const T& x, const T& y)
	{
		return x < y;
	}
};

仿函数其实就是看着调用像一个函数,但是实际上它是个类,我们只是重载了函数调用里的()而已。

我们想建哪个堆,判断条件用哪个就好。

void Adjustup(int child)
		{
			compar com;
			int parent = (child - 1) / 2;
			while (child > 0)
			{
				if (com(_con[parent] , _con[child]))//用起来是不是很像函数调用
                //
				{
					swap(_con[child], _con[parent]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}

void Adjustdown(int parent)
		{
			size_t chiled = parent * 2 + 1;
			compar com;
			while (child < _con.size())
			{
				if (child + 1 < _con.size() && com(_con[child] , _con[child + 1]))
				{
					++child;
				}
				if (com(_con[parent] , _con[child]))
				{
					swap(_con[child], _con[parent]);
					parent = child;
					child = parent * 2 + 1;
				}
			}
		}

这样我们给个我们自己设定的判断条件就可以灵活变通了(如果只是比大小,系统有自带的less和greater)。




template <class T,class Container = vector<T>, class compar = less<T>>
//这里传less或者greater就可以灵活改变我们要的排序方式,比我们直接改><要方便和有智慧的多

那么讲到这里,想必应该看到优先级队列的默认类型是vector了,它使用vector来存取建好堆的数据,再用堆的方式插入删除。

void push(const T& x)
		{
            //先尾插 再向下调整建堆
			con.push_back(x);
			Adjustup(_con.size() - 1);
		}


void pop()
		{
            //先交换,再删堆顶
			swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
            //删完再调整一下就好
			Adjustdown(0);
		}

当然它作为用vector的,必不可少的还是得有。

const T& top()
		{
			return _con[0];
		}
		size_t size()const
		{
			return _con.size();
		}
		size_t empty() const
		{
			return _con.empty();
		}

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

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

相关文章

python中类class的魔法方法

开始介绍之前&#xff0c;我们先看下之前文章我们介绍过的内置类merryview的一些方法&#xff0c;如下图所示&#xff1a; 有很多双下划线开始和结束的method&#xff0c;这么多method是做啥子用的呢&#xff1f; 其实这些方法就是我们常说的魔法方法&#xff0c;也是python中的…

【代码随想录】二分查找

文章为代码随想录的学习笔记&#xff0c;链接&#xff1a; 代码随想录 只要看到面试题中给出的数组是有序数组&#xff0c;都可以想一想是否可以使用二分法。 基本概念 二分查找要求线性表必须采用顺序存储结构&#xff0c;而且表中元素按关键字有序排列。‘ 查找过程&…

2024年华数杯数学建模竞赛——赛题浅析

本次华数杯与国赛同频【第一天下午六点发题&#xff0c;第四天下午八点收卷】&#xff0c;一共74小时。难度约为国赛的0.8&#xff0c;题量约为国赛的0.8-0.9.非常适合作为国赛前的练手赛。下面为大家带来本次华数杯的选题建议&#xff0c;希望对大家有所帮助。 一图流 选题人…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 卢小姐的字符串解压缩(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题…

36-38 关系数据库入门

关系数据库入门 关系数据库概述 数据持久化 - 将数据保存到能够长久保存数据的存储介质中&#xff0c;在掉电的情况下数据也不会丢失。 数据库发展史 - 网状数据库、层次数据库、关系数据库、NoSQL数据库。 1970年&#xff0c;IBM的研究员E.F.Codd在Communication of the ACM…

【Material-UI】Autocomplete中的禁用选项:Disabled options

文章目录 一、简介二、基本用法三、进阶用法1. 动态禁用2. 提示禁用原因3. 复杂的禁用条件 四、最佳实践1. 一致性2. 提供反馈3. 优化性能 五、总结 Material-UI的Autocomplete组件提供了丰富的功能&#xff0c;包括禁用特定选项的能力。这一特性对于限制用户选择、提供更好的用…

长短期记忆网络LSTM

目录 一、LSTM提出的背景&#xff1a;1.RNN存在的问题&#xff1a;2.LSTM的思想&#xff1a;2.1回顾GRU的提出&#xff1a;2.2LSTM在GRU上的改进&#xff1a; 二、遗忘门、输入门、输出门&#xff1a;三、LSTM网络架构&#xff1a;1.候选记忆单元C~t&#xff1a;2.遗忘门、输入…

顶刊TPAMI 2024!无需全标注,仅用少量涂鸦标注即可获得确定和一致的语义分割预测结果...

本文介绍了山东大学&#xff0c;北京大学和纽约州立大学石溪分校合作开展的一项工作。该工作面向图像涂鸦弱标注语义分割任务&#xff0c;重点关注采用涂鸦弱标注时语义分割网络的不确定性和不一致性问题。 作者提出最小化熵损失函数和网络嵌入的随机游走过程来分别改善分割网络…

Altera之FPGA器件系列简介

目录 一、前言 二、命名规则 2.1 MAX V系列 2.2 Cyclone 系列 2.3 Arria 系列 2.4 Stratix 系列 2.5 Agilex 系列 三、器件划分 3.1 工艺制程 3.2 使用领域 四、参考 一、前言 Altera是作为FPGA领域的头部企业&#xff0c;是一家老牌的技术公司&#xff0c;成立于19…

【一图学技术】7.削峰与限流防刷技术解决方案及限流算法图解

削峰与限流防刷技术 一、削峰技术 ✈解决问题&#xff1a;解决流量大的问题&#xff0c;限制单机流量 &#x1f680;核心技术&#xff1a; 秒杀令牌&#xff1a;颁发给用户令牌&#xff0c;给予操作特权 秒杀大闸&#xff1a;限制令牌数量 队列泄洪&#xff1a;队列增加缓…

4_损失函数和优化器

教学视频&#xff1a;损失函数与反向传播_哔哩哔哩_bilibili 损失函数&#xff08;Loss Function&#xff09; 损失函数是衡量模型预测输出与实际目标之间差距的函数。在监督学习任务中&#xff0c;我们通常希望模型的预测尽可能接近真实的目标值。损失函数就是用来量化模型预…

神经网络基础--激活函数

&#x1f579;️学习目标 &#x1f579;️什么是神经网络 1.神经网络概念 2.人工神经网络 &#x1f579;️网络非线性的因素 &#x1f579;️常见的激活函数 1.sigmoid激活函数 2.tanh激活函数 3.ReLU激活函数 4.softmax激活函数 &#x1f579;️总结 &#x1f57…

计算机基础(Windows 10+Office 2016)教程 —— 第5章 文档编辑软件Word 2016(上)

第5章 文档编辑软件Word 2016 5.1 Word 2016入门5.1.1 Word 2016 简介5.1.2 Word 2016 的启动5.1.3 Word 2016 的窗口组成5.1.4 Word 2016 的视图方式5.1.5 Word 2016 的文档操作5.1.6 Word 2016 的退出 5.2 Word 2016的文本编辑5.2.1 输入文本5.2.3 插入与删除文本5.2.4 复制与…

二进制与进制转换与原码、反码、补码详解--内含许多超详细图片讲解!!!

前言 今天给大家分享一下C语言操作符的详解&#xff0c;但在此之前先铺垫一下二进制和进制转换与原码、反码、补码的知识点&#xff0c;都非常详细&#xff0c;也希望这篇文章能对大家有所帮助&#xff0c;大家多多支持呀&#xff01; 操作符的内容我放在我的下一篇文章啦&am…

基于人工智能的口试模拟、LLM将彻底改变 STEM 教育

概述 STEM教育是一种整合科学&#xff08;Science&#xff09;、技术&#xff08;Technology&#xff09;、工程&#xff08;Engineering&#xff09;和数学&#xff08;Mathematics&#xff09;的教育方法。这种教育模式旨在通过跨学科的方式培养学生的创新能力、问题解决能力…

MySQL 高级 - 第十四章 | 事务基础知识

目录 第十四章 事务基础知识14.1 数据库事务概述14.1.1 存储引擎支持情况14.1.2 基本概念14.1.3 事务的 ACID 特性14.1.4 事务的状态 14.2 如何使用事务14.2.1 显示事务14.2.2 隐式事务14.2.3 隐式提交数据的情况14.2.4 使用举例14.2.4.1 提交与回滚14.2.4.2 测试不支持事务的 …

Yarn:一个快速、可靠且安全的JavaScript包管理工具

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;还请三连支持一波哇ヾ(&#xff20;^∇^&#xff20;)ノ&#xff09; 目录 一、Yarn简介 二、Yarn的安装 1. 使用npm安装Yarn 2. 在macOS上…

11.redis的客户端-Jedis

1.Jedis 以redis命令作为方法名称&#xff0c;学习成本低&#xff0c;简单使用。但是jedis实例是不安全的&#xff0c;多线程环境下需要基于连接池来使用。 2.Lettuce lettuce是基于Netty实现的&#xff0c;支持同步&#xff0c;异步和响应式编程方式&#xff0c;并且是线程…

EmEditor 打开文档后光标如何默认定位到文档最后一行?

1、录制宏 &#xff08;1&#xff09;、点击工具栏上的红色录制宏按钮&#xff0c;开始录制宏。如图&#xff1a; &#xff08;2&#xff09;、按住快捷键Ctrl End快捷键&#xff0c;使光标跳转到文档末尾 &#xff08;3&#xff09;、完成录制后&#xff0c;再次点击录制按钮…

Hive SQL ——窗口函数源码阅读

前言 使用Starrocks引擎中的窗口函数 row_number() over( )对10亿的数据集进行去重操作&#xff0c;BE内存溢出问题频发&#xff08;忘记当时指定的BE内存上限是多少了.....&#xff09;&#xff0c;此时才意识到&#xff0c;开窗操作&#xff0c;如果使用 不当&#xff0c;反而…