写在最前
不管是刷题还是平时项目中,程序的时间复杂度都是评价程序好坏的一个很重要的因素,但是一些内置函数的时间复杂度由于不是自己编写,因此需要自行记忆,本篇文章是Python中set,list和dict基本操作的时间复杂度总结,方便查找。
List
python的列表内部实现是数组(具体实现要看解析器, CPython的实现 ),因此就有组数的特点。超过容量会增加更多的容量,set, get 是 O ( 1 ) O(1) O(1),但del, insert, in的性能是 O ( n ) O(n) O(n)。具体的看下表,'n'
是容器中当前的元素数, 'k'
需要操作的元素个数
Operation | Average Case | Amortized Worst Case |
---|---|---|
copy | O(n) | O(n) |
append | O(1) | O(1) |
insert | O(n) | O(n) |
get item | O(1) | O(1) |
set item | O(1) | O(1) |
delete | O(n) | O(n) |
iteration | O(n) | O(n) |
get slice | O(k) | O(k) |
del slice | O(n) | O(n) |
set slice | O(n+k) | O(n+k) |
extend | O(k) | O(k) |
sort | O(nlogn) | O(nlogn) |
multiply | O(nk) | O(nk) |
x in s | O(n) | |
min(s), max(s) | O(n) | O(n) |
get length | O(1) | O(1) |
dict
关于字典需要了解的是hash函数和哈希桶。一个好的hash函数使到哈希桶中的值只有一个,若多个key hash到了同一个哈希桶中,称之为哈希冲突。查找值时,会先定位到哈希桶中,再遍历hash桶。更详细的信息请点这里。在hash基本没有冲突的情况下get, set, delete, in方面都是 O ( 1 ) O(1) O(1)。自己的操作不会超过 O ( n ) O(n) O(n)
Operation | Average Case | Amortized Worst Case |
---|---|---|
copy | O(n) | O(n) |
get item | O(1) | O(n) |
set item | O(1) | O(n) |
del item | O(1) | O(n) |
x in s | O(1) | O(n) |
iteration | O(n) | O(n) |
set
内部实现是dict的。在in操作上是O(1), 这一点比list要强。也有list不存在的差运算
Operation | Average Case | Amortized Worst Case |
---|---|---|
x in s | O(1) | O(n) |
union s&t | O(len(s)+len(t)) | |
intersection s&t | O(min(len(s), len(t)) | O(len(s)*len(t)) |
multiple intersection s1&s2&…&sn | (n-1)*O(l) where l is max(len(s1),…,len(sn)) | |
difference s-t | O(len(s)) |