1. 什么是线性表
线性表是一些元素的序列,它维护着元素之间的一种线性关系。
元素为空的表称为空表,元素的个数为表的长度,元素的位置为该元素的下标。
除了首元素外,其余元素有且只有一个前驱元素;除了尾元素外,其余元素有且只有一个后继元素。
2. 顺序表
线性表的实现主要有两种:顺序表、链表
顺序表:表中元素是按照一定的顺序存放在一块足够大的连续的内存中,首元素放在开始位置,其余元素依次放置,元素之间的逻辑关系通过其物理位置表示。
2.1 元素的计算
对顺序表中元素的存取操作可以在 O(1) 时间内完成。
设顺序表存储区的起始位置(内存地址)为 l0 ,元素标号从 0 开始,元素 e0 的内存位置 Loc(e0)=l0 。表中每个元素需要的存储单元数为 c=size 。那么,元素 ei 的计算公式为: Loc(ei) = l0 + c*j
2.2 基本实现
在python中,列表是一种元素个数可变的线性表。因为列表对象的标识(id)不变,且元素个数课表,所以列表采用了分离式技术实现的动态顺序表。
分离式技术将表头信息和元素分开存储,能够保证在元素个数加到需要更换更大的存储空间时,列表对象 id 保持不变。
2.3 时间复杂度
对 python 中的列表进行操作
- len() 是 O(1) 操作,表中记录了元素个数;
- 通过下标访问元素,赋值,尾端加入和删除都是 O(1) 操作
- 一般位置的加入、切片、删除、拼接都是 O(n) 操作
对于 python 列表,没有考虑当前存储空间容量的问题,这些都是内部实现,当存储空间满时,会替换一块容量更大的空间。Python的实现是:
- 创建 list 时会分配一块能保存 8 个元素的存储空间;
- 当执行插入操作时,如果存储区满就换一块 4 倍大的存储区(为了降低更换存储区的频率);
- 如果表已经很大,目前默认是(50000),替换存储区时容量加倍(为了避免过多的空闲存储区);