Python 各种集合内置方法的时间复杂度

Python集合交集判断的4种高效方法与优化策略 集合(Set)作为哈希表实现的数据结构,在Python中通过哈希值快速定位元素,实现O(1)复杂度的成员检测。其核心价值在于高效处理去重、交集等集合运算,特别适合用户权限校验、内容推荐等需要快速比对数据的场景。本文重点解析集合交集判断的底层原理,对比四种实现方式的性能差异:从O(n²)的传统遍历到O(n)的哈希优化方案,其中isdisjoint()方法凭借专用设计成为最优解。针对大数据量场景,提出分块处理、Bloom Filter等优化策略,并结合电商推荐、敏感词过滤等实际案例,展示如何通过集合操作提升Py 阅读详情

转自:http://www.orangecube.net/python-time-complexity

Python内置方法的时间复杂度

本文翻译自Python Wiki
本文基于GPL v2协议,转载请保留此协议。

本页面涵盖了Python中若干方法的时间复杂度(或者叫“大欧”,“Big O”)。该时间复杂度的计算基于当前(译注:至少是2011年之前)的CPython实现。其他Python的实现(包括老版本或者尚在开发的CPython实现)可能会在性能表现上有些许小小的差异,但一般不超过一个O(log n)项。

本文中,’n’代表容器中元素的数量,’k’代表参数的值,或者参数的数量。

列表(list)

以完全随机的列表考虑平均情况。

列表是以数组(Array)实现的。最大的开销发生在超过当前分配大小的增长,这种情况下所有元素都需要移动;或者是在起始位置附近插入或者删除元素,这种情况下所有在该位置后面的元素都需要移动。如果你需要在一个队列的两端进行增删的操作,应当使用collections.deque(双向队列)

操作 平均情况 最坏情况
复制 O(n) O(n)
append[注1] O(1) O(1)
插入 O(n) O(n)
取元素 O(1) O(1)
更改元素 O(1) O(1)
删除元素 O(n) O(n)
遍历 O(n) O(n)
取切片 O(k) O(k)
删除切片 O(n) O(n)
更改切片 O(k+n) O(k+n)
extend[注1] O(k) O(k)
排序 O(n log n) O(n log n)
列表乘法 O(nk) O(nk)
x in s O(n)  
min(s), max(s) O(n)  
计算长度 O(1) O(1)

双向队列(collections.deque)

deque (double-ended queue,双向队列)是以双向链表的形式实现的 (Well, a list of arrays rather than objects, for greater efficiency)。双向队列的两端都是可达的,但从查找队列中间的元素较为缓慢,增删元素就更慢了。

操作 平均情况 最坏情况
复制 O(n) O(n)
append O(1) O(1)
appendleft O(1) O(1)
pop O(1) O(1)
popleft O(1) O(1)
extend O(k) O(k)
extendleft O(k) O(k)
rotate O(k) O(k)
remove O(n) O(n)

集合(set)

未列出的操作可参考 dict —— 二者的实现非常相似。

操作 平均情况 最坏情况
x in s O(1) O(n)
并集 s|t O(len(s)+len(t))  
交集 s&t O(min(len(s), len(t)) O(len(s) * len(t))
差集 s-t O(len(s))  
s.difference_update(t) O(len(t))  
对称差集 s^t O(len(s)) O(len(s) * len(t))
s.symmetric_difference_update(t) O(len(t)) O(len(t) * len(s))

由源码得知,求差集(s-t,或s.difference(t))运算与更新为差集(s.difference_uptate(t))运算的时间复杂度并不相同!前者是将在s中,但不在t中的元素添加到新的集合中,因此时间复杂度为O(len(s));后者是将在t中的元素从s中移除,因此时间复杂度为O(len(t))。因此,使用时请留心,根据两个集合的大小以及是否需要新集合来选择合适的方法。

集合的s-t运算中,并不要求t也一定是集合。只要t是可遍历的对象即可。

字典(dict)

下列字典的平均情况基于以下假设:
1. 对象的散列函数足够撸棒(robust),不会发生冲突。
2. 字典的键是从所有可能的键的集合中随机选择的。

小窍门:只使用字符串作为字典的键。这么做虽然不会影响算法的时间复杂度,但会对常数项产生显著的影响,这决定了你的一段程序能多快跑完。

操作 平均情况 最坏情况
复制[注2] O(n) O(n)
取元素 O(1) O(n)
更改元素[注1] O(1) O(n)
删除元素 O(1) O(n)
遍历[注2] O(n) O(n)

注:
[1] = These operations rely on the “Amortized” part of “Amortized Worst Case”. Individual actions may take surprisingly long, depending on the history of the container.

[2] = For these operations, the worst case n is the maximum size the container ever achieved, rather than just the current size. For example, if N objects are added to a dictionary, then N-1 are deleted, the dictionary will still be sized for N objects (at least) until another insertion is made.


Python 算法基础篇:时间复杂度和空间复杂度简介 在学习和分析算法时,时间复杂度和空间复杂度是两个关键概念。它们帮助我们评估算法的性能和资源使用情况。本篇博客将为你介绍时间复杂度和空间复杂度的概念,并通过 Python 示例代码演示它们的应用。 阅读详情

相关推荐

【Python基础教程】3 . 算法的时间复杂度

算法时间复杂度是一个用于评估算法执行效率的关键指标,它衡量了算法执行时间随输入数据规模增长而变化的趋势。

m0_74195174的博客 1275

Python 时间复杂度计算

python 时间复杂度分析

qq_21370419的博客 1万+

STM32f103--ADC配置

2.对于规则通道,选中EXTI线路11或TIM8_TRGO作为外部触发事件,可以分别通过设置ADC1和ADC2的ADC1_ETRGREG_REMAP位和ADC2_ETRGREG_REMAP位实现。注意: 在双ADC模式里,当转换配置成由外部事件触发时,用户必须将其设置成仅触发主ADC,从ADC设置成软件触发,这样可以防止意外的触发从转换。2.在某些双ADC模式中,在完整的ADC1数据寄存器(ADC1_DR)中包含了ADC1和ADC2的规则转换数据。通过设置ADC_CR2寄存器的ADON位可给ADC上电。

weixin_51864506的博客 5312

python中max函数用法_python中的内置函数max()和min()及mas()函数的高级用法

max(iterable, *[, key, default])max(arg1, arg2, *args[, key])函数功能为取传入的多个参数中的最大值,或者传入的可迭代对象元素中的最大值。默认数值型参数,取值大者;字符型参数,取字母表排序靠后者。还可以传入命名参数key,其为一个函数,用来指定取最大值的方法。default命名参数用来指定最大值不存在时返回的默认值。ega.传入的多个参数的...

weixin_39963053的博客 3878

文华指标源码—区间彩带

这就是当年东方财富软件终端里主打经典的指标、主要揭示主力成本区域。

qq2054129753的博客 886

利用ENVI处理TIF文件,把多个tif整合到一个完整的tif,例如2003-2011年的tif整合到一个tif上。

利用ENVI处理TIF文件,把多个tif整合到一个完整的tif,例如2003-2011年的tif整合到一个tif上。

unique_sir的博客 1万+

python—时间复杂度

一、时间复杂度规则 1、计算时,往往只关注时间频度中最高次项,其他次要项和常数项忽略 例如: T=3*n^3+2*n^2+10000时间的复杂度: O(n^3) 2、顺序结构,时间复杂度按加法来计算 让用户输入2个列表,一个列表的长度为m另一个为n,对这2个列表分别求和 比较他们的和的大小 循环遍历,分别求和,比较大小 m步、n步 时间复杂度为O(m+n) 3、循环结构,时间复杂度按乘法来运算 T=n*n*3 4、分支结构:时间复杂度取最大值 5、没有特殊说明时,算法的时间复杂度都是指最坏的时间复杂度 最

python全栈 7711

Word多级标题出现黑块的解决思路(word 数字必须介于1-1638之间)

遇到多级目录出现黑块问题,看到一篇博客完美解决,在此记录。

AI_Optimization的博客 3714

Python 各种集合类内置方法的时间复杂度

转自:http://www.orangecube.net/python-time-complexity Python内置方法的时间复杂度 本文翻译自Python Wiki 本文基于GPL v2协议,转载请保留此协议。 本页面涵盖了Python中若干方法的时间复杂度(或者叫“大欧”,“Big O”)。该时间复杂度的计算基于当前(...

h 1321

STM32学习笔记(江协科技)-----OLED显示屏

SSD1306简介:•SSD1306是一款OLED/PLED点阵显示屏的控制器,可以嵌入在屏幕中,用于执行接收数据、显示存储、扫描刷新等任务••驱动接口:128个SEG引脚和64个COM引脚,对应128*64像素点阵显示屏••内置显示存储器(GDDRAM):128*64 bit128*8 ByteSRAM••供电:IC逻辑),VCC=7~15V(面板驱动)••通信接口:8位6800/8080并行接口,3/4线SPI。

lu322f的博客 1062

用ADS复现一篇MTT顶刊的GAN功率放大器:从理论推导到版图仿真的完整避坑指南

本文详细解析了如何利用ADS软件复现MTT顶刊中的E/F3类GaN功率放大器设计,从理论推导到版图仿真的全流程。通过核心设计理念解析、ADS环境配置、输出匹配网络优化等关键步骤,提供了一套完整的工程实践指南,帮助工程师跨越学术理论与实际应用的鸿沟,实现高效率射频功率放大器的设计。

weixin_30654583的博客 314

Python内置方法的时间复杂度(转)

Python内置方法的时间复杂度(转) 原文:http://www.orangecube.net/python-time-complexity本文翻译自Python Wiki本文基于GPL v2协议,转载请保留此协议。本页面涵盖了Python中若干方法的时间复杂度(或者叫“大欧”,“Big O”)。该时间复杂度的计算基于当前(译注:至少是2011年之前)的CPython实现。其他Python的...

憨憨松的博客 3767

TensorRT的安装:一步一步教会你如何安装TensorRT

TensorRT(Tensor Runtime)是由NVIDIA开发的一个用于深度学习推理(inference)优化的库,它可以在NVIDIA的GPU上加速神经网络模型的推理过程,从而提高模型的性能和效率。安装完成后,需要将CUDA的安装路径添加到系统环境变量中,以便系统能够找到CUDA的库文件。根据你安装的CUDA版本,将CUDNN的库文件复制到CUDA的安装目录中。要使用TensorRT,首先需要安装NVIDIA的CUDA和cuDNN库,并根据NVIDIA官方文档安装TensorRT。

Science prince的博客 2372

Python内置方法的时间复杂度

本文转自:http://www.orangecube.net/python-time-complexity Python内置方法的时间复杂度 本文翻译自Python Wiki 本文基于GPL v2协议,转载请保留此协议。 本页面涵盖了Python中若干方法的时间复杂度(或者叫“大欧”,“B...

Rosefinch 678

CloudCompare 二次开发(6)——插件中拖拽添加Qt窗口(区域生长算法为例)

手动拖拽的方式搭建Qt对话框界面的制作流程,以PCL中的点云区域生长算法为例进行制作。

点云侠的博客 2151

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Python中的len函数:全面解析与应用

Python中的len()函数是获取对象长度的核心工具,支持字符串、列表、字典等多种数据类型。它通过调用对象的__len__()方法实现,具有O(1)的时间复杂度,性能高效。len()常用于迭代控制、条件判断和数据验证等场景,也可以用于自定义类。虽然简单,但需注意其不支持没有实现__len__()方法的对象,且对超大容器可能有精度限制。与其他内置函数如range()、enumerate()配合使用时尤为强大,是Python编程中不可或缺的基础工具。

软件科学-郝学胜 3006

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

为什么set集合过滤停用词能那么快?

作者简介:小小明,Pandas数据处理专家,致力于帮助无数数据从业者解决数据处理难题。 上期我演示了高效过滤停用词的方法,这期我将带你重温Python基础中set集合和字典的使用方法,并讲解字典和集合的实现原理。本期同步更新的还另有一篇《词频统计的3种方法》。 文章目录set集合的基本用法set集合的创建Set集合的交集&并集&差集set的集合推导式set集合的常用内置方法字典生成式字典常用内置方法set集合为什么可以加速筛选字典和集合的基本概念字典和集合的存储原理字典和集合的操作原理插.

小小明-代码实体的专栏 4万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Python集合isdisjoint()方法详解与应用场景

集合是Python中基于哈希表实现的高效数据结构,常用于元素去重和快速查找。isdisjoint()作为核心集合操作方法,专门用于判断两个集合是否完全独立(无交集)。其底层实现通过遍历较小集合并检查元素存在性,具有O(min(m,n))的时间复杂度,比传统交集运算更高效。该方法在用户标签匹配、权限校验等场景表现优异,特别是在处理大规模数据时能避免不必要的集合创建。典型应用包括内容推荐系统的黑名单过滤、电商平台的商品属性匹配等,是Python数据处理的实用工具。

weixin_31309419的博客 191

<span class=“js_title_inner“>python全栈开发《63.判断两个集合中是否有相同的元素》</span>

判断两个集合是否包含相同的元素。1.isdisjoint的功能。2.isdisjoint的用法。1.isdisjoint的功能。2.isdisjoint的用法。

清菡的博客 62

Python 的内置函数 reversed

是一个用于序列反转的高效工具函数,它返回一个反向迭代器对象。Python 的内置函数。

IMPYLH的博客 616

Python基础教程之集合的定义、去重与交并差运算

💡基本定义集合的定义、去重与交并差运算是Python编程中的核心知识点之一。掌握这项技能对于提升编程效率和应用效果至关重要。1234567891011121314# Python示例代码# 本节演示集合的定义、去重与交并差运算的基本用法# 示例1:基础用法") # 输出:Hello, Python!# 示例2:变量定义"Python学习者"2595.5print(f"姓名: {name}")print(f"年龄: {age}")

2501_94114815的博客 214

python变量的类型集合_python基础篇:很有意思的数据类型,集合(set) 常用去去重...

python基础篇:很有意思的数据类型,集合(set) 常用去去重菜菜看天下 · 2天前Python集合(set),是一个很有意思的数据结构。从形式上看,它像字典有key但没有value,它的写法是这样的s = {'a', 'b', 'c'},是不是像一个没有value的字典?另一方面,它又像是一个用花括号替换了方括号的列表,但它不能像列表那样用索引访问元素。集合最常用的特性是元素不能重复,所以常...

weixin_32559133的博客 150

Python数据结构核心:列表、元组、字典、集合1小时速成指南

数据结构是编程的核心基础,用于高效组织和存储数据。Python作为动态类型语言,提供了列表、元组、字典和集合等内置数据结构,每种结构都有其独特的特性和适用场景。列表作为有序可变序列,适合存储需要频繁修改的数据集合;字典通过键值对映射实现快速查找,在数据处理和Web开发中具有重要价值。这些数据结构支持丰富的内置方法和推导式语法,能够显著提升开发效率。在实际应用中,数据结构经常组合使用,比如用列表存储字典实现复杂数据模型,或利用集合进行高效去重操作。掌握Python数据结构是进行数据处理、自动化脚本和Web开发

cuankuangzhong6373的博客 524

includes判断子集

includes判断子集 如果想要判断集合b是否是集合a的子集,可以直接调用c++中的includes方法,对STL对象均适用。 需要的头文件 #include<algorithm> 使用方法 sort(a.begin(),a.end()); sort(b.begin(),b.end()); includes(a.begin(),a.end(),b.begin(),b.end()); 因为要求必须已经以operator<进行排序,所以首先调用sort进行排序,再比较是否是子集

leadingfigure的博客 992
上一篇: Linux进程间通过pipe通信
下一篇: 八数码的八境界
Baoli1008
博客等级 码龄12年 70粉丝 293原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值