【2月第四周学习记录】数据结构与算法王卓-第二章线性表-顺序存储结构(函数定义篇)

目录

1. 预定义常量与类型

2. 函数定义

2.1 函数目录

2.2 初始化函数init

2.3 四种简单函数:销毁函数Destroy,清空函数Clear,求长度函数length,判断是否为空函数Isempty

2.4 取值函数GetElem

2.5 查找函数LocateElem

2.6 插入函数ListInsert

思路

开始编程

时间复杂度分析 (平均时间复杂度)

2.7 删除函数ListDelete

思路

程序示例​

时间复杂度分析(平均时间复杂度)

3. 顺序表的优缺点


1. 预定义常量与类型

2. 函数定义

2.1 函数目录

2.2 初始化函数init

1.定义时使用&L,会直接创建一个L

2.new成功,返回的是一片区域的首指针;失败返回的是null

所以if判断中(!L.elem),如果new分配成功,则括号内等于非;分配失败则括号内等于

(!null=true),随后exit-2跳出

2.3 四种简单函数:销毁函数Destroy,清空函数Clear,求长度函数length,判断是否为空函数Isempty

由于是new出的空间,可以使用delete释放

2.4 取值函数GetElem

注意:第n位的实际下标是n-1

所有操作只执行一次,算法时间复杂度为常量级O(1)

2.5 查找函数LocateElem

注意:返回的是序号,所以elem[i]满足应返回 i+1.

使用while语句的改写方法:

while(L.elem[i]!=e && i<L.length) i++;
if (i<L.length) 
    return i+1;
else
    return False;

ASL: Average Search Length 

平均搜索长度,可理解为数学期望 

2.6 插入函数ListInsert

思路

开始编程

异常情况1:插入位置不对

假设有n个元素,原数组为a[n-1], 则合理的插入位置为a[0]~a[n],即第1位到n+1位

Status ListInsert_sq(SqList &L, int i, Elemtype e){
    if(i<1||i>L.length+1)
    return ERROR;

异常情况2:数组的存储空间已经放满了。

假设有n个元素,合理的元素数量应小于数组长度

if(L.length == MAXSIZE)
    return ERROR;

 从最后一位开始,从后往前将每一位后移:

for(j = L.length-1; j>=i-1; j--)
    L.elem[j+1] = L.elem[j];

将新元素e放入i-1号位,数组长度+1:

L.elem[i-1] = e;
L.length ++;
return OK;}

时间复杂度分析 (平均时间复杂度)

老师版本

元素可插入的位置为第1位~第n+1位,每个位置的可能性为 \frac{1}{n+1} 。依次乘以每个位置所需的移动次数x,x+i=n+1 (共n+1位)可得x=n+1-i,于是E=PiXi

*图中老师画圈部分为Pi,横线部分为每项所需移动次数xi。是典型的数学期望计算式。

 我的版本

最好的情况,插入在最后,共需移动0次;最差的情况,插入在最首,共需移动n次。

插入每个位置的几率相等,且对应移动次数为等差数列。所以数学期望为 \frac{(0+n)}{2}=\frac{n}{2} .

时间复杂度为 O(n) 级。 

2.7 删除函数ListDelete

思路

本例中,第二步省略

程序示例

*注意:删除第i个,其实是删除数组中的a[i-1]。应从a[i-1]开始继承直接后继的值。

时间复杂度分析(平均时间复杂度)

元素可插入的位置为第1位~第n位,每个位置的可能性为 \frac{1}{n} 。依次乘以每个位置所需的移动次数x=n-i。于是E=PiXi

思路二:最好的情况,删除在最后,共需移动0次;最差的情况,删除在最首,共需移动n-1次。删除每个位置的几率相等,且对应移动次数为等差数列。所以数学期望为 \frac{0+(n-1)}{2}

时间复杂度为 O(n) 级。

3. 顺序表的优缺点

优点

随机存取:可以任意存取值,每次只进行一次计算,时间复杂度为常量级。

缺点

1)插入,删除时,需要大量的移动操作 

2)为了能有空间存下所有元素,我们一般定义数组时会给足空间。然而,当元素特别少时,就会浪费大量存储空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值