python中的队列
在 Python 中,队列(Queue)通常使用 collections.deque
来实现,因其提供了高效的从两端添加和删除元素的操作。队列通常遵循 先进先出(FIFO) 的原则,也就是最先插入的元素最先被移除。
队列的基本操作:
append(x)
: 将元素x
加入队列的尾部。popleft()
: 移除并返回队列的头部元素。appendleft(x)
: 将元素x
加入队列的头部(虽然一般队列不会使用这个操作,但它也能完成双端队列的操作)。- pop(): 移除并返回队列的尾部元素。
示例代码:
from collections import deque # 创建一个空的队列 queue = deque() # 入队(将元素添加到队列的尾部) queue.append(1) # 队列 -> [1] queue.append(2) # 队列 -> [1, 2] queue.append(3) # 队列 -> [1, 2, 3] # 出队(从队列的头部移除元素) print(queue.popleft()) # 输出: 1, 队列 -> [2, 3] print(queue.popleft()) # 输出: 2, 队列 -> [3] # 查看当前队列内容 print(queue) # 输出: deque([3]) # 再次入队 queue.append(4) # 队列 -> [3, 4] print(queue) # 输出: deque([3, 4]) # 再次出队 print(queue.popleft()) # 输出: 3, 队列 -> [4]
解释:
append(x)
:将元素x
插入队列的尾部(加入到队列的后面)。popleft()
:从队列的头部移除并返回元素。这个操作遵循 FIFO(先进先出)原则。
队列的典型应用:
队列的 FIFO 特性使得它非常适用于很多需要保持顺序的应用,尤其是广度优先搜索(BFS)等场景。
队列的算法题使用场景:
-
广度优先搜索(BFS):
- BFS 通常使用队列来逐层遍历图或树的节点。每次处理一个节点时,将其邻接节点按顺序添加到队列中。
from collections import deque def bfs(graph, start): queue = deque([start]) visited = set([start]) while queue: node = queue.popleft() print(node) # 访问节点 for neighbor in graph[node]: if neighbor not in visited: visited.add(neighbor) queue.append(neighbor) graph = { 1: [2, 3], 2: [1, 4], 3: [1], 4: [2] } bfs(graph, 1) # 从节点 1 开始广度优先搜索 -
模拟队列:
队列也经常用于模拟现实世界中的排队场景,比如任务调度、流量控制等。- 在算法题中,通常我们用队列来处理按顺序处理的任务,或者是有限的容量限制任务。
-
滑动窗口算法:
队列在滑动窗口问题中也很常见,尤其是求解 最大值/最小值 等窗口内的一些问题。from collections import deque def maxSlidingWindow(nums, k): queue = deque() result = [] for i, num in enumerate(nums): # Remove elements that are out of this window if queue and queue[0] < i - k + 1: queue.popleft() # Remove elements that are less than the current number while queue and nums[queue[-1]] < num: queue.pop() queue.append(i) if i >= k - 1: result.append(nums[queue[0]]) return result nums = [1,3,-1,-3,5,3,6,7] k = 3 print(maxSlidingWindow(nums, k)) # Output: [3, 3, 5, 5, 6, 7]
重点总结:
-
deque
是 Python 中非常高效的队列实现,提供 O(1) 的时间复杂度来在队列两端进行添加和删除操作。 -
队列操作:
append(x)
:将元素x
添加到队尾。popleft()
:移除并返回队头元素。appendleft(x)
:将元素x
添加到队头(可选,适用于双端队列的场景)。
-
队列是广度优先搜索(BFS)等需要按顺序处理任务的算法中的重要数据结构。
小结:
deque
提供了非常高效的队列操作,并且在广度优先搜索、滑动窗口等算法中非常有用。在刷题中,特别是在处理图、树和序列类问题时,队列(deque
)经常被用来维护处理顺序和支持高效的插入/删除操作。
本文作者:清澈的澈
本文链接:https://www.cnblogs.com/lmc7/p/18658388
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2024-01-07 分布式事务管理