Python set,list,dict基本操作的时间复杂度

写在最前
不管是刷题还是平时项目中,程序的时间复杂度都是评价程序好坏的一个很重要的因素,但是一些内置函数的时间复杂度由于不是自己编写,因此需要自行记忆,本篇文章是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))

你可能感兴趣的:(python)