Chapter2.2:线性表的顺序表示
该系列属于计算机基础系列中的《数据结构基础》子系列,参考书《数据结构考研复习指导》(王道论坛 组编),完整内容请阅读原书。
2.线性表的顺序表示
2.1 顺序表的定义
-
线性表的顺序存储亦称为顺序表,是用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的两个元素在物理位置上也相邻;
-
第111个元素存储在线性表的起始位置,第iii个元素的存储位置后面紧接存储的是第i+1i+1i+1个元素,称iii为元素aia_iai在线性表中的位序;
-
顺序表的特点:表中元素的逻辑顺序与其物理顺序相同;
-
假设线性表LLL存储的起始位置为:LOC(A),sizeof(ElemType){\rm LOC(A),sizeof(ElemType)}LOC(A),sizeof(ElemType)是每个数据元素所占用存储空间的大小,则表LLL对应的顺序存储如下图所示:

-
每个数据元素的存储位置都和线性表的起始位置相差一个和该数据元素的位序成正比的常数;
-
线性表中的任一数据元素都可以随机存取,线性表的顺序存储结构是一种随机存取的存储结构;
-
高级语言中通常用数组描述线性表的顺序存储结构,且数组中元素的下标从000开始,线性表中元素的位序是从111开始;
-
假定线性表的元素类型为:ElemType{\rm ElemType}ElemType,则线性表的顺序存储类型描述为:
#define MaxSize 50 // 定义线性表最大长度 typedef struct{ElemType data [MaxSize]; // 顺序表的元素int length; // 顺序表的当前长度 }SqList; // 顺序表的类型定义 -
一维数组可以是静态分配的,亦可是动态分配的;
-
静态分配:由于数组的大小和空间事先固定,一旦空间占满,再加入新的数据会产生溢出,进而导致程序崩溃;
-
动态分配:存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,会令开辟一块更大的存储空间,代替原来的存储空间,达到扩充存储数组空间的目的;
-
动态分配描述线性表:
#define InitSize 100 // 表长度的初始定义 typedef struct{ ElemType *data; // 指示动态分配数组的指针int MaxSize,length; // 数组的最大容量和当前个数 }SeqList; // 动态分配数组顺序表的类型定义// C语言的初始动态分配语句 L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);// C++初始动态分配语句 L.data=new ElemType(InitSize); -
顺序表主要特点:随机访问,即通过首地址和元素序号可在时间O(1)O(1)O(1)内找到指定的元素;
-
顺序表的存储密度高,每个结点只存储数据元素;
-
顺序表逻辑上相邻的元素物理上也相邻,故插入和删除操作需要移动大量元素;
2.2 顺序表上基本操作实现
2.2.1 顺序表插入操作
-
在顺序表L{\rm L}L的第i(1<=i<=L.length+1){\rm i(1<=i<=L.length+1})i(1<=i<=L.length+1)个位置插入新元素e{\rm e}e;
-
插入原理:若i{\rm i}i的输入不合法,则返回false{\rm false}false,表示插入失败;否则,将第i{\rm i}i个元素及其后的所有元素依次往后移动一个位置,腾出一个空位置插入新元素e{\rm e}e,顺序表长度增加111,插入成功,返回true{\rm true}true;
-
插入操作核心代码:
bool ListInsert(SqList &L,int i,ElemType e){// 判断i的范围是否有效if(i<1||i>L.length+1)return false;// 当前存储空间已满,不能插入if(L.length>=MaxSize)return false;// 将第i个元素及之后的元素后移for(int j=L.length;j>=i;j--)L.data[j]=L.data[j-1];L.data[i-1]=e; // 在位置i处插入eL.length++; // 线性表长度加1return true; } -
顺序表插入操作时间复杂度分析:
-
最好情况:在表尾插入,即i=n+1{ i=n+1}i=n+1,元素后移语句不执行,时间复杂度为O(1)O(1)O(1);
-
最坏情况:在表头插入,即i=1{i=1}i=1,元素后移语句将执行nnn次,时间复杂度为O(n)O(n)O(n);
-
平均情况:假设pi(pi=1/(n+1))p_i(p_i=1/(n+1))pi(pi=1/(n+1))是在第iii个位置上插入一个结点的概率,则在长度为nnn的线性表中插入一个结点,所需移动结点的平均次数为:
∑i=1n+1pi(n−i+1)=∑i=1n+11n+1(n−i+1)=1n+1∑i=1n+1(n−i+1)=1n+1n(n+1)2=n2\sum_{i=1}^{n+1}p_i(n-i+1)=\sum_{i=1}^{n+1}\frac{1}{n+1}(n-i+1)=\frac{1}{n+1}\sum_{i=1}^{n+1}(n-i+1)=\frac{1}{n+1}\frac{n(n+1)}{2}=\frac{n}{2} i=1∑n+1pi(n−i+1)=i=1∑n+1n+11(n−i+1)=n+11i=1∑n+1(n−i+1)=n+112n(n+1)=2n
故线性表插入算法的平均时间复杂度为O(n)O(n)O(n);
-
2.2.2 顺序表删除操作
-
删除顺序表L{\rm L}L中第i(1<=i<=L.length){\rm i(1<=i<=L.length)}i(1<=i<=L.length)个位置的元素,用引用变量e{\rm e}e返回;
-
顺序表删除操作原理:若i{\rm i}i的输入不合法,则返回false{\rm false}false;否则,将被删除元素赋给引用变量e{\rm e}e,并将第i+1{\rm i+1}i+1个元素及其后的所有元素依次往前移动一个位置,返回true{\rm true}true。
-
删除操作核心代码:
bool ListDelete(SqList &L,int i,Elemtype &e){// 判断i的范围是否有效if(i<1||i>L.length)return false;// 将被删除的元素赋值给ee=L.data[i-1];// 将第i个位置后的元素前移for(int j=i;j<L.length;j++)L.data[j-1]=L.data[j];// 线性表长度减1L.length--;return true; } -
顺序表删除操作时间复杂度分析:
-
最好情况:删除表尾元素,即i=ni=ni=n,则无须移动元素,时间复杂度为O(1)O(1)O(1);
-
最坏情况:删除表头元素,即i=1i=1i=1,则需要移动除表头元素外的所有元素,时间复杂度为O(n)O(n)O(n);
-
平均情况:假设pi(pi=1/n)p_i(p_i=1/n)pi(pi=1/n)是删除第iii个位置上结点的概率,则在长度为nnn的线性表中删除一个结点时,所需移动结点的平均次数为:
∑i=1npi(n−i)=∑i=1n1n(n−i)=1n∑i=1n(n−i)=1nn(n−1)2=n−12\sum_{i=1}^np_i(n-i)=\sum_{i=1}^n\frac{1}{n}(n-i)=\frac{1}{n}\sum_{i=1}^n(n-i)=\frac{1}{n}\frac{n(n-1)}{2}=\frac{n-1}{2} i=1∑npi(n−i)=i=1∑nn1(n−i)=n1i=1∑n(n−i)=n12n(n−1)=2n−1
故线性表删除算法的平均时间复杂度为O(n)O(n)O(n);
-
2.2.3 顺序表插入和删除操作图解
-
顺序表插入和删除操作的时间主要耗费在移动元素上,移动元素的个数取决于插入和删除元素的位置;
-
顺序表的插入和删除操作图解如下所示:

2.2.4 顺序表按值查找
-
在顺序表L{\rm L}L中查找第一个元素值等于e{\rm e}e的元素,并返回位序;
-
按值查找操作核心代码:
int LocateElem(SqList L,ElemType e){int i;for(i=0;i<L.length;i++)if(L.data[i]==e)return i+1; // 下标为i的元素值等于e,其位序为i+1return 0; } -
按值查找操作时间复杂度分析:
-
最好情况:查找的元素在表头,仅需比较一次,时间复杂度为O(1)O(1)O(1);
-
最坏情况:查找的元素在表尾或不存在,需要比较nnn次,时间复杂度为O(n)O(n)O(n);
-
平均情况:假设pi(pi=1/n)p_i(p_i=1/n)pi(pi=1/n)是查找的元素在第i(1<=i<=L.length){\rm i(1<=i<=L.length)}i(1<=i<=L.length)个位置上的概率,则在长度为nnn的线性表中查找值为e{\rm e}e的元素所需比较的平均次数为:
∑i=1npi×i=∑i=1n1n×i=1nn(n+1)2=n+12\sum_{i=1}^{n}p_i\times{i}=\sum_{i=1}^n\frac{1}{n}\times{i}=\frac{1}{n}\frac{n(n+1)}{2}=\frac{n+1}{2} i=1∑npi×i=i=1∑nn1×i=n12n(n+1)=2n+1
故线性表按值查找操作的平均时间复杂度为O(n)O(n)O(n);
-
相关文章:
Chapter2.2:线性表的顺序表示
该系列属于计算机基础系列中的《数据结构基础》子系列,参考书《数据结构考研复习指导》(王道论坛 组编),完整内容请阅读原书。 2.线性表的顺序表示 2.1 顺序表的定义 线性表的顺序存储亦称为顺序表,是用一组地址连续的存储单元依次存储线性表…...
老马闲评数字化「4」做数字化会不会被供应商拿捏住
原文作者:行云创新CEO 马洪喜 导语 开年过后业务特别的繁忙,出差也比较多,所以有段时间没更新了,对不住大家! 上一集(您可以查看“行云创新”主页阅读原文)咱们聊了数字化转型的“想转、急转、…...
robosuite添加无碰撞的模型
1 前言 最近在使用robosuite时,需要在仿真环境中可视化物体的目标位置,从而方便观察训练情况,可视化的物体有以下要求: 形状尺寸与操作的物体一样半透明只有visual,不与场景其他物体有碰撞可以在每次step后设置位置,且固定在设定的位置,不受重力影响 2 方法 找了半天,最终确…...
JS学习笔记day03
今日内容 零、 复习昨日 CSS 美化,复用,样式文件和表现文件分离便于维护 选择器 {属性:值;…} 引入css 内联文件内部使用style标签外部文件 <link href"路径" rel"stylesheet" type"text/css"> 选择器 基本 idclass标签名 属性 标签名…...
离散数学笔记_第一章:逻辑和证明(3)
1.3 命题等价式1.3.1 逻辑等价式 1.3.2 条件命题和双条件命题的逻辑等价式 1.3.3 德摩根律 1.3.4 可满足性 可满足的 不可满足的 可满足性问题的解 1.3.5析取范式(基本积之和),合取范式(基本和之积)1.3.6合式公式1…...
软件测试分类知识分享,第三方软件测试机构收费贵不贵?
软件测试可以很好的检验软件产品的质量以及规避产品上线之后可能会发生的错误,随着技术的发展,软件测试已经是一个完整且体系庞大的测试活动,不同的测试领域有着不同的测试方法、技术与名称,那么具体有哪些分类呢? 一、软件测试…...
爬虫(二)解析数据
文章目录1. Xpath2. jsonpath3. BeautifulSoup4. 正则表达式4.1 特殊符号4.2 特殊字符4.3 限定符4.3 常用函数4.4 匹配策略4.5 常用正则爬虫将数据爬取到后,并不是全部的数据都能用,我们只需要截取里面的一些数据来用,这也就是解析爬取到的信…...
【C++、C++11】可变参数模板、lambda表达式、包装器
文章目录📖 前言1. 可变参数模板1.1 万能模板:1.2 完美转发:1.3 可变参数模板的使用:1.4 emplace_back:2. lambda表达式2.1 lambda表达式的定义:2.2 lambda表达式的用法:2.2 - 1 捕捉列表的用法…...
外贸主机测评
一、俄罗斯vps 服务商: JUSTG: Home - Sun Network Company Limited LOCVPS: LOCVPS 全球云 - 十年老牌 为跨境外贸/远程办公/网站建设提供澎湃动力 JUSTHOST: justhost.ru RUVDS: Gcorelabs: 二、主机测评指标: 1、速度、延迟、丢包、路由测试…...
Meta CTO:Quest 2生命周期或比预期更久
前不久,Meta未来4年路线图遭曝光,泄露了该公司正在筹备中的一些AR/VR原型。除此之外,还有消息称Quest Pro或因销量不佳,而不再迭代。毫无疑问,Meta的一举一动持续受到行业关注,而面对最近的爆料,…...
Vector - CAPL - 文件处理函数
在当前平台化的趋势下,就算是协议层测试依然需要适配各种各样的项目,也需要处理各类型的文件,那我们如何对文件进行读取、写入、修改等类型的操作呢?今天我们就会介绍此类型的函数,主要适用于text、bin文件的处理。 打开文件 Open...
实力加持!RestCloud完成多方国产化适配,携手共建信创生态
近年来,随着数字化建设进入深水区,企事业单位对信息安全重视程度与日俱增,核心技术自主可控已成为时代呼唤,国产化浪潮日益汹涌澎湃。近日,RestCloud在国产化方面取得新进展,完成了全部产品线信创环境的多方…...
Unity 3D GUI教程||OnGUI TextArea 控件||OnGUI ScrollView 控件
OnGUI TextArea 控件 Unity 3D TextArea 控件用于创建一个多行的文本编辑区。用户可以在多行文本编辑区编辑文本内容。 该控件可以对超出控件宽度的文本内容实现换行操作。 TextArea 控件同样会将当前文本编辑区中的文本内容以字符串形式返回。 开发人员可以通过创建 Strin…...
Leetcode.828 统计子串中的唯一字符
题目链接 Leetcode.828 统计子串中的唯一字符 Rating : 2034 题目描述 我们定义了一个函数 countUniqueChars(s)来统计字符串 s中的唯一字符,并返回唯一字符的个数。 例如:s "LEETCODE",则其中 "L", "…...
Hibernate 相关特性
1. Hibernate一般使用hql进行查询,但也有sql执行的方法 Native sql 查询,。需要注意的是,使用Native SQL查询可能会破坏Hibernate的缓存机制,并可能导致性能问题 String sql "SELECT * FROM users WHERE age > :age"; Query …...
【研究生学术英语读写教程翻译 中国科学院大学Unit1-Unit8】
Unit1 Descartes Was Wrong 笛卡尔错了:“他人在,故我在” Unit2 Are we ready for the next volcanic catastrophe?我们准备好应对下一次火山灾难了吗? Unit3 Theorists,experimentalists and the bias in popular physics理论家,实验家和大众物理学的偏见 unit4 Magic Nu…...
ListView 控件的使用
第一步:找到ListView的控件通过findViewById 找到ListView的控件 ListView listView findViewById(R.id.listView);第二步:创建Bean类 得到set和get的方法解析获取的数据创建Bean类 得到set和get的方法public class Bean {String nanm""; pub…...
域控制器搭建以及成员加入
需要iso:windows server 2016软件使用:vmwarewindows server 2016系统搭建自己选iso,一直下一步就可以安装完成。(记得要设置密码)(密码要求大小写字母数字符号)等待就能安装完成。安装和配置Ac…...
利用 MLP(多层感知器)和 RBF(径向基函数)神经网络解决的近似和分类示例问题(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨💻4 Matlab代码 💥1 概述 1、径向基神经网络 径向基函数网络是由三层构成的前向网络:第一层为输入层,节点个数的能与输入的维数&…...
进阶C语言——数据的存储【详解】
文章目录1. 数据类型介绍1.1 类型的基本归类2. 整形在内存中的存储2.1 原码、反码、补码2.2 大小端介绍2.3 练习3. 浮点型在内存中的存储3.1 一个例子3.2 浮点数存储的规则1. 数据类型介绍 前面我们已经学习了基本的内置类型: char //字符数据类型 short //短整型 …...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
