一、引题
本周在做力扣上的算法题(删除排序数组中的重复项)时,遇到了超出时间限制的问题,后来才知道是我设计的算法时间复杂度过高,于是我就对list的各个基本操作和常用函数的复杂度作了个了解。
二、背景知识
1.数组是一种线性表结构,其用一块连续的内存空间,来存储一组具有相同类型的数据
2.时间复杂度,也叫做渐进时间复杂度,通常用大O公式书写,表示代码的执行时间随数据规模增长的变化趋势,而非真正的执行时间。因此大O关注的是变化趋势。
三、列表(list)特点
1.底层基于数组实现
python list本质上是一个over-allocate的数组,啥叫over-allocate呢?就是当底层数组容量满了而需要扩充的时候,python依据规则会扩充多个位置出来。比如初始化列表array=[1, 2, 3, 4],向其中添加元素23,此时array对应的底层数组,扩充后的容量不是5,而是8。这就是over-allocate的意义,即扩充容量的时候会多分配一些存储空间。这样做的优点当然是提高了执行效率,否则每次添加元素,都要对底层数组进行扩充,效率是很低下的。另外,当列表存储的元素在变少时,python也会及时收缩底层的数组,避免造成内存浪费。这里可以通过对列表的实践,验证扩充与收缩的过程(通过 sizeof()或sys.getsizeof()查看内存变化,并推算容量值)。
2.属于引用数组
>>> a = [1, 2, 3, 4]
>>> a.__sizeof__()
72
>>> b = ['hello', 'world', 'mac']
>>> b.__sizeof__()
64
>>> c = [int('10'), str(8)]
>>> c.__sizeof__()
56
>>> d = 23
>>>
>>> l