python的list和tuple
python的list和tuple采用了顺序表的实现技术。
tupel是不变的表,因此不支持任何该表其内部状态的操作。在其他方面,他与list的性质相似。因此下面将集中关注list的情况。
list的基本实现技术
python的便准类型list就是一种元素个数可变的线性表,可以加入和删除元素,在各种操作中维持已有元素的顺序。其重要的实现约束还有:
- 基于下标的高效元素访问和更新,时间复杂度为O(1)
- 允许任意加入元素,而且在不断加入元素过程中,表对象的标识(id)不变
- 由于要求元素访问O(1),并能维持元素的顺序,这就要求表只能采取连续表技术,表中元素保存在连续的内存里
- 要求能容纳任意多的元素,就必须能更换元素存储区。要想在更换元素存储区时list对象的标识唯一不变,只能采取分离式实现技术
在python的官方实现中,list就是一种采用分离式技术实现的动态顺序表。
python的采用了元素存储区调整策略,如果需要反复加入元素,用lst.insert(len(lst), x)比在一般位置插入的效率高。python提供了另一等价的lst.append(x)方法。
在python的官方系统中,list采用了如下的实际策略:
- 在建立空表(或很小的表)时,系统分配一块能容纳8个元素的存储区
- 在执行插入操作(insert或append等)时,如果元素区满,就换一块4倍大的存储区。如果当时的表已经很大,系统会改变策略,换存储区时容量只会加倍
- 很大,目前的值为50000。是为避免造成空间浪费
通过这套技术实现的list,尾端加入元素的平均时间复杂度为O(1).
list的主要操作性质
- len(.)是0(1)的操作,因为表中必须记录元素个数,自然可以简单的取用
- 元素的访问和赋值,尾端的加入和尾端的删除(包括尾端切片删除)均是O(1)操作
- 一般位置的元素加入、切片替换、切片删除、表拼接(extend)等都是O(n)操作
- pop操作默认删除表尾的元素并将其返回,时间复杂度O(1)。一般情况的pop操作(非表尾)为O(n)的时间复杂度