当前位置: 首页 > 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

http://www.xdnf.cn/news/408871.html

相关文章:

  • LVGL(线条控件lv_line)
  • CentOS 和 RHEL
  • FPGA----基于ZYNQ 7020实现定制化的EPICS程序开发
  • AI Agent开发第64课-DIFY和企业现有系统结合实现高可配置的智能零售AI Agent
  • 智能外呼系统的实用性
  • LGDRL:基于大型语言模型的深度强化学习在自动驾驶决策中的应用
  • bea算法,大模型
  • Linux文件系统
  • C++11新特性(1)
  • Aware和InitializingBean接口以及@Autowired注解失效分析
  • 内存泄漏系列专题分析之十一:高通相机CamX ION/dmabuf内存管理机制Camx ImageBuffer原理
  • 【论信息系统项目的质量管理】
  • 制作一款打飞机游戏45:简单攻击
  • 基于 ABP vNext 框架实现高可用高性能的 Modbus 通信网关
  • 图像识别技术的定义与原理
  • 新手安装java所有工具(jdk、idea,Maven,数据库)
  • 26考研|数学分析:函数列与函数项级数
  • Java MVC架构在当今时代的技术解析
  • UART16550 IP core笔记二
  • 从0到1:Python机器学习实战全攻略(8/10)
  • 小白学习java第18天(下):mybatis
  • SHAP分析!Transformer-GRU组合模型SHAP分析,模型可解释不在发愁!
  • 5倍无损压缩+50 倍速转换HD Video 4K/8K 视频处理
  • 前端项目2-01:个人简介页面
  • 系统架构设计(五):构件
  • 服务器共享文件夹如何实现外网访问
  • [数据结构高阶]并查集初识、手撕、可以解决哪类问题?
  • hdfs-客户端操作-文件上传
  • 记一次redis未授权被种挖矿
  • Linux常见命令