当前位置: 首页 > news >正文

11. 线性表的顺序表示和实现(3)

本节主要介绍顺序表的查找、插入和删除操作。

本文部分ppt、视频截图来自:[青岛大学-王卓老师的个人空间-王卓老师个人主页-哔哩哔哩视频]

1. 顺序表上的查找操作

(1)什么是按值查找

给定一个值,顺序遍历线性表,看该值是否在线性表中,如果存在就返回元素位序,如果不存在,就返回0。

在这里插入图片描述

(2)顺序表的按值查找算法

  • 在线性表L中查找与指定值e相同的数据元素的位置
  • 从表的一端开始,逐个进行记录关键字和给定值的比较。找到,返回该元素的位置序号,未找到,返回0
//for语句实现:
int LocatedElem(SqList L,ElemType e){
//在线性表L中查找值为e的数据元素,返回其序号(是第几个元素)for(i = 0;i < L.length;i++)//查找成功,返回序号if(L.elem[i] == e)  return i+1;return 0; //查找失败,返回0
}//while语句实现
int LocatedElem(SqList L,ElemType e){
//在线性表L中查找值为e的数据元素,返回其序号(是第几个元素)i = 0;while (i < L.length && L.elem[i] != e)  i++;//查找成功,返回序号if(i < L.length)  return i+1;return 0; //查找失败,返回0
}

(3)顺序表的查找算法分析

  • 因为查找算法的基本操作为:记录的关键字同给定值进行比较
    在这里插入图片描述
  • 平均查找长度ASL(Average Search Length):
    为确定记录在表中的位置,需要与给定值进行比较的关键字的个数的期望值叫做算法的平均查找长度。如果e = g,那么平均查找长度为:(1 + 2 + 3 + 4 + 5 + 6 + 7) / 7 = 4
    在这里插入图片描述
    假设每个记录的查找概率相等: Pi = 1 / n
    则: ASLSS = \sum_{i=1}^{n}P_{i}C_{i}

2. 顺序表上的插入操作

(1)顺序表插入算法的思想

线性表的插入运算是指在表的第i(1≤i≤n+1)个位置上,插入一个新结点e,使长度为n的线性表(a1,…,ai-1,ai,…,an)变成长度为n+1的线性表(a1,…,ai-1,e,ai,…,an)

在这里插入图片描述

算法思想:

  1. 判断插入位置 i 是否合法。
  2. 判断顺序表的存储空间是否已满,若已满返回ERROR。
  3. 将第n至第ì 位的元素依次向后移动一个位置,空出第i个位置。
  4. 将要插入的新元素e放入第i个位置。
  5. 表长加1,插入成功返回OK。

(2)插入算法实现

Status ListInsert_Sq(SqList &L,int i,ElemType e){//i值不合法if(i < 1 || i > L.length+1)  return ERROR;//当前存储空间已满if(L.length == MAXSIZE) return ERROR;//插入位置及之后的元素后移for(j = L.length-1;j>=i-1;j--)L.elem[j+1] = L.elem[j];//将新元素e放入第i个位置L.elem[i-1] = e;//表长增1L.length++;return OK;
}

(3)顺序表插入算法分析

算法时间主要耗费在移动元素的操作上

  • 若插入在尾结点之后,则根本无需移动(特别快);
  • 若插入在首结点之前,则表中元素全部后移(特别慢);
  • 若要考虑在各种位置插入(共n+1种可能)的平均移动次数,该如何计算?
    在这里插入图片描述
  • 顺序表插入算法的平均时间复杂度为O(n)。

2. 顺序表上的删除操作

(1)顺序表删除算法的思想

线性表的删除运算是指将表的第i(1 ≤ i ≤ n)个结点删除使长度为n 的线性表(a1, …, ai-1, ai,ai+1,…,an )变成长度为n-1的线性表(a1, …, ai-1, ai+1,…,an )

算法思想:

  1. 判断删除位置 i 是否合法(合法值为1 ≤ i ≤ n)。
  2. 将欲删除的元素保留在e中。
  3. 将第i+1至第 n 位的元素依次向前移动一个位置。
  4. 表长减1,删除成功返回OK。

(2)删除算法实现

Status ListDelete_Sq(SqList &L,int i){//i值不合法if((i < 1) || (i > L.length))  return ERROR;//被删除元素之后的元素前移for (j = i;j <= L.length - 1; j++)L.elem[j-1] = L.elem[j];//表长减1L.length--;return OK;
}

(3)顺序表删除算法分析

算法时间主要耗费在移动元素的操作上

  • 若删除尾结点,则根本无需移动(特别快);
  • 若删除首结点,则表中 n-1个 元素全部前移(特别慢);
  • 若要考虑在各种位置删除(共 n 种可能)的平均移动次数,该如何计算?
    在这里插入图片描述
  • 顺序表删除算法的平均时间复杂度为O(n)。

3. 顺序表总结

  • 顺序表(线性表的顺序存储结构)的特点
  1. 利用数据元素的存储位置表示线性表中相邻数据元素之间的前后关系,即线性表的逻辑结构与存储结构一致
  2. 在访问线性表时,可以快速地计算出任何一个数据元素的存储地址,因此可以粗略地认为,访问每个元素所花时间相等
    这种存取元素的方法被称为随机存取法
  • 线性表的基本操作

在这里插入图片描述

  • 顺序表的操作算法分析

在这里插入图片描述

  • 顺序表的优缺点

在这里插入图片描述

http://www.xdnf.cn/news/988237.html

相关文章:

  • AI视频生成API:一站式视频生成解决方案
  • JAVA(Day_4
  • 网络管理【Linux/Unix/Windows】命令大全
  • 保障信号纯净:线材滤波器在复杂电磁环境中的作用
  • Java 8 Stream 流全面使用教程 - 完整版
  • 肩胛骨髓外浸润
  • Android11 Launcher3实现去掉抽屉改为单层
  • 汇编(cpu寄存器描述)
  • 字符串和内存函数(2)
  • MacBook M1 Pro下载安装MySql
  • Redis分布式缓存(RDB、AOF、主从同步)
  • force命令的使用
  • 图文教程——Deepseek最强平替工具免费申请教程——国内edu邮箱可用
  • 传统Web应用和RESTful API模式
  • javaee初阶-多线程
  • C++基础
  • Oracle集群OCR磁盘组掉盘问题处理
  • echart pie label.rich 颜色设置与项目同色
  • matlab红外与可见光图像配准算法
  • Flask 报错修复实战:send_file() got an unexpected keyword argument ‘etag‘
  • 什么是Power Distribution Unit(PDU)以及智能PDU:应用的演变历程
  • C#简单线程启动的几种方法总结
  • Windows平台网络通信
  • SQL Server 查询数据库中所有表中所有字段的数据类型及长度
  • 从“字对字“到“意对意“:AI翻译正在重塑人类的语言认知模式
  • 从代码学习深度学习 - 全局向量的词嵌入(GloVe)PyTorch版
  • 医疗行业双碳战略升维:从合规达标到价值创造的转型路径
  • JavaWeb(JavaBean预习)
  • 智慧园区智能化整体解决方案
  • c#实现绝对路径和相对路径的转换