Python 容器的时间复杂度

26 篇文章 0 订阅
7 篇文章 4 订阅
本文介绍了Python中列表、双端队列、集合和字典的各种操作的时间复杂度。列表在开头插入和删除元素的时间复杂度较高,适合随机访问;双端队列适合频繁在两端操作;集合查找效率高,适合不重复元素;字典提供快速的键值对存取。选择容器应根据具体应用场景来确定。
摘要由CSDN通过智能技术生成

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。



本文介绍了 Python 中各种容器的相关操作的时间复杂度,包括列表 List、双端队列 collections.deque、集合 set、字典 dict。

列表 List

列表是 Python 中常用的容器之一,它的时间复杂度如下:

操作平均时间复杂度最坏时间复杂度
CopyO(n)O(n)
AppendO(1)O(1)
Pop lastO(1)O(1)
Pop intermediateO(n)O(n)
InsertO(n)O(n)
Get itemO(1)O(1)
Set itemO(1)O(1)
Delete itemO(n)O(n)
IterateO(n)O(n)
Get sliceO(k)O(k)
Del sliceO(n)O(n)
Set sliceO(n+k)O(n+k)
ExtendO(k)O(k)
SortO(n log n)O(n log n)
MultiplyO(nk)O(nk)
x in sO(n)
min(s),max(s)O(n)
Get lengthO(1)O(1)

Python 中的列表是动态数组,它的底层是一个数组,当列表的长度超过数组的长度时,会重新分配一个更大的数组,然后将原数组中的元素复制到新数组中,这个过程的时间复杂度是 O ( n ) O(n) O(n)。除此之外,在列表的开头插入和删除元素的时间复杂度都是 O ( n ) O(n) O(n),如果需要频繁地在列表的开头插入和删除元素,可以使用双端队列 collections.deque。


双端队列 collections.deque

双端队列是 Python 中的标准库 collections 中的一个容器,它的时间复杂度如下:

操作平均时间复杂度最坏时间复杂度
CopyO(n)O(n)
appendO(1)O(1)
appendleftO(1)O(1)
popO(1)O(1)
popleftO(1)O(1)
extendO(k)O(k)
extendleftO(k)O(k)
rotateO(k)O(k)
removeO(n)O(n)
Get LengthO(1)O(1)

双端队列的底层是一个双向链表,它在头尾两端的操作都比较块,但对中间的操作仍然较慢,在需要频繁地在列表的开头插入和删除元素时,可以使用双端队列 collections.deque。


集合 set

集合是 Python 中常用的容器之一,使用 hash 实现,元素查找效率极高,它的时间复杂度如下:

操作平均时间复杂度最坏时间复杂度说明
x in sO(1)O(1)
Union s|tO(len(s) + len(t))
Intersection s&tO(min(len(s), len(t)))O(len(s) * len(t))replace “min” with “max” if t is not a set
Multiple intersection s1&s2&…&sn(n-1)*O(l) where l is max(len(s1),…,len(sn))
Difference s-tO(len(s))
s.difference_update(t)O(len(t))
Symmetric Difference s^tO(len(s))O(len(s) * len(t))
s.symmetric_difference_update(t)O(len(t))O(len(t) * len(s))

从表中我们可以看出 difference s-ts.difference(t) 与就地差分 s.difference_update(t) 的时间复杂度是不同的,前者的时间复杂度是 O ( l e n ( s ) ) O(len(s)) O(len(s)),对于 s 中的每个元素,如果它不在 t 中,则将其添加到新集合中;后者的时间复杂度是 O ( l e n ( t ) ) O(len(t)) O(len(t)),对于 t 中的每个元素,请将其从 s 中删除。

所以我们在选择方法时,应考虑集合 s 和 t 哪个更长,以及我们是否需要新集合。


字典 dict

字典是 Python 中常用的容器之一,也是使用 hash 实现,可以通过 key 来快速查找 value,它的时间复杂度如下:

操作平均时间复杂度最坏时间复杂度
k in dO(1)O(1)
CopyO(n)O(n)
Get itemO(1)O(n)
Set itemO(1)O(n)
Delete itemO(1)O(n)
IterateO(n)O(n)

总结

在实际应用中,我们应该根据具体的场景来进行选择,而不是盲目地使用单一容器。

在需要高速度的情况下,我们可以选择常用操作时间复杂度低的容器,但是需要注意的是,效率优化后的容器可能会占用更多的内存,所以也并不是无脑使用效率更高的容器就行了,必须结合场景进行考量,选择最合适的容器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小嗷犬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值