本文是个人笔记,仅用于学习分享,素材来自青岛大学王卓老师的教学视频,如有侵权,请留言作删文处理。
📚 Week02_11_线性表的顺序表示和实现6–删除算法
📚 Week02_11_01 顺序表的删除
(1) 删除位置在顺序表的最后面
(2) 删除位置在顺序表的中间
(3) 删除位置在顺序表的最前面
⚠️ 注意:删除顺序表的位置范围在:[0, n]
📚 Week02_11_02 顺序表的删除算法思想
线性表的删除运算是指在表的第 i (1 ≤ i ≤ n) 个结点,
使长度为 n 的线性表 (a1, a2, …, ai-1, ai, ai+1, …, an) 变成长度为 n - 1 的线性表 (a1, a2, …, ai-1, ai+1, …, an)
算法思想:
① 判断删除位置 i 是否合法(合法值是 1 ≤ i ≤ n)。
② 将欲删除的元素保留在 e 中。
③ 将第 i +1 至第 n 位的元素依次向前移动一个位置。
④ 表长减 1 ,删除成功返回 OK。
📚 Week02_11_03 顺序表的删除算法伪代码实现
Status ListDelete_Sq(SqList &L, int i)
{
// (1)判断 i 值是否合法
if(i < 1 || i > (L.length + 1))
return ERROR;
// (2)被删除元素之后的元素前移
for(j = i; j <= L.length - 1; j++)
L.elem[j-1] = L.elem[j];
// (3)表长 -1
L.length--;
return OK;
}
📚 Week02_11_04 顺序表的删除算法时间复杂度分析
算法时间主要耗费在移动元素的操作上:
⭐ 若删除尾结点,则根本无需移动(特别快);
⭐ 若删除首结点,则表中 n - 1 个元素全部前移(特别慢);
⭐ 若要考虑在各种位置删除(共 n 种可能)的平均移动次数,该如何计算?
各个位置都有可能删除,则每个位置删除的概率是 1 / n
删除第 1 个元素,需要移动 n - 1 个元素,平均移动次数:(n - 1) × ( 1 / n )
删除第 2 个元素,需要移动 n - 2 个元素,平均移动次数:(n - 2) × ( 1 / n )
删除第 3 个元素,需要移动 n - 3 个元素,平均移动次数:(n - 3) × ( 1 / n )
……
删除第 i 个元素,需要移动 n - i 个元素,平均移动次数:(n - i) × ( 1 / n )
……
则有:
顺序表删除算法的平均时间复杂度为:O( n )
学习笔记最后有微信公众号:惟CPP,欢迎关注,一起交流学习进步~