数据结构之deque双端队列

news2025/6/17 17:47:45

一、概念:

众所周知,数据结构是用来存储数据,deque也不例外,他是集结了队列和栈的性质而成的结构,他几乎拥有所有数据结构能有的操作,看似已经大杀四方,可实际情况如何呢,那就带者这个疑问继续学习。

预备知识:

在学习deque这个容器之前,我们先要回顾以下vector和list这两大容器的优缺点:

vector优缺点:

优点:

  1. 下标随机访问
  2. 缓存命中率高(物理结构连续存储的优势)

缺点:

  1. 前面部分插入删除效率低
  2. 扩容有消耗

list优缺点:

优点:

  1. 任意位置插入删除效率高
  2. 按需申请释放

缺点:

  1. 不支持下标随机访问
  2. 缓存命中率低

deque的底层逻辑

在明白前面的知识后,接下来我们就来了解deque的底层实现。

下面这张图就是deque的基本实现方法

首先deque多了一个叫做中控数组的东西,本质上是存储一段一段空间的指针数组

而在deque里面存储数据的并不是一长串连续的空间,而是一段一段的空间。

因此,我们在简单了解deque的基本实现后,我们不难发现deque有以下的优缺点。

优点:

头插、头删、尾插、尾删效率很不错。

不足:(自相矛盾)

如果随机访问,如何计算?

比如访问第i个值,在假设每个buff一样大的情况下(都是10),比较容易计算。

在第i/10个buff中;在这个buff的第i%10的位置。


我们又会遇到下面的实际场景:中间插入删除如何实现呢?

如果要保持每个buff一样大,只能挪动数据(效率低)

如果不需要保持每个buff一样大,可以对当前的buff直接扩容或者挪动数据(效率较低)

综述,在遇上前面两种不同的状况下,想要都实现效率低,是不可能的,即所谓鱼和熊掌不可兼得。 

总结:

  1. 下标随机访问,效率不错,但是跟vector有差距
  2. 中间插入删除,效率差
  3. 头插、头删、尾插、尾删效率很不错。

所以在容器适配的选择上,什么情况选择deque呢,在头插、头删、尾插、尾删比较多的情况下,可以选择deque。

但是如果对中间位置访问比较多,比如优先级队列(本质是堆),就不能选择deque,应该选择vector(性能上差很多!)

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

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

相关文章

markdown页面宽度放宽

变成以上样式 ------------------------------------------------ 然后最后一行加上 #write{ max-width: 90%; } /* 调整源码正文宽度 */ #typora-source .CodeMirror-lines { max-width: 90%; } /* 调整输出 PDF 文件宽度 */ media print { #write{ max-w…

C++字符串操作【超详细】

零.前言 本文将重点围绕C的字符串来展开描述。 其中,对于C/C中字符串的一些区别也做出了回答,并对于C的(string库)进行了讲解,最后我们给出字符串的不同表达形式。 开发环境: VS2022 一.字符串常量跟字…

UE4.27_ParticleSystem(没写完的材料)

UE4.27_ParticleSystem(没写完的材料) 参考实例: UE4[蓝图]下雪效果及雪的材质的实现

docker学习入门

1、docker简介 docker官网: www.docker.com dockerhub官网: hub.docker.com docker文档官网:docs.docker.com Docker是基于Go语言实现的云开源项目。 Docker的主要目标是:Build, Ship and Run Any App, Anywhere(构建&…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Image)

Image为图片组件,常用于在应用中显示图片。Image支持加载PixelMap、ResourceStr和DrawableDescriptor类型的数据源,支持png、jpg、jpeg、bmp、svg、webp和gif类型的图片格式。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容&am…

数据库系统概论(超详解!!!) 第三节 关系数据库

1.基本概念 1. 域(Domain) 域是一组具有相同数据类型的值的集合。 2. 笛卡尔积(Cartesian Product) 给定一组域D1,D2,…,Dn,允许其中某些域是相同的。 D1,D2…

phpStudy,自定义php版本

新版phpStudy,支持自定义php版本,只支持php5.3.0以后的任意版本。 一定要下载win版php,不是下载源码,win版php下载地址:http://windows.php.net/ 也就是地址: https://windows.php.net/downloads/releases…

使用Julia语言和R语言实现K-均值

K-均值算法基础 K-均值聚类算法属于一种无监督学习的方法,通过迭代的方式将数据划分为K个不重叠的子集(簇),每个子集由其内部数据点的平均值来表示。计算方法大体如下: 1.初始化簇中心 选择K个数据点作为初始的簇中心…

A5自媒体wordpress主题模板

一个简洁的wordpress个人博客主题,适合做个人博客,SEO优化效果挺不错的。 https://www.wpniu.com/themes/204.html

数据分析-Pandas最简单的方法画矩阵散点图

数据分析-Pandas直接画矩阵散点图 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据表&…

添加路障-蓝桥杯-DFS

自己另辟蹊径想的新思路 果然好像还是不太行呀 import java.util.Scanner;public class Main {static int T;//样例组数static int n;//矩阵大小static int[] X {0,1,0,-1};static int[] Y {1,0,-1,0};static int[] X1 {1,0,-1,0};static int[] Y1 {0,-1,0,1};static int …

Harbor二次开发前端环境搭建

1 前端开发环境搭建 (1)拉取分支代码 (2)前端开发推荐使用VsCode编辑器打开项目 打开 harbor\src\portal 文件夹,该文件夹为Harbor对应的前端代码所在位置 (3)在portal文件夹下创建名为 pro…

macOS上实现「灵动岛」效果

自从Apple iPhone推出了「灵动岛」功能后,用户们就被其优雅的设计和强大的功能所吸引。然而,作为macOS用户,我们一直在等待这一功能能够在我们的设备上实现。现在,随着新的应用程序的推出,我们终于可以在我们的Mac上体…

物流分拣漫LiDAR反射板

激光雷达漫反射板是物流分拣中不可或缺的一种设备,它在物流分拣过程中发挥着重要的作用。漫反射板的主要功能是反射光线,使得光线能够在分拣区域内均匀分布,从而提高分拣设备的识别精度和效率。 物流分拣是现代物流系统中非常关键的一环&…

信息抽取在旅游行业的应用:以景点信息抽取为例

开源项目推荐 今天先给大家推荐一个开源项目,多模态AI能力引擎平台: 免费的自然语言处理、情感分析、实体识别、图像识别与分类、OCR识别、语音识别接口,功能强大,欢迎体验。 https://gitee.com/stonedtx/free-nlp-api 场景描述 在旅游行业…

【分库分表】基于mysql+shardingSphere的分库分表技术

目录 1.什么是分库分表 2.分片方法 3.测试数据 4.shardingSphere 4.1.介绍 4.2.sharding jdbc 4.3.sharding proxy 4.4.两者之间的对比 5.留个尾巴 1.什么是分库分表 分库分表是一种场景解决方案,它的出现是为了解决一些场景问题的,哪些场景喃…

【蓝桥杯】蓝桥杯算法复习(一)

😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!&#x1f4…

使用Git将代码上传至代码托管平台GitCode

使用像GitLbi、GitHub、Gitee等代码托管平台用于版本控制非常滴方便,能够跟踪代码的变化和历史记录,方便管理和回滚,还允许多个开发者同时在一个项目上进行开发和协作,提高团队协作效率。 这些平台的代码托管和上传方式都大同小异…

【QT】自定义控件的示例

自定义控件(很重要) 什么是自定义控件? 顾名思义就是创建一个窗口,放入多个控件,拼接起来,一起使用。 为什么需要它? 需求,假设有100个窗口,那如果有两个控件同时被使…

开源组件安全风险及应对

在软件开发的过程中,为了提升开发效率、软件质量和稳定性,并降低开发成本,使用开源组件是开发人员的不二选择(实际上,所有软件开发技术的演进都是为了能够更短时间、更低成本地构建软件)。这里的开源组件指…