【数据结构】考研真题攻克与重点知识点剖析 - 第 2 篇:线性表

news2024/9/27 15:33:01

前言

  • 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。
  • 此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术有限,最终数据清洗结果不够理想,相关CSDN文章便没有发出。
  • 从这篇文章开始,这里我将按章节顺序,围绕考研真题展开计算机组成原理总共8章的知识,边学习边整理数据。

(考研真题待更新)

欢迎订阅专栏:408直通车

请注意,本文中的部分内容来自网络搜集和个人实践,如有任何错误,请随时向我们提出批评和指正。本文仅供学习和交流使用,不涉及任何商业目的。如果因本文内容引发版权或侵权问题,请通过私信告知我们,我们将立即予以删除。

文章目录

  • 前言
    • 线性表的定义和特点
      • 线性表是具有相同特性的数据元素的一个有序序列
      • 特征
      • 补充
    • 线性表的基本操作
      • 小结
    • 线性表的存储/物理结构
      • 顺序表示(顺序存储结构/顺序映像)
        • 顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构
        • 定义实现
        • 特点
          • 小结
        • 基本操作的实现
          • 顺序表的基本操作——插入
          • 顺序表的基本操作——删除
          • 小结
          • 顺序表的基本操作——按位查找
          • 顺序表的基本操作——按值查找
          • 小结
      • 链式表示
        • 用一组物理位置任意的存储单元来存放线性表的数据元素(逻辑次序和物理次序不一定相同)
        • 特点
        • 结构
          • 小结
        • 单链表
          • 插入
          • 删除
            • 小结
          • 查找
            • 小结
          • 单链表建立
        • 双链表
          • 小结
        • 循环链表
          • 小结
        • 静态链表
          • 小结
    • 顺序表V.S.链表
      • 不同链表的时间效率比较
    • 顺序表和链表的比较
    • 补充代码
      • C++也可以用STL中的vector容器实现动态增长的数组
      • 单链表(数组模拟)
      • 双向链表(数组模拟)
  • 考研真题
    • 408 - 2023

线性表的定义和特点

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

线性表是具有相同特性的数据元素的一个有序序列

特征

  • 元素个数有限、具有先后次序、元素类型相同

  • 开始结点仅有一个直接后继,终端结点仅有一个直接前驱,内部结点仅有一个直接前驱和一个直接后继

补充

  • 线性表是一种逻辑结构,表示元素一对一的相邻关系,顺序表和链表是存储结构

线性表的基本操作

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小结

在这里插入图片描述

线性表的存储/物理结构

顺序表示(顺序存储结构/顺序映像)

在这里插入图片描述

顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构
  • 简言之:逻辑上相邻,物理上也相邻
    在这里插入图片描述
定义实现
  • 静态分配

    • 类型定义在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
  • 动态分配

    • 类型定义在这里插入图片描述在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

      •   //定义变量
          SqList L; 
          //实现
          L.data=(ElemType*)malloc(sizeof(ElemType)*MaxSize); //C语言
          L.data=new ElemType[MaxSize];//C++
        
        • C语言

          • malloc(m)函数:开辟m字节长度的地址空间,并返回这段空间的首地址

          • sizeof(x)运算:计算变量x的长度

          • free§函数:释放指针p所指变量的存储空间

        • C++在这里插入图片描述

    • 注意:动态分配不是链式存储,它同样属于顺序存储结构,物理结构没有变化,只是分配的空间大小可以在运行时动态决定

特点

在这里插入图片描述

  • 以物理位置相邻表示逻辑关系,占用一片连续的存储空间

  • 优点

    • 随机访问,即通过首地址和元素序号可在时间O(1)内找到指定元素
  • 缺点

    • 插入、删除元素需要移动大量元素、浪费存储空间、数据元素个数不能自由扩充
小结

在这里插入图片描述

基本操作的实现
  • 注意:线性表元素序号从1开始(逻辑位序和物理位序相差1)
顺序表的基本操作——插入

在这里插入图片描述
在这里插入图片描述

  • 插入操作在这里插入图片描述

    • 在顺序表的指定位置插入新元素,由于表中元素的物理位置是相邻的,所以当插入新元素的时候就需要对表中的元素进行整体移动

    • 插入操作的平均移动次数

      • 假设在n+1个位置上插入元素概率为:Pi=1/(n+1)在这里插入图片描述

在这里插入图片描述

顺序表的基本操作——删除
  • 删除操作在这里插入图片描述

    • 删除指定位置元素,将后续元素依次向前移动一个位置

    • 删除操作的平均移动次数

      • 假设删除第i个元素概率:Pi=1/n在这里插入图片描述
        在这里插入图片描述
小结

在这里插入图片描述

顺序表的基本操作——按位查找

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

顺序表的基本操作——按值查找

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 按值查找(顺序查找)

    • 在顺序表中查找特定值元素的位置

    • 顺序查找的平均查找长度

      • 假设每个记录的查找概率相等:Pi = 1/n

      • ASL = P1 + 2P2 + … + (n-1)Pn-1 + nPn = 1/n×(1+2+…+n)=1/n × n(n+1)/2 = (n+1)/2
        在这里插入图片描述

小结

在这里插入图片描述

链式表示

在这里插入图片描述

用一组物理位置任意的存储单元来存放线性表的数据元素(逻辑次序和物理次序不一定相同)
特点

在这里插入图片描述

  • 优点

    • 解决顺序表大量连续存储单元的缺点,插入和删除操作无需移动元素
  • 缺点

    • 指针域浪费空间、查找操作需要从头遍历(顺序查找方式)
结构
  • 结点

    • 数据元素的存储映像,由数据域和指针域组成

      • 数据域data:存储元素数值数据

      • 指针域next:存储直接后继结点的存储位置

  • 头指针

    • 用来标识单链表,始终指向单链表第一个结点
  • 头结点

  • 在这里插入图片描述

  • 在这里插入图片描述

    • 单链表第一个结点前附加一个结点,头结点数据域可以不设任何信息,也可以记录表长等

      • 引入头结点后,第一个数据结点和其他数据结点的操作一致,无需特殊处理;且空表和非空表的处理得到统一
        在这里插入图片描述
小结

在这里插入图片描述

单链表
  • 定义实现

    • 结点类型和链表指针定义在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

      • 定义链表L:LinkList L;
        定义结点指针p:LNode *P;
        在这里插入图片描述
插入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

删除

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

小结

在这里插入图片描述
在这里插入图片描述

查找

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小结

在这里插入图片描述

单链表建立
  • 操作

    • 头插法建立单链表

      • 在这里插入图片描述
        在这里插入图片描述

        • 从一个空表开始,生成新结点,插入到当前链表的表头,即头结点之后

        • 注意:生成的链表中结点的次序和输入数据顺序相反,可以利用该特点进行链表转置

    • 尾插法建立单链表

      • 在这里插入图片描述
        在这里插入图片描述

        • 将新结点插入到链表的表尾,为此需增加一个尾指针

        • 产生链表结点次序和输入数据顺序一致

    • 对结点S进行前插操作

      • 新建结点X连在结点S后

        • 交换X与S中数据
    • 其他操作略(查找、插入、删除、求表长)

本质上只要学会结点链表定义,其他操作都是对指针的操作,弄清楚箭头顺序即可,原则是确保不会造成断链和结点丢失

在这里插入图片描述

双链表

在这里插入图片描述

  • 概念在这里插入图片描述

    • 为了能快速对前驱结点操作,引入双链表。双链表结点中有两个指针priot与next,分别指向其前驱结点和后继结点

      •   typedef struct DNode{
                  ElemType data;
                  struct DNode *prior, *next;
          }DNode, *DLinklist
        
  • 插入操作

    • 在这里插入图片描述

      •   s->next=p->next;         //将结点*s插入到结点*p之后
          p->next->prior=s;
          s->prior=p;
          p->next=s;
        

在这里插入图片描述

		- 链表的操作原则是,确保不会造成断链和结点丢失
  • 删除操作
    • 在这里插入图片描述

      •   p->next=q->next;
          q->next->prior=p;
          free(q);
        

在这里插入图片描述

  • 遍历操作在这里插入图片描述
小结

在这里插入图片描述

循环链表
  • 循环单链表

    • 在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

      • 概念

        • 与单链表区别:表中最后一个结点的指针不是NULL,而指向头结点,形成一个环
      • 判空条件

        • 头结点的指针是否等于头指针
      • 注意:循环单链表一般不设头指针,只设尾指针R(王道讲课似乎都是头指针)
        在这里插入图片描述

  • 循环双链表

    • 在这里插入图片描述
      在这里插入图片描述

      • 概念

        • 与循环单链表区别:头结点的prior指针还要指向表尾结点
      • 判空条件

        • 当循环双链表为空时,头结点的prior域和next域都等于L

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小结

在这里插入图片描述

静态链表
  • 在这里插入图片描述

    • 概念

      • 静态链表借助数组来描述线性表的链式存储结构,结点也有数据域和指针域,其指针是结点的相对地址(数组下标,又称游标)
    • 特点

      • 需要预先分配一块连续内存空间(容量固定不变)、插入删除无需移动元素、不能随机存取
    • 适用场景

      • 不支持指针的低级语言、数据元素数量固定不变的场景(如操作系统的文件分配表FAT)
        在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

小结

在这里插入图片描述

顺序表V.S.链表

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

不同链表的时间效率比较

序号链表类型查找表头结点时间复杂度查找表尾结点时间复杂度查找结点*P的前驱结点时间复杂度
1带头结点的单链表LL->next,时间复杂度O(1)从L->next依次向后遍历,时间复杂度O(n)通过p->next无法找到其前驱(双指针可以)
2带头结点仅设头指针L的循环单链表L->next,时间复杂度O(1)从L->next依次向后遍历,时间复杂度O(n)通过p->next可以找到其前驱,时间复杂度O(n)
3带头结点仅设尾指针R的循环单链表R->next,时间复杂度O(1)R,时间复杂度O(1)通过p->next可以找到其前驱,时间复杂度O(n)
4带头结点的双向循环链表LL->next,时间复杂度O(1)L->prior,时间复杂度O(1)p->prior,时间复杂度O(1)

顺序表和链表的比较

比较项目/存储结构顺序表链表
存储空间预先分配,会导致空间闲置或溢出动态分配,不会出现闲置或溢出现象
存储密度不用为表示结点间的逻辑关系而增加额外存储开销需要借助指针体现元素间逻辑关系,存储密度小于1
存取元素随机存取,按位置访问元素时间为O(1)顺序存取,按位置访问元素复杂度为O(n)
插入、删除平均移动约表中一半元素,时间复杂度O(n)无需移动元素,确定位置后时间复杂度为O(1)
适用情况表长变化不大,且能事先确定变化范围,很少进行插入删除操作,经常按元素位置访问长度变化较大,频繁进行插入或删除操作

补充代码

C++也可以用STL中的vector容器实现动态增长的数组

  • STL是C++的标准模版库,也就是C++标准里帮我们写好了一些经常用到的东西,对于基础的数据结构,都已经给我们写好,比如写广度优先,队列的代码就可以直接用STL的queue容器,我们只要调用函数即可
    随便给大家找个使用指南https://blog.csdn.net/weixin_43772166/article/details/104076670
    相当于在处理算法题时候STL可以很方便帮我们完成数据结构部分,不用自己造轮子,但对于考研,如果题目就是让你实现一个循环队列,那就老老实实自己写,总之可以用但最好自己写(自己写相当于在说我很牛,你咋么敢扣分的啊),如果时间不够可以考虑用

单链表(数组模拟)

  •   int v[N], l[N], idx;                        //初始化,分别为值、下一结点坐标、下一结点下标
      
      void init(){
          l[0] = -1;
          idx = 1;
      }
      void insert(int k, int x){             //去head,直接idx=0存头指针,使k无需-1,且消除头结点的特殊操作
          v[idx] = x;
          l[idx] = l[k];
          l[k] = idx++;
      }
      void delete_v(int k){
          l[k] = l[l[k]];
      }
    

双向链表(数组模拟)

  •   int v[N], l[N], r[N], idx;                             //同理
      
      void init(){
          l[0]=-1, r[0]=1, l[1]=0, r[1]=-1;              //用最开始两个结点做头尾指针
          idx=2;
      }
      void insertL(int k,int x){                        //注意这里的三个函数,由于占用了数组前两个元素,题目给的k值需要+1
          v[idx] = x;
          l[idx] = l[k];
          r[idx] = k;
          r[l[k]] = idx;
          l[k] = idx++;
      }
      void insertR(int k,int x){
          v[idx] = x;
          r[idx] = r[k];
          l[idx] = k;
          l[r[k]] = idx;
          r[k] = idx++;
          
      }
      void delete_v(int k){
          r[l[k]] = r[k];
          l[r[k]] = l[k];
      }
    

考研真题

408 - 2023

(考研真题待更新)

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

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

相关文章

ShardingSphere水平分表——开发经验(2)

1. 什么场景下分表? 数据量过大或者数据库表对应的磁盘文件过大。 Q:多少数据分表? A:网上有人说1kw,2kw?不准确。 1、一般看字段的数量,有没有包含text类型的字段。我们的主表里面是不允许有t…

Github 2024-03-24php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10JavaScript项目1Nextcloud服务器:安全的数据之家 创建周期:2796 天开发语言:PHP, JavaScript协议类型:GNU Affero General Public…

计算机网络⑧ —— IP地址

IP位于TCP/IP参考模型的第三层,也就是⽹络层 ⽹络层的主要作⽤:实现主机与主机之间的通信,也叫点对点通信 问题1:⽹络层(IP)与数据链路层(MAC)有什么关系呢? MAC的作⽤:实现直连的两个设备之间通信。IP的…

包子凑数 蓝桥杯

关于这题的数学定理,如果 a,b 均是正整数且互质,那么由 axby,x≥0,y≥0 不能凑出的最大数是 :a*b-a-b 想不起来的时候,把能列出来的数据列出来找规律,不互质得数不符合题目所说 类似于力扣零钱…

【boost_search搜索引擎】1.获取数据源

boost搜索引擎 1、项目介绍2、获取数据源 1、项目介绍 boost_search项目和百度那种不一样,百度是全站搜索,而boost_search是一个站内搜索。而项目的宏观上实现思路就如同图上的思路。 2、获取数据源 我们要实现一个站内搜索,我们就要有这…

包含多个段的程序

文章目录 包含多个段的程序在代码段中使用数据在代码段中使用栈将数据、代码、栈放入不同的段 包含多个段的程序 在代码段中使用数据 考虑这样一个问题,编程计算以下8个数据的和,结果存在ax 寄存器中:0123H,0456H,07…

中性点接地问题的matlab仿真与分析

1、内容简介 略 81-可以交流、咨询、答疑 2、内容说明 略电力系统的中性点接地方式通常是按电压等级 的高低来进行选取的, 我国中压电网普遍采用的有 3 种方式 :不接地 、经消弧线圈接地和经电阻接地。 电力系统在正常运行时, 对不同的中性点接地方式及其差异, 基本上没有…

海外媒体宣发:十大国外中文网站-大舍传媒

十大国外中文网站 1、欧洲时报 覆盖欧洲且较具影响力的华文媒体 国外中文新闻网站,欧洲时报文化传媒集团旗舰日报《欧洲时报》旗下官方网站,总部设在法国巴黎,创刊于1983年,现已成为唯一发行覆盖全欧、发行量最大、最具影响力的华…

ubuntu上一款好用的串口工具screen

看名字,你猜他是什么? 安装 sudo apt install screen 然后将USB串口接到虚拟机,执行dmesg命令查看串口设备名: 测试: sudo screen /dev/ttyUSB0 115200确实很简单。

Python入门(七)

递归 递归是函数调用其自身的操作。递归源自数学归纳法。数学归纳法(Mathematical Induction)是一种数学证明方法,常用于证明命题在自然数范围内成立。 计算1到100的和: def gaussian_sum(n): if n 1: return 1 else: return …

Spring Boot集成zxing实现生成二维码功能

1.二维码介绍 二维码QR Code(Quick Response Code) 由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。 ZXing 一个支持在图像中解码和生成条形码(如…

项目1-加法计算器

1.创建项目 2.导入前端代码 2.1 static包内 2.2 测试前端代码是否有误 显示成功说明无误 2.3 定义用户接口 请求路径:calc/sum 请求方式:GET/POST 接口描述:计算两个整数相加 请求参数: 参数名类型是否必须备注num1Integer是参与计算的第…

代码随想录算法训练营Day56 ||leetCode 583. 两个字符串的删除操作 || 72. 编辑距离

647. 回文子串 dp[i][j]表示第i位开始&#xff0c;第j位结束的字符串是否为回文串 class Solution { public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int result 0;for (int i s.size() - 1…

【WEEK4】 【DAY5】AJAX - Part Two【English Version】

2024.3.22 Friday Following the previous article 【WEEK4】 【DAY4】AJAX - Part One【English Version】 Contents 8.4. Ajax Asynchronous Data Loading8.4.1. Create User.java8.4.2. Add lombok and jackson support in pom.xml8.4.3. Change Tomcat Settings8.4.4. Mo…

深入探索C语言动态内存分配:释放你的程序潜力

&#x1f308;大家好&#xff01;我是Kevin&#xff0c;蠢蠢大一幼崽&#xff0c;很高兴你们可以来阅读我的博客&#xff01; &#x1f31f;我热衷于分享&#x1f58a;学习经验&#xff0c;&#x1f3eb;多彩生活&#xff0c;精彩足球赛事⚽ &#x1f31f;感谢大家的支持&#…

Rust egui(3) 增加多个tab

话说不知道咋写&#xff0c;要不直接上git patch吧。代码都是移植的官方demo&#xff0c;核心改动就是把原来的line_demo换成了plot_demo&#xff0c;里面实现多个ui&#xff0c;然后点击tab标题会切换不同的ui。 如下图&#xff0c;Lines和Markers两个不同的标签对应不同的ui。…

基于Google云原生工程师的kubernetes最佳实践(二)

目录 二、应用部署篇 为deployment打上丰富的label,以便selecting 使用sidecar容器部署agent、proxy等组件 使用init container处理依赖关系,而不要用sidecar 镜像tag使用版本号,不要用latest或空tag 为pod设置readiness和liveness探针 不要给所有服务都使用LoadBalance…

eNSP实验一(静态)

目录 命名更改 子网划分 配置IP DHCP配置 配置静态路由 NET设置 Telnet及端口映射 浮动静态路由 命名更改 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]sysname R1 [R1] 1、R6为ISP&#xff0c;接口IP地址均为公有地址(12.0…

RuleApp资源社区,知识付费社区,可对接typecho的小程序APP

强大的文章/社区/自媒体客户端&#xff0c;支持打包为安卓&#xff0c;苹果&#xff0c;小程序。包括文章模块&#xff0c;用户模块&#xff0c;支付模块&#xff0c;聊天模块&#xff0c;商城模块等基础功能&#xff0c;包含VIP会员&#xff0c;付费阅读等收费体系&#xff0c…

蓝桥杯第十五届抱佛脚(二)竞赛中的数据结构

蓝桥杯第十五届抱佛脚&#xff08;二&#xff09;内置数据结构 文章目录 蓝桥杯第十五届抱佛脚&#xff08;二&#xff09;内置数据结构在竞赛中常见的数据结构数组(Array)链表(Linked List)栈(Stack)队列(Queue)树(Tree)映射(Map) 内置数据结构的快速使用迭代器&#xff08;It…