python中的deque详解

deque(双端队列)是Python标准库collections模块中的一个类,它支持从两端快速添加和删除元素。deque为固定大小或者可变大小的队列提供了线程安全的实现,并且它比使用列表(list)来实现相同的功能更为高效。

deque的主要特点和操作包括:

  • 快速从两端添加和删除元素deque在两端添加和删除元素的时间复杂度都是O(1),而列表在列表头部添加或删除元素的时间复杂度是O(n)。
  • 线程安全deque的实例可以在多线程环境中安全使用,而不需要额外的锁定。
  • 可选的最大长度:可以通过maxlen参数来限制deque的最大长度。当deque已满时,添加新元素会导致最早添加的元素被自动移除。

下面是deque的一些详细示例:

示例1:基本使用

from collections import deque# 创建一个空的deque
d = deque()# 从右侧添加元素
d.append('a')
d.append('b')
print(d)  # 输出:deque(['a', 'b'])# 从左侧添加元素
d.appendleft('c')
print(d)  # 输出:deque(['c', 'a', 'b'])# 从右侧移除元素
right_item = d.pop()
print(right_item)  # 输出:'b'
print(d)  # 输出:deque(['c', 'a'])# 从左侧移除元素
left_item = d.popleft()
print(left_item)  # 输出:'c'
print(d)  # 输出:deque(['a'])

示例2:使用maxlen限制队列长度

from collections import deque# 创建一个最大长度为3的deque
d = deque(maxlen=3)# 添加元素
d.append('a')
d.append('b')
d.append('c')
print(d)  # 输出:deque(['a', 'b', 'c'], maxlen=3)# 继续添加元素,最早添加的元素'a'将被移除
d.append('d')
print(d)  # 输出:deque(['b', 'c', 'd'], maxlen=3)# 尝试从左侧添加元素,同样会移除最早添加的元素
d.appendleft('e')
print(d)  # 输出:deque(['e', 'c', 'd'], maxlen=3)

示例3:使用deque实现滑动窗口算法

滑动窗口算法常用于数组或列表的子序列问题,如寻找最大/最小子序列和。

from collections import dequedef max_sliding_window(nums, k):# 使用deque保存窗口中的最大值索引window = deque()result = []for i in range(len(nums)):# 如果deque不为空且当前元素大于deque尾部元素对应的值,则移除尾部元素while window and nums[window[-1]] <= nums[i]:window.pop()# 添加当前元素的索引到dequewindow.append(i)# 当窗口大小达到k时,开始记录窗口内的最大值,并尝试移动窗口左边界if i >= k - 1:result.append(nums[window[0]])  # window[0]是当前窗口内最大值的索引# 如果deque头部的索引已经不在当前窗口内,则移除头部索引if window[0] <= i - k:window.popleft()return resultnums = [1, 3, -1, -3, 5, 3, 6, 7]
k = 3
print(max_sliding_window(nums, k))  # 输出:[3, 3, 5, 5, 6, 7]

在这个例子中,deque用于存储当前窗口内元素值的索引,通过维护一个递减的索引队列,我们可以快速找到窗口内的最大值。当窗口向右滑动时,我们更新队列并记录每个窗口的最大值。

在Python中,collections.deque 是一个非常实用的双向队列实现,它可以高效地在队列两端添加或移除元素。以下是一些使用 deque 的示例:

示例 4: 使用 deque 实现旋转数组

from collections import dequedef rotate_array(nums, k):dq = deque(nums)dq.rotate(-k)  # 逆时针旋转 k 位,如果是顺时针旋转则直接写 kreturn list(dq)nums = [1, 2, 3, 4, 5, 6, 7]
k = 3
rotated_nums = rotate_array(nums, k)
print(rotated_nums)  # 输出: [5, 6, 7, 1, 2, 3, 4]

示例 5: 使用 deque 实现最大/最小栈

from collections import dequeclass MaxStack:def __init__(self):self.stack = deque()self.max_stack = deque()def push(self, x):self.stack.append(x)if not self.max_stack or x >= self.max_stack[-1]:self.max_stack.append(x)def pop(self):if self.stack:if self.stack[-1] == self.max_stack[-1]:self.max_stack.pop()return self.stack.pop()return Nonedef top(self):return self.stack[-1] if self.stack else Nonedef getMax(self):return self.max_stack[-1] if self.max_stack else None# 使用示例
max_stack = MaxStack()
max_stack.push(5)
max_stack.push(7)
max_stack.push(1)
max_stack.push(5)
print(max_stack.getMax())  # 输出: 7
max_stack.pop()
print(max_stack.top())  # 输出: 5
print(max_stack.getMax())  # 输出: 7

在这个例子中,MaxStack 类使用两个 deque:一个用于存储栈的元素,另一个用于存储当前栈中的最大值。这样,我们可以在常数时间内获取栈顶的最大值。

示例 6: 使用 deque 实现广度优先搜索(BFS)

在图的遍历中,deque 常用于实现广度优先搜索(BFS)。

from collections import dequedef bfs(graph, root):visited = set()queue = deque([root])while queue:vertex = queue.popleft()print(vertex, end=" ")for neighbour in graph[vertex]:if neighbour not in visited:visited.add(neighbour)queue.append(neighbour)# 图的邻接表表示
graph = {'A': ['B', 'C'],'B': ['D', 'E'],'C': ['F'],'D': [],'E': ['F'],'F': []
}bfs(graph, 'A')  # 输出: A B C D E F

在上面的例子中,我们使用 deque 作为队列来存储待访问的节点,实现了图的广度优先搜索。

这些示例展示了 deque 在不同场景下的应用,从基本的队列操作到更复杂的算法实现。deque 的灵活性和高效性使得它成为处理序列数据的强大工具。

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

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

相关文章

.NET core 5.0 及以上的Windows Service开发

首先&#xff0c;一定要和.NET Framework区分开&#xff0c; 详细请看微软的2023年的最新官方文档 Create Windows Service using BackgroundService - .NET | Microsoft Learn Create a Windows Service installer - .NET | Microsoft Learn 同样微软的官方微博给出了开发…

【明道云】如何让用户可以新增但不能修改记录

【背景】 遇到一个需求场景&#xff0c;用户希望新增数据后锁住数据不让更改。 【分析】 在设计表单时直接将字段设置只读是不行的。字段设置只读将会直接让界面上此字段的前端组件不可编辑。包括新增时也无法填入。显然是不符合需求的。 需要既能新增&#xff0c;新增后又不…

【WebJs 爬虫】逆向进阶技术必知必会

前言 在数字化时代&#xff0c;网络爬虫已成为一种强大的数据获取工具&#xff0c;广泛应用于市场分析、竞争对手研究、舆情监测等众多领域。爬虫技术能够帮助我们快速、准确地获取网络上的海量信息&#xff0c;为决策提供有力支持。然而&#xff0c;随着网络环境的日益复杂和…

猫,路由器,WIFI

家庭网络常识 1&#xff1a;猫、路由器、wifi_哔哩哔哩_bilibili 入户光纤插到猫上面&#xff0c;网线连接猫和路由器&#xff0c;网线连接路由器和电脑。路由器可以发射WIFI。 手机通过WIFI连接到路由器。 左边是猫&#xff0c;右边是光猫。 &#xff08;modem&#xff09; …

重学SpringBoot3-SpringBoot可执行JAR的原因

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-SpringBoot可执行JAR的原因 Spring Boot可执行JAR的结构打包运行JAR 包内部结构 工作原理优点总结 Spring Boot 的一个核心特性是它的可执行 JAR&#x…

88. 合并两个有序数组(javascript)

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组…

QML通过鼠标拖动的位置

当通过鼠标拖动Rectangle 的位置时&#xff0c;可以使用Qt Quick的MouseArea组件来实现 Rectangle {id: rectx:0;y:0width: 200; height: 100color: "lightblue"MouseArea {id: mouseAreaanchors.fill: parentdrag.target: rect//要拖动的项目的IDdrag.axis: Drag.XA…

25G SFP28 AOC线缆最新数据传输解决方案

在当今云计算、大数据、人工智能等领域&#xff0c;对高速数据传输的需求不断增加。传统的1G和10G网络已经无法满足数据中心日益增长的流量&#xff0c;因此迫切需要更高速的解决方案。25G SFP28 AOC有源光缆迎合了这一需求&#xff0c;成为连接数据中心、服务器、存储等25G设备…

游戏客户客户端面经

C#和C的类的区别C# List添加100个Obj和100 int内存是怎么变化的重载和重写的区别&#xff0c;重载是怎么实现的重写是怎么实现的&#xff1f;虚函数表是类的还是对象的用过哪些C的STLVector底层是怎么实现的Vector添加一百次数据内存是怎么变化Map的底层&#xff0c;红黑树的查…

增强现实(AR)和虚拟现实(VR)营销的未来:沉浸式体验和品牌参与

--- 如何将AR和VR技术应用于营销&#xff0c;以提高品牌知名度、客户参与度 增强现实&#xff08;AR&#xff09;和虚拟现实&#xff08;VR&#xff09;不再只是游戏。这些技术为品牌与受众互动提供了创新的方式。营销人员可以创造更好的客户体验&#xff0c;并为身临其境的故…

华为Mate 60 Pro+是双卡双待吗 华为Mate 60 Pro+是4g还是5g手机

华为mate60 pro支持双卡双待&#xff0c;卡片类型为nano-SIM卡为全球首款搭载双星卫星通信的手机&#xff0c;支持天通卫星电话及双向北斗卫星消息。 华为mate60 pro支持5G网络 华为Mate 60 Pro搭载了华为自研的麒麟芯片&#xff0c;拥有强大的计算能力和出色的能效比。无论是…

蓝桥杯23年第十四届省赛真题-填充|DFS,贪心

题目链接&#xff1a; 1.填充 - 蓝桥云课 (lanqiao.cn) 蓝桥杯2023年第十四届省赛真题-填充 - C语言网 (dotcpp.com) 说明&#xff1a; dfs就不再多说了&#xff0c;对于每个?都有0和1两个分支&#xff0c;数据范围是&#xff1a; 那么有m个 ?&#xff0c;时间复杂度就是…

Redis部署中的问题总汇

前言&#xff1a;本文内容为实操记录&#xff0c;仅供参考&#xff01; Redis安装参考这篇文章&#xff1a;http://t.csdnimg.cn/G15Mv 本文是安装及使用过程中遇到的问题总结。 redis在解压完之后&#xff0c;使用make进行编译&#xff08;在安装目录进行编译&#xff09;。如…

2015年认证杯SPSSPRO杯数学建模B题(第二阶段)替换式密码全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 B题 替换式密码 原题再现&#xff1a; 历史上有许多密码的编制方法。较为简单的是替换式密码&#xff0c;也就是将文中出现的字符一对一地替换成其它的符号。对拼音文字而言&#xff0c;最简单的形式是单字母替换加密&#xff0c;也就是以每个…

YOLOv9 实现多目标跟踪

YOLOv9项目结合了YOLOv9的快速目标检测能力和DeepSORT的稳定跟踪能力&#xff0c;实现了对视频流中多个对象的实时、准确检测和跟踪。在具体应用中&#xff0c;该项目能够对视频中的行人、车辆或其他物体进行实时定位、识别和持续跟踪&#xff0c;即使在复杂环境、对象互相遮挡…

上海市青少年算法2024年3月月赛(丙组)试题解析

T1 最近的数字 内存限制: 256 Mb 时间限制: 1000 ms 题目描述 给定两个正整数 n 与 d ,请找到所有最接近 n 且是 d 的倍数的整数。 输入格式 第一行:单个整数表示 n 第二行:单个整数表示 d 输出格式 若干行:每行一个整数,表示满足要求的答案,若有多个数字满足要求,则…

QT布局管理和空间提升为和空间间隔

QHBoxLayout&#xff1a;按照水平方向从左到右布局&#xff1b; QVBoxLayout&#xff1a;按照竖直方向从上到下布局&#xff1b; QGridLayout&#xff1a;在一个网格中进行布局&#xff0c;类似于HTML的table&#xff1b; 基本布局管理类包括&#xff1a;QBoxLayout、QGridL…

python面试题(36~50)

36、如何取一个整数的绝对值? 这可以通过abs函数来实现。 abs(2) #> 2 abs(-2) #> 2 37、如何将两个列表组合成一个元组列表? 可以使用zip函数将列表组合成一个元组列表。这不仅仅限于使用两个列表。也适合3个或更多列表的情况。 a [a,b,c] b [1,2,3] [(k,v) fo…

已解决:guava报错,由jar包冲突引起

maven项目中引用了最新版的谷歌guava包 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>33.1.0-jre</version> </dependency> 编译没问题,然后运行时报错 java.lang.NoSuchMetho…

6.RGB转YCbcr

1.方法 RGB转灰度有很多种方式   1.将RGB中任意分量拿出来当做灰度值。   2.取RGB三通道的均值来当灰度值。   3.将RGB转YUV(YCbCr)然后取Y分量作为灰度值。   其余的几种实现方式较为简单&#xff0c;这里不做介绍。重点实现RGB转YCbCr。 1.1 YUV(YCbCr)格式 Y表示亮…