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

深入理解Python中的数据结构:deque

目录

前言

什么是deque?

deque的基本操作

导入deque

创建deque

添加元素

删除元素

访问元素

旋转deque

其他常用方法

deque的应用场景

队列(Queue)

栈(Stack)

双端队列

回文检查

维护最近的元素

deque的实现原理

双向链表

内存管理

线程安全

deque的性能分析

时间复杂度

空间复杂度

性能对比

deque的扩展功能

默认值deque

线程安全的deque

deque在实际项目中的应用

1. 网站最近访问记录

2. 日志记录

3. 实时数据处理

总结


前言

在各类编程语言中,数据结构的选择和使用是程序设计的核心环节之一。在众多数据结构中,双端队列(deque,pronounced as "deck")因其灵活性和高效性而备受关注。Python标准库提供了deque数据结构,这使得程序员能够以高效的方式操作队列和栈。本博文将详细介绍Python中的deque数据结构,涵盖其定义、操作方法、应用场景及其实现原理。

什么是deque?

deque,全称为double-ended queue,是一种允许在两端都可以进行插入和删除操作的队列。与普通的队列相比,deque不仅限于在一端(通常是末尾)进行操作,它在头尾两端都提供了对数据的访问权限。

在Python中,deque是由collections模块提供的一个类,其底层实现是双向链表。它具有以下特点:

  1. 双端操作:可以在队列的两端进行插入和删除操作。
  2. 高效性:在两端的插入和删除操作时间复杂度为O(1),在中间插入和删除操作时间复杂度为O(n)。
  3. 线程安全:deque提供了一些内置方法来确保线程安全。

deque的基本操作

导入deque

在使用deque之前,需要从collections模块导入它:

from collections import deque

创建deque

可以通过以下方式创建一个空的deque或带有

dq = deque()# 在右端添加元素
dq.append(1)
dq.append(2)# 在左端添加元素
dq.appendleft(0)print(dq)  # 输出: deque([0, 1, 2])

初始元素的deque:

# 创建一个空的deque
dq = deque()# 创建一个带有初始元素的deque
dq = deque([1, 2, 3, 4, 5])

添加元素

deque允许在两端添加元素:

dq = deque()# 在右端添加元素
dq.append(1)
dq.append(2)# 在左端添加元素
dq.appendleft(0)print(dq)  # 输出: deque([0, 1, 2])

删除元素

同样地,deque允许在两端删除元素:

# 从右端删除元素
dq.pop()# 从左端删除元素
dq.popleft()print(dq)  # 输出: deque([1])

访问元素

可以使用索引访问deque中的元素,但这样做的时间复杂度为O(n):

# 访问第一个元素
first_element = dq[0]# 访问最后一个元素
last_element = dq[-1]

旋转deque

deque提供了旋转的方法,可以将队列的元素向左或向右旋转:

dq = deque([1, 2, 3, 4, 5])# 向右旋转两步
dq.rotate(2)
print(dq)  # 输出: deque([4, 5, 1, 2, 3])# 向左旋转三步
dq.rotate(-3)
print(dq)  # 输出: deque([2, 3, 4, 5, 1])

其他常用方法

deque还提供了许多其他有用的方法:

# 清空deque
dq.clear()# 统计某个元素出现的次数
count = dq.count(1)# 在指定位置插入元素
dq.insert(2, 99)# 删除第一个匹配的元素
dq.remove(99)

deque的应用场景

由于deque在两端操作上的高效性,它在许多实际场景中都非常有用:

队列(Queue)

deque可以用作常规队列:

def queue_example():dq = deq

http://www.mrgr.cn/news/33936.html

相关文章:

  • 「QT」文件类 之 QDir 目录类
  • Spring Boot实现文件上传与OSS集成:从基础到应用
  • 接口类和抽象类在设计模式中的一些应用
  • springboot自动装配
  • CSS3 用户界面
  • 大数据技术在金融风控中的应用
  • 告别枯燥:我开发了一个在电脑桌面上使用弹幕来背单词的软件
  • C语言 | Leetcode C语言题解之第429题N叉树的层序遍历
  • C++ | Leetcode C++题解之第430题扁平化多级双向链表
  • git-repo系列教程(6) 在自己服务器上搭建git-repo仓库
  • 2024 离线ASR和TTS推荐与示例
  • 【二等奖论文】2024年华为杯研究生数学建模E题成品论文获取入口
  • Java 每日一刊(第15期):内部类
  • java8新特新(二)
  • AI学习指南深度学习篇-Adadelta的数学原理
  • Project Online 高级版部署方案
  • 7款国内AI搜索引擎大全网站
  • Kotlin Android 环境搭建
  • uniapp map设置高度为100%后,会拉伸父容器的高度
  • MateBook 16s 2023在Deepin下开启性能模式,调节风扇转速到最大,全网首发!
  • 返利机器人在电商返利系统中的负载均衡实现
  • 【C语言零基础入门篇 - 17】:排序算法
  • PHP isset() 和 empty() 区别
  • 【C++】继承(上)
  • 定了,东湖高新区下半年中高级职称申报时间
  • java日志框架之Log4j