CSP初赛知识精讲--线性数据结构

第十五节 线性树形结构

基础知识

线性表

 线性表是指由n个具有相同特性的数据元素组成的有限序列,是最基本、最简单,也是最常用的一种数据结构。队列、栈、链表、哈希表等数据结构逻辑上都属于线性表。一般来讲,表中数据之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其他数据元素都是首尾相接的。
特性

  • 线性表中的数据元素的个数n定义为线性表的长度,n=0时称为空表。
  • 非空表中必定存在第一个元素和最后一个元素
  • 非空表中的元素,除了最后一个元素外,均有唯一的后继;除了第一个元素外,均有唯一的前驱

逻辑结构
在这里插入图片描述

物理结构
 线性表可由顺序存储或链式存储表示,实际应用中常以栈、队列、字符串等特殊形式使用。

操作

  • C r e a t e ( L , l e n g t h ) : Create(L,length): Create(L,length):建立长度为 l e n g t h length length的线性表。
  • I n i t ( L ) : Init(L): Init(L):初始化线性表为空。
  • C l e a r ( L ) : Clear(L): Clear(L):清空数据元素。
  • I s E m p t y ( L ) : IsEmpty(L): IsEmpty(L):如果表 L L L为空则返回 t r u e true true,否则返回 f a l s e false false
  • L e n g t h ( L ) : Length(L): Length(L):返回表 L L L的长度,即表中元素的个数。
  • G e t ( L , i ) : Get(L,i): Get(L,i):获取表 L L L中位置为 i i i处的元素 ( 1 ≤ i ≤ n ) (1≤i≤n) (1in)
  • P r i o r ( L , i ) : Prior(L,i): Prior(L,i): i i i的前驱元素。
  • N e x t ( L , i ) : Next(L,i): Next(L,i): i i i的后继元素。
  • I n s e r t ( L , i , x ) : Insert(L,i,x): Insert(L,i,x):在表 L L L的位置 i i i处插入元素 x x x,后面的元素都向后挪一个位置。
  • D e l e t e ( L , p ) : Delete(L,p): Delete(L,p):从表 L L L中删除位置 p p p处的元素。
  • U p d a t e ( L , i , v ) : Update(L,i,v): Update(L,i,v):修改表 L L L i i i位置的元素为 v v v
  • L o c a t e ( L , x ) : Locate(L,x): Locate(L,x):获取元素 x x x在表 L L L中的位置。
  • T r a v e r s e ( L ) : Traverse(L): Traverse(L):遍历输出所有元素。
  • S o r t ( L ) : Sort(L): Sort(L):对表 L L L中的所有元素排序。

队列

 队列(queue)是一种特殊的线性表,只允许在表的头部(队首)进行删除操作,只允许在表的尾部(队尾)进行插入操作,是一种操作受限制的线性表。在队列中插入一个队列元素称为入队操作,从队列中删除一个队列元素称为出队操作。
特性
 因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO,first in first out)线性表。
逻辑结构
在这里插入图片描述
物理结构
 队列可以用顺序存储方式实现,借助数组可简单模拟一个队列,但数组空间难以确定,太小会导致空间不足,太多会造成空间浪费。
 借助链式存储的队列无须确定空间大小,虽然创建、插入和删除节点较为烦琐,但可以实现空间的动态增长。
操作(以STL中的queue库为例)

#include<queue>
queue <int> q;	//新建队列q,队列中的元素类型为int
q.size();		//返回队列长度
q.empty();		//判断队列是否为空,空则返回true
q.push(node);	//入队操作,node入队
q.pop();		//出队操作
q.front();		//返回队首元素
q.back();		//返回队尾元素

 栈(stack)也是一种操作受限的线性表,只能在表的一端进行插入和删除操作,这一端称为栈顶,相对的另一端称为栈底。向栈内添加新元素的操作称为入栈、进栈、压栈,删除元素称为出栈、退栈。
特性
 由于栈只允许在一端进出,所以只有最先进入队列的元素反而最后才能出去,故栈又称为先进后出(FILO,first in last out)线性表。
逻辑结构
在这里插入图片描述

物理结构
 和队列一样,栈也可以用顺序结构存储,并使用数组简单模拟,但会有空间浪费。使用链式存储虽然烦琐,但优点还是可以实现空间的动态增长,防止空间浪费。
操作(以STL中的stack库为例)

#include<stack>
stack<int> s;	//新建栈s,存储元素类型为int
s.size();		//返回栈中元素数量
s.empty();		//判断栈是否为空,空则返回true
s.push(node);	//入栈操作,node入栈
s.pop();		//出栈操作
s.top();		//获取栈顶元素

链表

 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
 链表由一系列节点(链表中的每一个元素称为节点)组成,节点可以再运行时动态生成,克服了数组需要预先知道数据量大小的缺点。每个节点包括两个部分:一个是存储数据元素的数据域,另一个时存储相邻节点地址的指针域
特性
 根据指针域的不同,链表可分为单向链表和双向链表,单向链表中各节点只记录后继元素的地址,双向链表的节点会记录前驱、后继两个节点的地址。
 相较于线性表的顺序结构,链表操作复杂。由于不必按顺序存储,链表在插入的时候可以达到 O ( 1 ) O(1) O(1)的复杂度,比线性表快得多,但是查找一个节点或者访问特定编号的节点则需要 O ( n ) O(n) O(n)的时间,而线性表和顺序表相应的时间复杂度分别是 O ( l o g n ) O(log n) O(logn) O ( 1 ) O(1) O(1)
逻辑结构(双向链表)
在这里插入图片描述
物理结构
 链表使用链式存储方式存储数据,便于插入和删除,遍历方面可以通过ST表等进行优化。竞赛中链表的插入和删除操作顺序时常考点

哈希表

 哈希表(hash table)又称散列表,是根据数据关键值直接进行访问的数据结构。也就是说,它通过把关键值有映射到表中的一个位置来存储和访问,从而加快查找的速度。这个映射函数称为哈希函数(散列函数),存放数据的数组称为哈希表(散列表)
 给定表 M M M,若存在函数 f ( k e y ) f(key) f(key),对任意给定的关键字 k e y key key,带入函数后能得到包含关键字的记录在表中的地址,则称表 M M M为哈希表,函数 f ( k e y ) f(key) f(key)为哈希函数。
 简单来说,哈希表是一种通过哈希函数将特定的键映射到特定值的一种数据结构,它维护者键和值之间的一一对应关系。

  • ( k e y ) (key) (key):又称为关键字,是要存储的数据的唯一标识符,可以是数据本身或者数据的一部分。
  • ( s l o t / b u c k e t ) (slot/bucket) (slot/bucket):哈希表中用于保存数据的一个单元,即数据存放的容器。
  • 哈希函数 ( h a s h f u n c t i o n ) (hash function) (hashfunction):将键 ( k e y ) (key) (key)映射到值 ( v a l u e ) (value) (value)的函数,映射出的值即存放数据的槽所在的位置。
  • 哈希冲突 ( h a s h c o l l i s i o n ) (hash collision) (hashcollision):哈希函数将两个不同键映射到同一个值得情况。

举例
 现有一个数组 a [ 10 ] a[10] a[10],待存入得数据有 1 、 2 、 3 、 4 、 5 1、2、3、4、5 12345,若哈希函数为 f ( x ) = x f(x)=x f(x)=x,那么各数据存入为 a [ f ( x ) ] = x a[f(x)]=x a[f(x)]=x,带入得:

  • a [ f ( 1 ) ] = 1 → a [ 1 ] = 1 a[f(1)]=1 \rightarrow a[1]=1 a[f(1)]=1a[1]=1
  • a [ f ( 2 ) ] = 2 → a [ 2 ] = 2 a[f(2)]=2 \rightarrow a[2]=2 a[f(2)]=2a[2]=2
  • a [ f ( 3 ) ] = 3 → a [ 3 ] = 3 a[f(3)]=3\rightarrow a[3]=3 a[f(3)]=3a[3]=3
  • a [ f ( 4 ) ] = 4 → a [ 4 ] = 4 a[f(4)]=4 \rightarrow a[4]=4 a[f(4)]=4a[4]=4
  • a [ f ( 5 ) ] = 5 → a [ 5 ] = 5 a[f(5)]=5 \rightarrow a[5]=5 a[f(5)]=5a[5]=5
    由此便得到了一个简单得哈希数组{ − , 1 , 2 , 3 , 4 , 5 , − , − , − , − -,1,2,3,4,5,-,-,-,- ,1,2,3,4,5,,,,}。
     再来一各数组 a [ 11 ] a[11] a[11],带存入的数据有 2 、 6 、 10 、 17 2、6、10、17 261017,若哈希函数为 f ( x ) = x f(x)=x f(x)=x m o d mod mod 11 11 11,那么: f ( 2 ) = 2 , f ( 6 ) = 6 , f ( 10 ) = 10 , f ( 17 ) = 6 f(2)=2,f(6)=6,f(10)=10,f(17)=6 f(2)=2,f(6)=6,f(10)=10,f(17)=6
     键 6 6 6 17 17 17通过哈希函数映射出的值均为 6 6 6,发生了冲突,应考虑更换哈希函数或解决冲突。

范例精讲

例1 向一个栈顶指针为 h s hs hs的链式栈中插入一个指针 s s s指向的节点时,应执行( )。
 A. h s hs hs-> n e x t = s ; next=s; next=s;
 B. s s s-> n e x t = h s ; h s = s ; next=hs;hs=s; next=hs;hs=s;
 C. s s s-> n e x t = h s next=hs next=hs-> n e x t ; h s next;hs next;hs-> n e x t = s ; next=s; next=s;
 D. s s s-> n e x t = h s ; h s = h s next=hs;hs=hs next=hs;hs=hs-> n e x t ; next; next;
 【正确答案】B
解析:为栈顶元素 n e x t next next指针赋值就是入栈操作,入栈后应记得更新栈顶指针。

例2 双向链表中有两个指针域 l l i n k llink llink r l i n k rlink rlink,分别指向前驱与后继。设 p p p指向链表中的一个节点, q q q指向一待插入节点,现要求在 p p p前插入 q q q,则正确的插入为( )。
 A. p p p-> l l i n k = q ; q llink=q;q llink=q;q-> r l i n k = p ; p rlink=p;p rlink=p;p-> l i n k link link-> r l i n k = q ; q rlink=q;q rlink=q;q-> l l i n k = p llink=p llink=p-> l l i n k ; llink; llink;
 B. q q q-> l l i n k = p llink=p llink=p-> l l i n k ; p llink;p llink;p-> l l i n k llink llink-> r l i n k = q ; q rlink=q;q rlink=q;q-> r l i n k = p ; p rlink=p;p rlink=p;p-> l l i n k = q llink=q llink=q-> r l i n k ; rlink; rlink;
 C. q q q-> r l i n k = p ; p rlink=p;p rlink=p;p-> r l i n k = q ; p rlink=q;p rlink=q;p-> l l i n k llink llink-> r l i n k = q ; q rlink=q;q rlink=q;q-> r l i n k = p ; rlink=p; rlink=p;
 D. p p p-> l l i n k llink llink-> r l i n k = q ; q rlink=q;q rlink=q;q-> r l i n k = p ; q rlink=p;q rlink=p;q-> l l i n k = p llink=p llink=p-> l l i n k ; p llink;p llink;p-> l l i n k = q ; llink=q; llink=q;
 【正确答案】D
解析:插入新节点时,需要注意改变指针指向时不要弄丢节点( p p p-> l l i n k llink llink)。题目最终要实现的效果如下:
在这里插入图片描述
 第一步: p p p-> l l i n k llink llink-> r l i n k = q ; rlink=q; rlink=q;
在这里插入图片描述
 第二步: q q q-> r l i n k = p rlink=p rlink=p
在这里插入图片描述
 第三步: q q q-> l l i n k = p llink=p llink=p-> l l i n k llink llink
在这里插入图片描述
 第四步: p p p-> l l i n k = q llink=q llink=q
在这里插入图片描述

赛题训练

  1. 今有一空栈 S S S,对下列待进栈的数据元素序列 a 、 b 、 c 、 d 、 e 、 f a、b、c、d、e、f abcdef依次进行进栈、进栈、出栈、进栈、进栈、出栈的操作,则此操作完成后,栈底元素为( )。
     A. b b b B. a a a C. d d d D. c c c
  2. ( 2 , 7 , 10 , 18 ) (2,7,10,18) (2,7,10,18)分别存储到某个地址区间为 0 0 0~ 10 10 10的哈希表中,如果哈希函数 h ( x ) = ( h(x)=( h(x)=( ) ) ),将不会产生冲突,其中 a a a m o d mod mod b b b表示 a a a除以 b b b的余数。
     A. x 2 x^2 x2 m o d mod mod 11 11 11  B. 2 x 2x 2x m o d mod mod 11 11 11  C. x x x m o d mod mod 11 11 11  D. x / 2 x/2 x/2 m o d mod mod 11 11 11(除法下取整)
  3. 链表不具有的特点是( )。
     A.可随机访问任一元素。
     B.不必事先估计存储空间。
     C.插入和删除不需要移动元素。
     D.所需空间与线性表长度成正比。
  4. 下图中所使用的数据结构是( )。
    在这里插入图片描述
     A.栈 B.队列 C.二叉树 D.哈希表

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

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

相关文章

WPS Word自动编号转文本

原理 使用WPS自带的宏功能&#xff0c;一键替换 过程 调出"开发工具"选项 文件->选项->自定义功能区->选中开发工具->确认 创建宏 工具 -> 运行宏 编写宏 在弹出来的框里&#xff0c;粘贴代码 如果弹窗类似如下&#xff0c;这是JS宏 则…

Spark-机器学习(5)分类学习之朴素贝叶斯算法

在之前的文章中&#xff0c;我们学习了回归中的逻辑回归&#xff0c;并带来简单案例&#xff0c;学习用法&#xff0c;并带来了简单案例。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵…

阿里云企业邮箱API的使用方法?调用限制?

阿里云企业邮箱API性能如何优化&#xff1f;配置邮箱API的优势&#xff1f; 阿里云企业邮箱以其稳定、高效和安全的特点&#xff0c;受到了众多企业的青睐。而阿里云企业邮箱API的开放&#xff0c;更是为企业提供了更加灵活、便捷的管理和操作方式。下面&#xff0c;我AokSend…

用过最佳的wordpress模板

西瓜红&#xff0c;作为一种充满活力和激情的颜色&#xff0c;总是能给人留下深刻的印象。当这种鲜艳的色彩与经典的设计元素相结合时&#xff0c;就能打造出一款既时尚又实用的WordPress企业模板。今天&#xff0c;我们向您隆重推荐这款西瓜红经典配色WordPress企业模板。 这…

User Agent 解析:它是什么以及工作原理

什么是User Agent? UserAgent&#xff0c;简称UA&#xff0c;是一个使服务器能够识别用户使用的浏览器类型、版本以及运行浏览器的操作系统等信息的字符串。它作为浏览器请求头部信息的一部分发送给服务器&#xff0c;以便服务器可以返回合适格式和版本的内容。 跟Cookie一样…

proteus+stm32+CubeMX+dht11+lcd1602

浅浅记录下过程遇到的问题&#x1f921;&#x1f921;&#x1f921; 1 供电网配置错误&#xff08;加上就好了 新起个名也会出这个 / 电源不起名 不创建估计项目也会&#xff09;没zet6的 proteus 里 固件库 账号注册半天没成 就用的stm32F103R6的然后发现单片机不输出高低电平…

阿里云服务器开放端口的最最最正确的方法

今天&#xff0c;我突然发现阿里云服务器端口无法访问ElasticSearch了&#xff0c;嗯&#xff1f;&#xff1f;&#xff1f;肿么回事&#xff0c;搜遍了全网&#xff0c;终于在我身心俱疲后找到了原因&#xff1a; 现在我来总结一下出现这种问题的原因以及解决步骤 &#xff1a…

电机入门1

文章目录 122.12.22.3 33.13.23.33.4 1 2 2.1 电机板 驱动板电机分类 驱动器分类 转速 转向扭矩定时器 ADC 2.2 PID 自动控制 的核心闭环控制算是 PID的应用 2.3 无刷电机用的 可大大提高其控制效率 和控制精度 3 开发板的IO 电流太小了 20~25ma 电机要A 驱动板 信号放大没舵…

守护人类健康:人工智能赋能医疗领域创新应用

常言道&#xff0c;“如果说人生是一场漫长的马拉松&#xff0c;那么健康将是决定跑道长度的关键因素。”健康是幸福生活和社会发展的基石。随着智能化时代的到来&#xff0c;人工智能技术在医疗健康领域的应用也日益广泛&#xff0c;成为了维护和促进人类健康的新工具。无论是…

《汇编语言》- 读书笔记 - 综合研究

《汇编语言》- 读书笔记 - 综合研究 研究试验 1 搭建一个精简的 C 语言开发环境1. 下载2. 配置3. 编译4. 连接 研究试验 2 使用寄存器1. 编一个程序 ur1.c &#xff08; tcc 用法&#xff09;tcc 编译连接多个源文件tlink 手动连接 2.用 Debug 加载 ur1.exe&#xff0c;用u命令…

如何在现场电脑是部署onnx模型

调整版本为Release x64&#xff08;关键&#xff09;并配置好CUDA和CUDNN。 注意&#xff1a;Release | x64是基类主配置&#xff0c;包含目录下有编译器的一些链接库 以及一些库目录&#xff1a; 以及附加依赖项&#xff1a; msvcprt.lib kernel32.lib user32.lib gdi32.l…

代码随想录算法训练营day40

题目&#xff1a;343. 整数拆分、96.不同的二叉搜索树 参考链接&#xff1a;代码随想录 343. 整数拆分 思路&#xff1a;五部曲来走。dp数组&#xff0c;dp[i]用于记录拆i得到的最大乘积和&#xff0c;我们要求的也就是dp[n]&#xff1b;递推公式&#xff0c;我们想拆分i&am…

ZooKeeper集群的搭建

ZooKeeper集群的搭建 将master节点的/data目录下的ZooKeeper安装包解压到/opt/software目录下 tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz -C /opt/software/在master节点切换至ZooKeeper安装目录的conf目录下&#xff0c;将zoo_sample.cfg重命名为zoo.cfg&#xff0c;并…

OpenHarmony语言基础类库【@ohos.util.LinkedList (线性容器LinkedList)】

LinkedList底层通过双向链表实现&#xff0c;双向链表的每个节点都包含对前一个元素和后一个元素的引用。当需要查询元素时&#xff0c;可以从头遍历&#xff0c;也可以从尾部遍历&#xff0c;插入、删除效率高&#xff0c;查询效率低。LinkedList允许元素为null。 LinkedList…

基于Springboot的点餐平台

基于SpringbootVue的点餐平台的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页展示 菜品信息 菜品资讯 购物车 后台登录 用户管理 菜品分类管理 菜品信息管理 …

#ESP32S3N8R8(按键点灯)

一、按键对应端口为GPIO0&#xff08;上拉&#xff09; 二、代码 #include <stdio.h> #include "driver/gpio.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "unistd.h"void app_main(void) {int co…

YOLOv8 实现车牌检测,生成可视化检测视频(20240424)

原项目源码地址&#xff1a;GitHub 我的源码地址&#xff1a;Gitee 环境搭建请参考&#xff1a;Win10 搭建 YOLOv8 运行环境&#xff08;20240423&#xff09;-CSDN博客 环境测试请参考&#xff1a;本地运行测试 YOLOv8&#xff08;20240423&#xff09;-CSDN博客 训练数据…

【java数据结构-优先级队列向下调整Topk问题,堆的常用的接口详解】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a;基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 …

OpenHarmony实战开发-媒体查询 (@ohos.mediaquery)

概述 媒体查询作为响应式设计的核心&#xff0c;在移动设备上应用十分广泛。媒体查询可根据不同设备类型或同设备不同状态修改应用的样式。媒体查询常用于下面两种场景&#xff1a; 针对设备和应用的属性信息&#xff08;比如显示区域、深浅色、分辨率&#xff09;&#xff0…

异步日志方案spdlog

异步日志方案spdlog spdlog 是一款高效的 C 日志库&#xff0c;它以其极高的性能和零成本的抽象而著称。spdlog 支持异步和同步日志记录&#xff0c;提供多种日志级别&#xff0c;并允许用户将日志输出到控制台、文件或自定义的接收器。 多线程使用和同步、异步日志没有关系是…