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

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;那么点击红点的位置会判定为选中物体。显然这是不对的。如果物体没有旋…

python中用函数设计栈的括号匹配问题_数据结构和算法(Python版):利用栈(Stack)实现括号的匹配问题...

算法数据结构数据结构和算法(Python版)&#xff1a;利用栈(Stack)实现括号的匹配问题在平时写程序当中&#xff0c;我们会经常遇到程序当中括号的匹配问题&#xff0c;也就是在程序当中左括号的数量和右括号的数量必须相等。如果不相等的话则程序必然会报错。Hint:在读取程序的…

python创建空元组_Python——元组的基本语法(创建、访问、修改、删除)

原标题&#xff1a;Python——元组的基本语法(创建、访问、修改、删除)Python 元组的使用Python 的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。元组使用小括号 ( )&#xff0c;列表使用方括号 [ ]。元组创建很简单&#xff0c;只需要在括号中添加元素&#xf…

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仿qq gui_Java仿QQ登入页面

1.[代码][Java]代码package com.myqq.frame;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Cursor;import java.awt.FlowLayout;import java.awt.Font;import java.awt.GridLayout;import java.awt.Image;import java.awt.event.MouseAdapter;import ja…

python数据预处理 重复行统计_Python数据分析之数据预处理(数据清洗、数据合并、数据重塑、数据转换)学习笔记...

1. 数据清洗1.1 空值和缺失值的处理​空值一般表示数据未知、不适用或将在以后添加数据。缺失值是指数据集中某个或某些属性的值是不完整的。​一般空值使用None表示&#xff0c;缺失值使用NaN表示1.1.1 使用isnull()和notnull()函数​可以判断数据集中是否存在空值和缺失值1.1…

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…

python如何复制oracle数据_Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法...

本文实例讲述了Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法。分享给大家供大家参考。具体实现方法如下&#xff1a;# Export Oracle database tables to CSV files# FB36 - 201007117import sysimport csvimport cx_Oracleconnection raw_input("Enter Or…

JAVA构造函数是不是封装_Java 封装与构造函数

面向对象思想思想的三个特征&#xff1a;封装&#xff0c;继承&#xff0c;多态。封装&#xff1a;表现&#xff1a;函数就是一个最基本的封装体&#xff0c;类也是一个封装体。好处&#xff1a;1、提高了代码的复用性&#xff0c;2、隐藏了实现细节&#xff0c;可以对外提供可…

python获取mysql数据为excel中的sheet_python 从excel、csv、mysql、txt获取数据源

使用python进行数据分析工作的第一步是获取数据源&#xff0c;数据源来可能来自于excel、txt、csv文件、mysql数据库。分别看看这些数据源怎么导入到python中。1. Excel 数据源导入python首先导入pandas 模块import pandas as pdexcel 导入格式为&#xff1a;pd.read_excel( 路…

我的世界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;可爱漂亮的圣诞节和新年贺…

golang mysql curd_用 golang 造了个 curd api 的轮子

最近需要写个接口的项目 准备顺便熟悉一下 golang在 github 找了下 golang 的 resetful 接口项目 大部分需要对每张表定义一个 model 文件所以就造了个轮子 不需要定义 model 类型的 curd 接口基于 gin 框架 只支持 mysql只需要改下 config/db.go 数据库配置文件就能直接 go ru…

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

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

fopen php 读取_PHP使用fopen与file_get_contents读取文件实例分享

php中读取文件可以使用fopen和file_get_contents这两个函数&#xff0c;二者之间没有本质区别&#xff0c;只是前者读取文件的php代码相比后者要复杂一点。本文章通过实例向大家讲解fopen和file_get_contents读取文件的实现代码。需要的码农可以参考一下。fopen读取文件的代码如…

php外部对象如何使用方法,php面向对象全攻略 (三)特殊的引用“$this”的使用...

7.特殊的引用“$this”的使用现在我们知道了如何访问对象中的成员&#xff0c;是通过“对象->成员”的方式访问的&#xff0c;这是在对象的外部去访问对象中成员的形式&#xff0c;那么如果我想在对象的内部&#xff0c;让对象里的方法访问本对象的属性&#xff0c;或是对象…

python编程制作接金币游戏_一个简单的pygame接金币游戏

左右键控制小人移动去接空中下来的金币&#xff0c;接住金币得5分&#xff0c;接不住游戏结束&#xff0c;金币速度会随着level的关数而越来越快import pygame,sys,os,randompygame.init()class rect():#画出小人def __init__(self,filename,initial_position):self.imagepygam…

php 126怎么设置发送邮箱验证码,phpmailer发送网易126邮箱的例子

本文介绍下&#xff0c;使用phpmailer发送网易126.com邮件的例子&#xff0c;有需要的朋友参考下。使用PHPMailer类发邮件的例子&#xff1a;IsSMTP();//邮件服务器$mail->Host "smtp.126.com";$mail->SMTPDebug 0;//使用SMPT验证$mail->SMTPAuth true;/…

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

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