公司建设网站的优缺点/关键词优化推广排名
该系列属于计算机基础系列中的《数据结构基础》子系列,参考书《数据结构考研复习指导》(王道论坛 组编),完整内容请阅读原书。
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 //短整型 …...

KUKA机器人修改机器人名称和IP地址的具体方法示例
KUKA机器人修改机器人名称和IP地址的具体方法示例 修改机器人名称 如下图所示,首先切换用户组到管理员,输入默认密码:kuka, 如下图所示,点击菜单键—投入运行—机器人数据, 如下图所示,此时可以看到机器人的名称为rrr445, 如下图所示,修改之后,点击左侧的“”…...

【数据分析师求职面试指南】必备基础知识整理
数据分析师基础知识统计 数据分析知识基础概念随机变量常用特征正态分布与大数定律、中心极限定律假设检验模型、数据挖掘知识常用概念数据集划分欠拟合过拟合模型分类方法常见模型介绍线性回归模型:逻辑回归模型决策树模型随机森林模型Boosting模型XGBoost模型模型…...

《开关电源宝典 降压电路(BUCK)的原理与应用》
嗨,硬件攻城狮或电源工程师同行们,我想写本专门解析BUCK电源电路的书籍,以下是“前言”内容的部分摘录以及当前的目录,当前已经完成22万多字500多页了,即使如此,离真正出版书籍,还有很长的路要走…...

R语言基础(一):注释、变量
R语言用于统计分析和绘制图表等操作。不同于Java等其它语言,R用于统计,而不是做一个网站或者软件,所以R的一些开发习惯和其它语言不同。如果你是一个编程小白,那么可以放心大胆的学。如果你是一个有编程基础的人,那么需…...

Java 集合进阶(二)
文章目录一、Set1. 概述2. 哈希值3. 元素唯一性4. 哈希表5. 遍历学生对象6. LinkedHashSet7. TreeSet7.1 自然排序7.2 比较器排序8. 不重复的随机数二、泛型1. 概述2. 泛型类3. 泛型方法4. 泛型接口5. 类型通配符6. 可变参数7. 可变参数的使用一、Set 1. 概述 Set 集合特点&am…...

小孩用什么样的台灯比较好?2023眼科医生青睐的儿童台灯推荐
小孩子属于眼睛比较脆弱的人群,所以选购护眼台灯时,选光线温和的比较好,而且调光、显色效果、色温、防蓝光等方面也要出色,否则容易导致孩子近视。 1、调光。台灯首先是照度高,国AA级+大功率发光࿰…...

Ubuntu c++ MySQL数据库操作
mysql安装sudo apt-get install updatesudo apt-get install mysql-server libmysqlclient-dev mysql-workbenchmysql启动/重启/停止sudo service mysql start/restart/stop登录mysql命令:mysql -uroot -p错误异常:解决办法:修改mysqld.cnf配…...

C++11:lambda表达式
文章目录1. 概念2. 语法3. 示例示例1示例2示例3示例44. 捕捉方式基本方式隐式和混合补充5. 传递lambda表达式示例6. 原理7. 内联属性1. 概念 lambda表达式实际上是一个匿名类的成员函数,该类由编译器为lambda创建,该函数被隐式地定义为内联。因此&#…...

【Android -- 开源库】表格 SmartTable 的基本使用
介绍 1. 功能 快速配置自动生成表格;自动计算表格宽高;表格列标题组合;表格固定左序列、顶部序列、第一行、列标题、统计行;自动统计,排序(自定义统计规则);表格图文、序列号、列标…...

自动化测试实战篇(9),jmeter常用断言方法,一文搞懂9种测试字段与JSON断言
Jmeter常用的断言主要有,JSON断言和响应断言这两种方式。 断言主要就是帮助帮助人工进行快速接口信息验证避免繁杂的重复的人工去验证数据 第一种响应断言Apply to:表示应用范围测试字段:针对响应数据进行不同的匹配响应文本响应代码响应信息…...