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

python标准库--collections - 高性能数据结构在算法比赛的应用

目录

一、deque双端队列

1.头部删除元素popleft()

2.BFS(广度优先搜索)优化

3.滑动窗口(双指针)

4.实现栈或队列

5. 双向遍历与操作


一、deque双端队列

  • 特点:支持两端 O (1) 时间复杂度的添加和删除操作,比列表(list)的左端操作(如list.insert(0, x))高效得多。
  • 常用方法
    • append(x)/appendleft(x):右端 / 左端添加元素。
    • pop()/popleft():右端 / 左端删除元素。
    • rotate(n):循环移动元素(n>0右移,n<0左移)。
    • maxlen:固定队列长度(超出时自动删除对侧元素)。
  • 参数:初始化时可传入迭代对象,如deque([1,2,3]),或指定maxlen=5
  • 优点
    • 高效处理队列(FIFO)和栈(LIFO)场景。
    • 滑动窗口场景中,可快速维护窗口内元素(如删除过期元素)

1.头部删除元素popleft()

import time
from collections import deque
list1 = list(range(1000_0000))
X1 = time.time()
for _ in range(1000):list1.pop(0)
print(time.time()-X1)list2 = deque(range(1000_0000))
X1= time.time()
for _ in range(1000):list2.popleft()
print(time.time()-X1)
#8.393102645874023
#0.0恐怖

2.BFS(广度优先搜索)优化

在 BFS 中,需要频繁从队列头部弹出元素、从尾部添加元素。dequepopleft()操作时间复杂度为 O (1),比列表的pop(0)更高效(列表的pop(0)是 O (n))。

实例:二叉树遍历

from collections import dequeclass TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef levelOrder(root):if not root:return []queue = deque([root])  # 初始化队列result = []while queue:node = queue.popleft()  # O(1) 弹出队首元素result.append(node.val)if node.left:queue.append(node.left)  # O(1) 添加到队尾if node.right:queue.append(node.right)return result

3.滑动窗口(双指针)

from collections import dequedef maxSlidingWindow(nums, k):result = []window = deque()  # 存储索引for i in range(len(nums)):# 移除窗口外的元素if window and window[0] <= i - k:window.popleft()# 保持队列单调递减while window and nums[window[-1]] < nums[i]:window.pop()window.append(i)# 窗口形成后记录最大值if i >= k - 1:result.append(nums[window[0]])return result

4.实现栈或队列

from collections import dequeclass MyQueue:def __init__(self):self.queue = deque()def push(self, x):self.queue.append(x)  # O(1)def pop(self):return self.queue.popleft()  # O(1)def peek(self):return self.queue[0]def empty(self):return len(self.queue) == 0

5. 双向遍历与操作

from collections import dequedef isPalindrome(s):dq = deque(s)while len(dq) > 1:if dq.popleft() != dq.pop():  # 两端同时弹出比较return Falsereturn True

相关文章:

  • 机器学习第七讲:概率统计 → 预测可能性,下雨概率70%就是典型应用
  • 学习黑客Windows 病毒与威胁防护
  • MySQL全量、增量与恢复
  • wordcount在mapreduce的例子
  • 荣耀手机,系统MagicOS 9.0 USB配置没有音频来源后无法被adb检测到,无法真机调试的解决办法
  • android setImageResource和setBackgroundResource区别
  • 小红书代运营服务商综合排名分析
  • MiniCPM-V
  • 无线定位之 三 SX1302 网关源码 thread_gps 线程详解
  • SQL:JOIN 进阶
  • Tenacity 高级使用指南:Python 重试机制的终极解决方案
  • 学习日志04 java
  • MYSQL之表的约束
  • Redis 中常见的数据类型有哪些?
  • 深度强化学习有什么学习建议吗?
  • telnetlib源码深入解析
  • FanControl(电脑风扇转速控制软件) v224 中文版
  • python学习打卡day23
  • DHCP自动分配IP
  • 仪器设备行业实验室管理现状 质检LIMS系统在仪器设备行业的应用
  • 哈马斯表示已释放一名美以双重国籍被扣押人员
  • 从采购到销售!市场监管总局指导行业协会防控肉品风险
  • 火车站员工迟到,致出站门未及时开启乘客被困?铁路部门致歉
  • 言短意长|西湖大学首次“走出西湖”
  • 干部任职公示:陕西宁强、镇安两县县长拟进一步使用
  • 交涉之政、交涉之学与交涉文献——《近代中外交涉史料丛书》第二辑“总序”