数据结构知识点总结_大牛带你学 | 考研数据结构中线性表中顺序结构的知识点总结...

478232959f9dfb780f3d48f36a55b980.png

前言

07498718ddee18c08815fe75fd20a7ea.png

我们都知道,数据结构中逻辑结构可以划分为线性结构(线性表)与非线性结构两大类。

存储结构指的是数据元素在计算机中的存储及其逻辑关系的表现,也就是在计算机当中对逻辑结构的表示。

线性表的存储结构主要有顺序结构链式结构两种实现形式。本文主要探讨基于线性表的顺序结构也就是顺序表的四种基本操作:初始化插入删除查找

这些知识点既可能出现在选择题的考察当中又可以出现在编程大题当中,但是考察的侧重点不同,选择题重点关注操作的时间复杂度以及特性(特别是不同结构的顺序表,在实现某种操作时候的效率高低),编程大题只是关注代码实现能力。

基本知识分析

顺序存储 :

把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里。用这种方法存储的线性表简称顺序表。(为了便于理解,大家可以近似得把这一段空间理解成一个C语言数组)

由于元素顺序排列,顺序存储具有以下性质和特征:

• 线性表的逻辑顺序与物理顺序一致;

• 数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现

a1到an存放情况如图所示,设每个元素占l个单元长度。(ps:计算机中数组下标实际从0开始)

ai的地址:Loc(ai)=Loc(a1)+(i-1)×1

f060384fb0692e0719ebfac2a5365e6f.png

因此顺序表的结构体当中应当包含 一块连续的地址空间当前存放元素的长度当前分配的存储容量。由此写出结构体如下:

typedef struct{
ElemType *elem;//存储空间基址
int length;//当前长度
int listsize;//当前分配的存储容量
}SqList;

在了解顺序表静态构造的基础上,我们可以在这个基础上构建它的几个基本操作了。

1

初始化

输入:MAXSIZE,表示要申请MAXSIZE个元素大小的地址单元。

关键代码:

L->elem=(ElemType *)malloc(MAX_SIZE*sizeof( ElemType));//分配空间
L->length=0;//空表长度为0
L->listsize=MAX_SIZE;//初始存储容量

2

插入

设n个元素存放在elem[0...length-1]内。

输入:i,e,表示要在下标为i处插入值为e的元素。

分析插入过程导致的结果:元素数量从length变成了length+1,如果只是简单地将下标为i处的元素替换成e,会导致原先的元素丢失。因此插入操作可以表述为:(1)将该元素以及该元素之后的所有元素都向后移动一个位。(2)元素大小加1。(3)再将e写入到下标为i处。比如对于[1,2]这个数组来说,将0插入到第一位,事实上是先使得第一位以及第一位之后的所有元素后移一位,数组变成[1,1,2],然后将0写入第一位,数组变成[0,1,2]

dcde5517ff6d48823bf04c50789e1830.png

关键代码:

//elem[i...length-1]向后移动for(j = length-1; j >= i; j--){
L->elem[j+1] = L->elem[j]
}//元素大小加1
length++;//e写入下标为i处
L->elem[i]=e;

3

删除

设n个元素存放在elem[0...length-1]内。

输入:i,表示要删除下标为i处的元素。

分析删除过程导致的结果:元素数量从length变成了length-1,如果只是简单地将下标为i处的元素被删除,会导致此处出现一个空白单元。因此删除操作可以表述为:(1)将该元素之后的所有元素都向前移动一个位。(2)元素大小减1。将i+1处的元素移动到i处时完成了覆盖,事实上等同于删除了i处的元素。比如对于[0,1,2]这个数组来说,将第二个元素移动到第一个,第三个元素移动到第二个也就是数组变成了[1,2,2],但是此时length=2说明数组长度为2,取前2个元素,事实上完成了对0的删除。

c55c62d4c8e17db4d41d42b1afd7704a.png

关键代码:

//elem[i+1...length-1]向前移动for(j = length-1; j > i; j--){
L->elem[j-1] = L->elem[j]
}//元素大小减1
length--; 

4

查找

设n个元素存放在elem[0...length-1]内。

输入:e,表示查找值为e的元素。

输出:i,表示值为e的元素位于下标为i处,若查找不成功,i=-1(或者自己定义其他不属于0...length-1的值)

分析查找过程:其实是从头到尾遍历每一个元素,比较当前元素是否等于查找值e,若等于则返回下标i,当遍历完毕n个元素还是没有返回值,说明表中不存在要查询的元素。

关键代码:

//遍历比较每一个元素for(i=0; i < length; i++){if(EQ(L->elem[i], e)){ return i;}
}//遍历结束没有返回值,说明不存在return -1;

9259f118279add91cd0fe571989a653b.png

选择题角度

重点考察 时间复杂度特性以及执行相关操作的效率

根据前面的分析以及关键代码部分可以观察到:

1

初始化

关键代码只涉及到一次堆分配malloc以及修改listsize和length,频度为3,时间复杂度为O(1)

2

插入

关键代码分为三步:(1)修改length,频度为1,时间复杂度为O(1);(2)elem[i...n-1]向后移动,移动n-i次,频度为n-i,时间复杂度为O(n);(3)向下标为i处写入元素e,频度为1,时间复杂度为O(1)。综上总的时间复杂度为O(n)

3

删除

关键代码分为两步:(1)修改length,频度为1,时间复杂度为O(1);(2)elem[i+1...n-1]向前移动,移动n-i-1次,频度为n-i-1,时间复杂度为O(n)。综上总的时间复杂度为O(n)

4

查找

关键代码:遍历整个序列比较是否有元素的值为e,遍历结束时查找不成功则返回-1。显然若第一个元素就是要找的元素时,只比较一次,若最后一个元素是要找的元素则比较n次,若不存在该元素同样是比较n次,比较次数的取值范围为1到n,若每个元素出现频率相等,查找成功的情况下平均比较次数为(n+1)/2次,时间复杂度为O(n)

综上,在顺序表中,访问下标为i的元素可以通过 随机访问 ,如elem[i]获取,时间复杂度为O(1),但是对于插入和删除这样的动态操作时间复杂度都为O(n),顺序查找时间复杂度也为O(n)。

编程角度

一个完整的操作函数,是由 健壮性保证 以及 关键代码 两部分组成的。

1

初始化

malloc可能会有分配失败的可能,因此要对此进行判断。

bool InitList(SqList *L){
L->elem=(ElemType *)malloc(MAX_SIZE*sizeof( ElemType));//分配空间if(!L->elem){ return false;}//基址指针为空时分配失败
L->length=0;//空表长度为0
L->listsize=MAX_SIZE;//初始存储容量return true;
}

2

插入

• 对于elem[0...length-1]来说合法的插入范围应该是0~length,要对输入的i进行判断。

• 插入会使得表长加1,可能会发生上溢,也就是分配空间不够,所以要对此进行判断。

bool ListInsert(SqList *L, int i, ElemType e){int j;if(i < 0 || i > L->length) { return false;}//i输入是否合法if(L->length >= L->listsize){
 newbase = (ElemType *)realloc(L->elem, (L->listsize + INCREMENT)*sizeof( ElemType));//分配空间if(!newbase){return false;}//分配失败
 L->elem = newbase;
 L->listsize += INCREMENT;
}//是否上溢//elem[i...n-1]向后移动for(j = L->length-1; j >= i; j--){
 L->elem[j+1] = L->elem[j]
}//元素大小加1
L->length++;//e写入下标为i处
L->elem[i]=e;return true;
}

3

删除

• 对于elem[0...length-1]来说合法的删除范围应该是0~length-1,要对输入的i进行判断。

bool ListDelete(SqList *L, int i, ElemType &e){if(i < 0 || i > L->length - 1){ retrun false;}//i输入是否合法
e = *(&L->elem[i]);//elem[i+1...length-1]向前移动for(j = L->length-1; j > i; j--){
 L->elem[j-1] = L->elem[j]
}//元素大小减1
L->length--;return true;
}

4

查找

int Locate(SqList* L, ElemType e){int i;//遍历比较每一个元素for(i=0; i < L.length; i++){if(EQ(L->elem[i], e)){ return i;}
}//遍历结束没有返回值,说明不存在return -1;
}

以上就是学长给大家归纳的关于线性表的相关基本操作了。

这里大牛学长帮大家最后总结一下。

⭕ 对于增、删、查、改几个基本操作,由于顺序表元素存在于一片连续空间。每一次做遍历相关操作的时候,都需要用一个全局的for循环去近似遍历整个表,因此这几个操作的时间复杂度都是O(n),即线性的。

⭕ 对于增、删操作,一定要做好合法性判断,在编程大题中,合法性判断是判卷老师对于学生编程素质的重点考察点,你不能说老师一定会关注合法性判断,但是写上合法性判断相关的代码一定会为你加上一点“印象分”!

今天是2020年8月18日

距离2021考研还有 122 天  

全力以赴,才有资格说尽力。

大牛学长一直在~

e2a66ea0f2784ad661c56ac09556aeb6.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java矩形翻转_如何判断一个点在旋转后的矩形中

前言最近在做的一款游戏中&#xff0c;用到点与旋转矩形的判定来获得一个选中的物体。在此做个记录如图所示&#xff0c;黄色的颜料屏是旋转的&#xff0c;如果不做处理直接判断点是否在矩形中&#xff0c;那么点击红点的位置会判定为选中物体。显然这是不对的。如果物体没有旋…

openssl 生成证书_CentOS7 httpd(Apache)SSL 证书部署

在之前我的文章中我已经搭建了nextcloud服务器&#xff0c;现在我们需要通过域名及https访问怎么办1. 进行了简单的httpd设置后&#xff0c;就可以为网站添加SSL证书功能了。2. 首先得获取证书&#xff0c;有了证书才能添加。我们采用本地上传的方式将SSL证书上传到CentOS上。获…

FJ的字符串java问题_蓝桥杯VIP试题 之 基础练习 FJ的字符串- JAVA

问题描述FJ在沙盘上写了这样一些字符串&#xff1a;A1 “A”A2 “ABA”A3 “ABACABA”A4 “ABACABADABACABA”… …你能找出其中的规律并写所有的数列AN吗&#xff1f;输入格式仅有一个数&#xff1a;N ≤ 26。输出格式请输出相应的字符串AN&#xff0c;以一个换行符结束。…

java编写系统登录界面_java 登陆界面怎么写,连接数据库后

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼界面是package 界面类;import javax.jws.soap.SOAPBinding.Use;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing…

我的世界seus光影java版下载_我的世界0.17SEUS PE光影材质包(水反高清)下载

我的世界0.17SEUS PE光影材质包已经震撼发布&#xff0c;随着我的世界pe0.17系列版本疯狂的出现&#xff0c;很多玩家都有点开始不适应了&#xff0c;毕竟这个更新的频率和速度太快了&#xff0c;0.16.0版本还没有玩够了&#xff0c;下面给大家提供我的世界0.17SEUS PE光影材质…

针式打印机风格英文字体_可爱漂亮的圣诞节和新年贺卡艺术字体推荐!

圣诞节即将到来&#xff0c;各种相应的促销活动和宴会搞起来&#xff0c;今天macz小编为您带来几款风格可爱漂亮的圣诞节和新年贺卡艺术字体推荐&#xff01;可以用于卡片、海报、邀请函、徽标、产品介绍、T恤等&#xff0c;效果魅力非常哦&#xff01;可爱漂亮的圣诞节和新年贺…

miniui展示日历能点击_2020年日历设计,除了366天有新字体,还有新形式

点击上方蓝字&#xff0c;把我设置为星标☆吧今天是12月1日&#xff0c;距离2020年还有最后一个月。在我们度过的日子中&#xff0c;我们应该铭记每一天&#xff0c;每一个日子。讲究仪式感的人&#xff0c;才是生活真正的智者。那么&#xff0c;对于2020年的日历&#xff0c;应…

容器中apscheduler不执行_APScheduler:定时任务框架

APScheduler:定时任务框架安装文档: https://apscheduler.readthedocs.io/en/stable/userguide.html安装$ pip install apscheduler>>> import apscheduler>>> apscheduler.version3.6.3组件APScheduler由一下四部分组成triggers:触发器,指定定时任务执行的时…

织梦php网站修改教程,织梦DEDEcms织梦软件模型增加图集功能教程(含修改文件下载)...

这篇文章主要为大家详细介绍了织梦DEDEcms织梦软件模型增加图集功能教程(含修改文件下载)&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴。织梦DEDEcms织梦软件模型增加图集功能,这是今天361模板要给大家分享的。下…

nikita popov php,PHP中对performance的考虑点

Nikita Popov 在他的演讲中谈了几个PHP 程序中和performance相关的point。1.PHP使用shared memory, preload的方式事先分配&#xff0c;而只有在所有的处理结束之后&#xff0c;share memory 才会断开和所有进程或者thread之间的联系。光是opcode&#xff0c;FPM的设定还不足以…

优化matlab作业,现代设计优化算法MATLAB实现

开篇语前阵子做现代设计方法的时候&#xff0c;发现网上很是缺乏这种作业形式的简易算法实现&#xff0c;所以特地来简书写一篇。有两份&#xff0c;一份是我的(说来惭愧&#xff0c;我的大部分都是在网上找的代码&#xff0c;然后在自己的电脑上跑一次&#xff0c;跑出来了就行…

多因子选选股MATLAB代码,金工研报:利用卷积神经网络进行多因子选股

首先&#xff0c;我们先来看一下通过卷积神经网络选股模型的整体流程&#xff0c;然后再根据每一步流程进行介绍&#xff0c;具体如下图所示&#xff1a;1、数据获取用于历史回测数据来自所有A股股票&#xff0c;其中剔除了ST股以及上市3个月的股票&#xff0c;另外&#xff0c…

matlab bad apple,【bad apple】matlab制作矩阵苹果~

有屏幕的地方就有bad apple那么作为一名工科生&#xff0c;熟练的操♂作马桶萝卜(matlab)是一项基本技能下面开始讲解如何用matlab制作别具一格的“矩阵苹果”~实验环境matlab R2018a原版bad apple视频技术要求可以即时演算图形可以将处理后的每帧图形合并成新的视频先上代码%t…

服务器ip直接访问php怎么写,php - 如何实现用公网ip访问到服务器上的网页?

服务器系统是Windows Server 2012 R2&#xff0c;已经部署了IIS、PHP和MySQL&#xff0c;能够在云服务器上通过localhost打开php网页&#xff0c;(放在服务器wwwroot上的index.php)已在ISS管理器中添加网站&#xff0c;但编辑网站绑定时&#xff0c;在ip地址中填入了服务器的公…

vb6 打印选项对话框_图纸打印次数太多,不知道哪次才是最新的?用打印戳记区分效果好...

原创&#xff1a;就说我在开发区使用AutoCAD从事设计工作的朋友们不知道有没遇到过这种情况&#xff1a;图纸在反复修改打印的过程中&#xff0c;由于图纸内容高度相似&#xff0c;往往搞不清究竟哪个才是最新版本的图纸了。这种情况下&#xff0c;细致入微地去核对非常麻烦&am…

安卓文本编辑器php cpp,用安卓原生控件封装一个简易的富文本编辑器

最近接到项目需求&#xff1a;移动端原生写一个富文本编辑器。 ( ⊙ o ⊙ )从没遇到过富文本要用原生写的&#xff0c;然后就查阅各种资料。然后结合自己的思路&#xff1a;其实安卓的富文本编辑器就是一个 “容器”。那么接下来我就带给大家说一说我自定义这个富文本编…

vue tab切换_iviewUITabs选项卡切换组件

概述 选项卡切换组件&#xff0c;常用于平级区域大块内容的的收纳和展现。源码地址&#xff1a;https://github.com/iview/iview/tree/2.0/src/components/tabs使用&#xff1a; 标签一的内容标签二的内容标签三的内容标签二的内容在源码的tabs文件下有三个文件&#xff1a;ind…

paypal创建订单后怎么获得id_5步创建Facebook商店(最新版教程)学习如何在Facebook上卖货...

请按照以下步骤设置Facebook商店&#xff1a;步骤1&#xff1a;转到您的Facebook页面并配置Shop页面。步骤2&#xff1a;设置您的商店详细信息。步骤3&#xff1a;配置付款。步骤4&#xff1a;将产品添加到您的Facebook商店。步骤5&#xff1a;管理您的订单。步骤6&#xff1a;…

创建索引名称已由现有对象使用_Excel编程周末速成班第3课:Excel对象模型

学习Excel技术&#xff0c;关注微信公众号&#xff1a;excelperfect导语&#xff1a;为了帮助想要快速学会Excel VBA的朋友&#xff0c;特以《Excel Programming Weekend Crash Course》这本书为基础&#xff0c;开始整理一系列资料&#xff0c;在完美Excel社群上分享。一共有3…

socket用起始码分割_常用条码Code128码及EAN13码的介绍

在条码打印软件中&#xff0c;设计条码标签时经常用到的码制是Code128码和EAN13码。因为这两种码制比较贴近我们的生活。比如&#xff1a;我们去超市购物&#xff0c;商品上贴的条码标签都是EAN13码&#xff0c;因为EAN13码多用于零售产品包装。而code128码多用于工厂产线&…