常用数据类型中,整型,浮点型,字符串类型的操作复杂度大多是O(1),这里主要讨论一下列表和字典相关操作的复杂度。
列表操作中
- 最常用的是按索引取值和赋值,如v = a[i],a[i] = v,由于列表随机访问的特性,这两个操作实际执行时间与列表大小无关,所以为O(1)
- 另一个是列表增长,可以使用append()和__add()__“+”。其中使用lst.append(v),直接在列表lst末尾拼接列表v,所以复杂度为O(1);而使用lst = lst + [v],执行复杂度为O(n+k),其中,n是列表lst的长度,k是列表v的长度,该操作需要先生成两个列表,然后再将生成的列表拼接。
- 还有常用的pop操作,直接使用lst.pop(),复杂度为O(1),但如果使用的是lst.pop(i),那么算法的复杂度为O(n),因为将i位置的元素pop后,需要将i位置后面的元素前移。前移操作的综合复杂度为O(n)。
此外,列表其他操作及对应复杂度的关系有: insert(i,item) O(n)
del operator O(n)
iteration O(n)
contains(in) O(n)
get slice O(n)
del slice O(n+k)
concatenate O(k)
reverse O(n)
sort O(nlogn)
multiply O(nk)
字典操作中
copy O(n)
get item O(1)
set item O(1)
del item O(1)
cotains(in) O(1)
iteration O(n)
虽然python对基本操作做了封装,但是对这些封装的基本操作方法的复杂度有所了解,有助于我们在编写程序时提高程序性能。更多python算法复杂度可以到官网查看:https://wiki.python.org/moin/TimeComplexity