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

队列实现方式、效率分析及应用场景

文章目录

  • 一、什么是队列
  • 二、队列特性
    • 阻塞和非阻塞
    • 有界和无界
    • 单向链表和双向链表
  • 三、Java队列接口继承图
  • 四、Java队列常用方法
  • 五、队列实现方式与效率分析
  • 六、队列的应用场景
  • 七、Python中队列与优先级队列使用

一、什么是队列

队列是一种特殊的线性表,遵循先入先出、后入后出的基本原则,一般来说,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,但是Java的某些队列允许在任何地方插入删除(Python则不能),这是因为这些队列实现了Collections接口;比如我们常用的LinkedList集合,它实现了Queue接口,因此,我们可以理解为 LinkedList 就是一个队列;再比如优先级队列PriorityQueue实现了Queue接口,Queue接口中的remove()方法删除对头元素,同时实现了Collection接口,Collection接口提供了remove(Object o)方法用于删除队列中任意存在的元素,但该方法效率较低。
在这里插入图片描述

二、队列特性

队列主要分为阻塞和非阻塞,有界和无界、单向链表和双向链表之分;

阻塞和非阻塞

阻塞队列
入列(添加元素)时,如果元素数量超过队列总数,会进行等待(阻塞),待队列的中的元素出列后,元素数量未超过队列总数时,就会解除阻塞状态,进而可以继续入列;

出列(删除元素)时,如果队列为空的情况下,也会进行等待(阻塞),待队列有值的时候即会解除阻塞状态,进而继续出列;
阻塞队列的好处是可以防止队列容器溢出;只要满了就会进行阻塞等待;也就不存在溢出的情况;
只要是阻塞队列,都是线程安全的;

非阻塞队列
不管出列还是入列,都不会进行阻塞.
入列时,如果元素数量超过队列总数,则会抛出异常,出列时,如果队列为空,则取出空值;

一般情况下,非阻塞式队列使用的比较少,一般都用阻塞式的对象比较多;阻塞和非阻塞队列在使用上的最大区别就是阻塞队列提供了以下2个方法:

出队阻塞方法 : take()
入队阻塞方法 : put()

有界和无界

有界:有界限,大小长度受限制
无界:无限大小,其实说是无限大小,其实是有界限的,只不过超过界限时就会进行扩容,就行ArrayList一样,在内部动态扩容

单向链表和双向链表

单向链表 : 每个元素中除了元素本身之外,还存储一个指针,这个指针指向下一个元素;
在这里插入图片描述

双向链表 :除了元素本身之外,还有两个指针,一个指针指向前一个元素的地址,另一个指针指向后一个元素的地址;
在这里插入图片描述

三、Java队列接口继承图

在这里插入图片描述

四、Java队列常用方法

队列除了基本的 Collection 操作外,还提供特有的插入、提取和检查操作(如上)。每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是用于专门为有容量限制的 Queue 实现设计的;在大多数实现中,插入操作不会失败。

Queue是java中实现队列的接口,它总共只有6个方法,我们一般只用其中3个就可以了。Queue的实现类有LinkedList和PriorityQueue。最常用的实现类是LinkedList。

Queue的6个方法分类:

  • 压入元素(添加):add()、offer()
    相同:未超出容量,从队尾压入元素,返回压入的那个元素。
    区别:在超出容量时,add()方法会对抛出异常,offer()返回false

  • 弹出元素(删除):remove()、poll()
    相同:容量大于0的时候,删除并返回队头被删除的那个元素。
    区别:在容量为0的时候,remove()会抛出异常,poll()返回false

  • 获取队头元素(但不删除):element()、peek()
    相同:容量大于0的时候,都返回队头元素。但是不删除。
    区别:容量为0的时候,element()会抛出异常,peek()返回null。

抛出异常返回特殊值
插入add(e)offer(e)
删除remove()poll()
检查element()peek()

知识点: offer、poll、remove、element、peek 其实是属于Queue接口。

五、队列实现方式与效率分析

数组队列:通过数组(可变数组)实现一个队列;

数组是连续存储,添加元素、删除元素很慢,时间复杂度O(n)(这是因为添加元素需要动态扩容,删除某位置元素后,需要将其后元素整体前移);改查很快(不需要改变数据结构)

链表队列:通过链表实现一个对列;

链表是非连续存储,增删很快,添加删除元素的时间复杂度都是O(1);但是改查很慢,因为没有索引,需要遍历链表找到元素位置进行删除。

栈队列:通过两个栈实现一个队列;

在这里插入图片描述

在20万数据循环操作下,链表实现的队列最快,是栈队列的2572倍,是数组的643倍。这个数值具体看设备算力,这里只做参考。

六、队列的应用场景

用于解决图和树等数据结构中的搜索问题。
广度优先搜索:广度优先搜索可以通过队列来实现对节点的遍历,通常就会从搜索候补中选择最早的数据作为下一个顶点。此时,在候补顶点的管理上就可以使用队列。

Dijkstra算法:优先队列

A*算法:优先队列

七、Python中队列与优先级队列使用

Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。

常用方法:

  • Queue.qsize() 返回队列的大小
  • Queue.empty() 如果队列为空,返回True,反之False
  • Queue.full() 如果队列满了,返回True,反之False,Queue.full 与 maxsize 大小对应
  • Queue.get([block[, timeout]])获取队列,timeout等待时间
  • Queue.get_nowait() 相当于Queue.get(False),非阻塞方法
  • Queue.put(item) 写入队列,timeout等待时间
  • Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。
  • Queue.join() 实际上意味着等到队列为空,再执行别的操作
import queue
queue = queue.Queue()

添加元素至队列

queue.put("zhangsan")

查看队列元素

print(queue) # 直接打印队列不行
print(queue.queue)
<queue.Queue object at 0x0000022B05E98430>
deque(['zhangsan'])

判断元素是否在队列中

print("zhangsan" in queue.queue)
True

删除队头元素

print(queue.get())
print(queue.queue)
print(queue.qsize)
zhangsan
deque([])
<bound method Queue.qsize of <queue.Queue object at 0x0000022B05E98430>>

判断队列是否为空

print(queue.empty())
True

优先级队列的使用
创建优先级队列

import queue
queue = queue.PriorityQueue()

添加元素至优先队列,查看队列元素

# 添加元素至优先队列
queue.put((3,"古力热巴"))
queue.put((2,"马儿扎哈"))
queue.put((1,"迪丽热巴"))
queue.put((9,"仓央嘉措"))
# 查看队列元素
print(queue.queue)
[(1, '迪丽热巴'), (3, '古力热巴'), (2, '马儿扎哈'), (9, '仓央嘉措')]

判断元素是否在队列中

print((1,"迪丽热巴") in queue.queue)
True

删除并返回队头

# 删除队头
print(queue.get())
print(queue.queue)
(1, '迪丽热巴')
[(2, '马儿扎哈'), (3, '古力热巴'), (9, '仓央嘉措')]

参考:
https://blog.csdn.net/xijinno1/article/details/132114694

相关文章:

队列实现方式、效率分析及应用场景

文章目录 一、什么是队列二、队列特性阻塞和非阻塞有界和无界单向链表和双向链表 三、Java队列接口继承图四、Java队列常用方法五、队列实现方式与效率分析六、队列的应用场景七、Python中队列与优先级队列使用 一、什么是队列 队列是一种特殊的线性表&#xff0c;遵循先入先出…...

使用git下载远程所有分支到本地

使用git下载远程所有分支到本地&#xff1a; 打开gitbash 输入以下命令即可&#xff1a; git clone git地址 cd git文件夹 git branch -r | grep -v \-> | while read remote; do git branch --track "${remote#origin/}" "$remote"; done git fetch -…...

解决LocalDateTime传输前端为时间的数组

问题出现如下&#xff1a; 问题出现原因&#xff1a; 默认序列化情况下会使用SerializationFeature.WRITE_DATES_AS_TIMESTAMPS。使用这个解析时就会打印出数组。 解决方法&#xff1a; 我在全文搜索处理方法总结如下&#xff1a; 1.前端自定义函数来书写 ,cols: [[ //表头{…...

01:编译lua及C调用

我们今天在windows平台编译lua&#xff0c;生成 lua动态库,lua.exe&#xff0c;luac.exe 我把这个目录上传到giee&#xff0c;使用下面命令获取它: git clone gitgitee.com:jameschenbo/lua_c_application.git 目录结构如下&#xff1a; build.cmd 是编译脚本&#xff0c;在…...

网络运维与网络安全 学习笔记2023.11.24

网络运维与网络安全 学习笔记 第二十五天 今日目标 DHCP中继代理、三层交换机DHCP、子网划分的原理、子网划分的应用 项目需求分析、技术方案选型、网络拓扑绘制 基础交换网络设计、内网优化、连接外网服务器 DHCP中继代理 DHCP中继概述 场景&#xff1a; DHCP客户端与DH…...

常见树种(贵州省):022绣线菊、月月青、金合欢、胡枝子、白刺花

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、绣线菊…...

微星主板开启VT

微星主板模拟器使用 开启VT 进入BIOS高级-》OC-》CPU特征-》intel 虚拟化技术-》允许...

【C++】类型转换 ② ( C++ 静态类型转换 static_cast | C 语言隐式转换弊端 | 代码示例 )

文章目录 一、静态类型转换 static_cast1、C 静态类型转换 static_cast2、C 语言隐式转换弊端3、代码示例 在之前写过一篇 C 类型转换的博客 【C 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 ) , 简单介绍了 C 类…...

14.配置Bean有哪几种方式?

配置Bean有哪几种方式? 基于xml: <bean class=“com.tuling.UserService” id=“”>基于注解: @Component(@Controller 、@Service、@Repostory) 前提:需要配置扫描包<component-scan> 反射调用构造方法基于java类配置: @Bean 可以自己控制实例化过程@Import 3种…...

RV1126芯片中的V4L2驱动开发

RV1126芯片概述 RV1126芯片是瑞芯微推出的一款高性能嵌入式人工智能处理器&#xff0c;具有较强的图像处理和音视频处理能力。它采用了双核Cortex-A7架构和一颗DSP核心&#xff0c;支持多种接口和外设&#xff0c;如MIPI CSI、HDMI、USB等&#xff0c;可以广泛应用于物联网、智…...

Linux中部署MongoDB

在 是一个必要的过程&#xff0c;因为MongoDB是一种流行的NoSQL数据库&#xff0c;它可以在大多数操作系统上使用。在本文中&#xff0c;我们将介绍如何在CentOS 8上部署MongoDB。 MongoDB的下载 您可以从MongoDB官网上下载最新的MongoDB版本。使用以下命令下载MongoDB&#…...

Halcon 5分钟学会9点标定 带图片示例、示例源码

9点标定应用流程 前置条件&#xff0c;相机焦距&#xff0c;视野固定高度和角度&#xff0c;光源光强度固定。 移动机械手&#xff0c;使用螺丝批头&#xff0c;在视野范围内的白纸上&#xff0c;点九个点&#xff0c;记录每个点位的位置&#xff0c;每个点位的顺序要和图像上获…...

【非监督学习 | 聚类】聚类算法类别大全 距离度量单位大全

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…...

案例026:基于微信的原创音乐小程序的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…...

网络运维与网络安全 学习笔记2023.11.26

网络运维与网络安全 学习笔记 第二十七天 今日目标 NAT场景与原理、静态NAT、动态NAT PAT原理与配置、动态PAT之EasyIP、静态PAT之NAT Server NAT场景与原理 项目背景 为节省IP地址和费用&#xff0c;企业内网使用的都是“私有IP地址” Internet网络的组成设备&#xff0c…...

STM32使用多路PWM注意事项

这是使用CubeMX自动产生的代码&#xff0c;使用TIM2产生了PA0,PA1,PA2,PA3这4路PWM&#xff0c;可以看到里面Pulse是共同使用了一个sConfigOC,如果是需要动态调整Pulse&#xff0c;就需要特别注意。 如果是用来产生呼吸灯&#xff0c;就会把这4个PWM都打乱&#xff0c;我觉得&a…...

汽车转向桥设计转向节转向桥机械设计

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;转向桥 获取完整报告说明书工程源文件 转向节图 装配图 本文设计的是JY1061A型采用前置后轮驱动的载货汽车转向桥&#xff0c;因此该转向桥为从动桥。从动桥的功用&#xff1a;从动桥也称非驱动桥&#xff0c;又称从动车轴…...

前端实现埋点

前端实现埋点 如何去了解用户呢&#xff1f;最直接有效的方式就是了解用户的行为&#xff0c;了解用户在网站中做了什么&#xff0c;呆了多久。而如何去实现这一操作&#xff0c;这就涉及到我们前端的埋点了。 埋点方式 什么是埋点&#xff1f; 所谓埋点是数据采集领域&…...

Apache多后缀解析漏洞分析

漏洞介绍 该漏洞与用户的配置有密切的关系,严格来说属于用户配置问题。Apache文件解析漏洞涉及到 Apache 解析文件的特性。在默认情况下,Apache 允许一个文件具有多个以点分割的后缀,在处理文件时会从右向左识别后缀名。(就是右边的后缀名无法识别,则继续识别左边的) 如果…...

基于Loki + Promtail + Grafana 搭建 Nginx 日志监控

文章目录 引言第一部分&#xff1a;Loki 简介与安装1.1 Loki 简介1.2 Loki 安装1.2.1 下载 Loki1.2.2 安装 Loki 1.3 启动 Loki 第二部分&#xff1a;Promtail 简介与安装2.1 Promtail 简介2.2 Promtail 安装2.2.1 下载 Promtail2.2.2 安装 Promtail 2.3 启动 Promtail 第三部分…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...