第2章 线性表
2.2 线性表的顺序表示
2.2.1 顺序表的定义
线性表的顺序存储又称顺序表。它是用一组地址连续的存储单元依次存储数据元素,也就是说顺序表中元素的逻辑顺序与其物理顺序相同
设线性表L存储的起始位置为LOC(A),sizeof(ElemType)是每个数据元素所占存储空间的大小,则L中第n个元素的内存地址是 LOC(A)+(n-1)*sizeof(ElemType),即这是一个等差数列
线性表中的任一元素都可以随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。在高级语言中,我们通常用“静态或动态数组”(注意:不同的高级语言对于该类型的数据结构名称可能不一样)来描述线性表的顺序存储结构
//静态数组
#define MaxSize 50
typedef struct{
ElemType data [MaxSize];
int length;
}SqList;
//动态数组
#define MaxSize 100
typedef struct{
ElemType *data;
int MaxSize,length;
}SqList;
顺序表最主要的特点是随机访问,顺序表的存储密度也比较高
2.2.2 顺序表上基本操作的实现
(1)插入操作
在顺序表L的第i(1<i||<L.length+1)个位置插入元素(这里有个判断逻辑,先判断要插入的第i个位置是否合法)
插入操作的时间复杂度:
1)最好情况:在表尾插入,元素后移语句将不执行,时间复杂度为O(1)
2)最坏情况:在表头插入,n个元素皆后移一位,时间复杂度O(n)
3)平均情况:表中n个元素实际上形成了n+1个可插入位置,则每个位置的插入概率为pi=1/(n+1),则需要移动的平均次数是pi**(1+2+3,…,+n)=pi*n(1+n)/2=1/(n+1)*n(n+1)/2=n/2,则时间复杂度为O(n)
(2)删除操作
1)最好情况:删除表尾元素,无需移动元素,时间复杂度为O(1)
2)最坏情况:删除表头元素,需移动n-1个元素,时间复杂度为O(n)
3)平均情况:每个被删掉的元素概率为pi=1/n,当删除第i个元素时,需要移动n-i个元素,求均值 pi*[(n-1)+,…,+(n-n)]=pi*n(n-1)/2=(n-1)/2
(3)按值查找
最好情况:查找的元素就在表头,仅需比较一次,时间复杂度为O(1)
最坏情况:查找的元素在表尾(或不存在)时,需要比较n次,时间复杂度为O(n)
平均情况:E=pi*n(n+1)/2=n+1/2,平均时间复杂度为O(n)