数据结构的基本概念与算法2

news2025/1/14 18:28:21

线性表 :

      线性表 是具有相同数据类型的 n (n >= 0) 个数据元素的有限序列,其中 n 为表长,当 n = 0 时线性表是一个空表;若用 L 命名线性表,则其一般表示为:L = (a1 , a2 , ... ai , ai+1 , ... an)

        上述中,ai 是线性表中的  " 第 i 个 "  元素线性表中的位序;a1 是表头元素;an是表尾元素;

除了第一个元素外,每个元素有且仅有一个直接前驱;出最后一个元素外,每个元素有且仅有一个直接后继;

线性表有以下 3 大特点:

        1.逻辑结构

        2.存储(物理)结构 
                顺序表:
                链   表:
                        双向链表:
                        循环链表
                        静态链表:

        3.插入删除操作

顺序表:数组 就是顺序表,如下图所示 ->


 

单链表:头指针 -> 头结点(每个节点有一个数据位,和一个指针位)-> 下一个节点 ... ->尾结点 -> null      如下如所示->

循环链表:头指针 -> 头结点(每个节点有一个数据位,和一个指针位)-> 下一个节点 ... ->尾结点 -> 头指针    如下如所示->

双向链表:每个节点有一个数据位,和一个前驱指针位,和一个后继指针位;每个节点都可以通过前驱指针和后继指针找到与自己相邻的两个元素   如下如所示->

线性表 - 存储结构
性能类别        具体项目顺序存储链式存储
空间性能存储密度= 1 ,更优< 1
容量分配事先确定动态改变,更优
时间性能查找运算O(n / 2)O(n / 2)
读运算O(1),更优O( [ n + 1 ] /2 ),最好情况为 1 ,最坏情况为 n
插入运算O(n / 2),最好情况为0,最坏情况为 nO (1),更优
删除运算O([n - 1] / 2)O (1),更优

线性表 - 插入和删除操作:

        顺序存储:插入元素前要移动元素,以挪出空的存储单元,然后再插入元素;删除元素时同样需要移动元素,以填充被删除的元素的存储单元;

        链式存储:链式存储的插入和删除操作相较于顺序存储,优势在于不需要移动元素,只需要改变指针的指向即可完成插入和删除操作;

栈和队列 

栈定义:

        栈(Stack)是 只允许在一端进行插入或删除操作线性表

队列定义:

        队列是一种先进先出 (FIFO)的线性表,他只允许在表的一端插入元素,而在表的另一端删除元素;在队列中,允许插入元素的一端成为队尾(Rear),允许删除元素的一端称为队头(Front);

循环链表:

例题:输出受限的双端队列是指元素可以从队列的两端输入,但只能从队列的一端输出,如下图所示,若有 e1 ,e2 ,e3 ,e4 依次进入输出受限的双端队列,则得不到的输出队列为 ( D )   注释:下图的意思是,左右两边都能进,但是只能从左边出;

A. e4 、 e3 、 e2 、 e1

B. e4 、 e2 、 e1 、 e3

C. e4 、 e3 、 e1 、 e2

D. e4 、 e2 、 e3  、e1

串、数组、矩阵和广义表

串:

        串(字符串)是仅由字符构成的有限序列,是取指范围受限的线性表;一般记为 S = ‘ a1   a2   ~~~  an ’,其中  S 是串名, a1   a2   a3  是串值;

        1.空串:长度为零的串,空串不包含任何字符;

        2.空格串:由一个或多个空格组成的串;

        3.子串:由串中任意长度的连续字符构成的序列;含有子串的串成为主串;子串在主串中的位置是指子串首次出现时,该子串的第一个字符在主串中的位置;空串是任意串的子串;

        4.串相等:指两个串长度相等且对应位置上的字符也相同;

        5.串比较:两个串比较大小时以字符的 ASCII 码值作为依据;比较操作从两个串的第一个字符开始进行,字符的 ASCII 码值大者所在的串为大;若其中一个串先结束,则以串长较大者为大;

1.对串进行的基本操作有以下几种:

        (1)赋值操作StrAssign ( s , t ) :将串 t 的值赋给串 s;
        (2)连接操作Concat ( s , t ) :将串t接续在串s的尾部,形成一个新串;
        (3)求串长StrLength ( s ) :返回串 s 的长度;
        (4)串比较StrCompare ( s , t ) : 比较两个串的大小;
        (5)求子串SubString ( s , tart , len):返回串s中从start开始的、长度为 len 的字符序列;

2、串的存储结构

        (1) 串的顺序存储:定长存储结构;
        (2) 串的链式存储:块链;

        子串的定位操作通常称为串的 模式匹配,它是各种串处理系统中最重要的运算之一。子串也称为模式串;

数据类型       存储地址计算
一维数组 a [ n ] a [ i ] 的存储地址为:a + i * len   (注释:a 表示起始位置地址)
二维数组 a [ m ] [ n ] 

a [ i ] [ j ] 的存储地址(按行存储)为:a + ( i * n + j ) * len

a [ i ] [ j ] 的存储地址(按列存储)为:a + (i * m + j ) * len

 (注释:a 表示起始位置地址)

例题:已知 5行5列 的二维数组 a 中的个元素占两个字节,求元素 a [ 2 ] [ 3 ] 按行优先存储的存储地址是多少?

解题:

已知:m = 5,n = 5,i= 2,j = 3,len = 2,并且按行优先

直接套上述表格中的公式求得:a + ( 2 * 5 + 3 ) * 2 = a+26

最终答案为:a + 26  (注释:a表示起始位置地址)

稀疏矩阵:

        设有如下所示的下三角矩阵 A [0...8, 0...8 ],将该三角矩阵的非零元素(即行下标不小于列下标的所有元素)按行优先压缩存储在数组M [ 1 ... m ] 中,则元素 A [ i , j ] ( 0 <= i <= 8 )存储在数组 M 的( A )中;

解题:将三角矩阵中的点一个个带入选项中,由于是按照行优先存储(指的是一行一行存储,按照从上到下,从左到右依次存储),所以将(0,0)带入选项应该得到 M[ 1 ](题目中说明从 1 开始 -> M [ 1... m ],)也就是 1;如果带入一个点后仍未能确定答案,则继续带入检验即可;

广义表:

        广义表是n个表元素组成的有限序列,是线性表的推广;通常用递归的形式进行定义,记做:LS=(ao,a1……, an);
        注:其中 LS 是表名,ai 是表元素,它可以是表(称做子表),也可以是数据元素(称为原子);其中 n 是广义表的长度 ( 也就是最外层包含的元素个数 ) ,n=0 的广义表为空表;而递归定义的重数就是广义表的深度,直观地说,就是定义中所含括号的重数 ( 注意:原子的深度为0,空表的深度为 1 )

基本运算:取表头head(Ls)和取表尾tail(Ls)。

广义表:LS1 = ( a,( b,c ) ,( d ,e ) )
取表头:head ( Ls1 ) = a
取表尾:tail ( Ls1 ) = ( ( b , c ) , ( d , e ) )    【注释:取表尾操作 -> 除去第一个元素,剩下的所有元素组合成的广义表称为取表尾操作】

例1:有广义表 -> Ls1 = ( a , ( b ,c ) ,( d,e ) )  则其长度为多少,深度为多少?

长度为 3 (因为有三个元素)   深度为 2(因为有两重括号)


例2,有广义表 -> Ls1 = ( a , ( b ,c ) ,( d,e ) ) 要将其中的 b 字母取出,应该如何操作?

第一步:取表尾 -> tail ( Ls1 ) 可以得到 ( ( b ,c ) ,( d,e ) )

第二步:取表头 -> head (( ( b ,c ) ,( d,e ) ) )  可以得到  ( b ,c )

第三步:取表头 -> head ( ( b ,c ) ) 可以得到 b

所以综上所述,完整的操作为 :head ( head ( tail ( Ls1 ) ) ) 

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

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

相关文章

月木学途开发 2.项目架构

1.项目介绍 月木学途是一款it在线学习网站&#xff0c;项目采用前后端分离架构。前端开发主要使用vue.js&#xff0c;后端使用Spring Cloud Alibaba技术栈。项目包含学习网站的大部分功能&#xff0c;分为管理员端和用户端。管理员端有权限管理、课程管理、网站管理、求职模块管…

Shell函数和Shell 输入/输出重定向

LInux&#xff1a;Shell函数和Shell 输入/输出重定向 Shell函数 参数说明&#xff1a; 可以带function fun() 定义&#xff0c;也可以直接fun() 定义,不带任何参数。参数返回&#xff0c;可以显示加&#xff1a;return 返回&#xff0c;如果不加&#xff0c;将以最后一条命令运…

[Vue warn]: data functions should return an object:

仔细检查你的代码肯定有一个data()内忘记方return{}了

C语言程序设计23

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题2.11 从键盘输入B、O、Y三个字符&#xff0c;然后把他们输出到屏幕上 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //例题2.11 从键盘输入B、O、Y三个字符&#xff0c;然…

RabbitMQ:MQ的可靠性

MQ的可靠性 在默认情况下&#xff0c;RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟。这样会导致两个问题: 一旦MQ宕机&#xff0c;内存中的消息会丢失 内存空间有限&#xff0c;当消费者故障或处理过慢时&#xff0c;会导致消息积压&#xff0c;引发MQ阻塞。 …

高效、安全、共享|济南市升级教育城域网,重塑教育网络生态

文/济南市电化教育馆 电教教研室主任 张承强 导语: 近年来,济南市教育局以前瞻性的视野,将教育数字化转型视为推动教育高质量发展的基石,全力加速教育现代化进程。在这一蓝图下,教育城域网的升级改造项目被赋予了基础性、先导性和战略性的重要意义,成为探索教育数字化转型新路…

一键搞定PDF翻译,这四款是职场达人常备翻译工具!!!

作为外贸搬砖人的一份子&#xff0c;虽说外语功底还说地过去&#xff0c;但是每天过目大量pdf文件的翻译&#xff0c;难免还有些吃力&#xff0c;这个时候如果有可以辅助翻译的工具那就再好不过了&#xff0c;今天给大家带来四款非常适合pdf文件翻译的工具&#xff0c;总有一款…

C#中的通信

上位机应用开发-串口通信1、基于C#的串口通信对象:SerialPort 2、字段属性 PortName:获取或设置通信端口 BaudRate:获取或设置串行波特率-DataBits:获取或设置每个字节的标准数据位长度 Parity:获取或设置奇偶校验检查协仪I-StopBits;获取或设置每个字节的标准停止位数 3、…

你需要的Node版本管理神器NVM

在做项目的时候&#xff0c;很多人本地的node都是装一个固定版本&#xff0c;一旦有些项目要下的依赖需要更高版本的node支持的时候&#xff0c;此时需要升级node就得把已经安装的低版本node卸载了&#xff0c;然后再重新下载、安装高版本的node,既费时间又抓狂&#xff0c;特别…

大模型算法面试题(十九)

本系列收纳各种大模型面试题及答案。 1、SFT&#xff08;有监督微调&#xff09;、RM&#xff08;奖励模型&#xff09;、PPO&#xff08;强化学习&#xff09;的数据集格式&#xff1f; SFT&#xff08;有监督微调&#xff09;、RM&#xff08;奖励模型&#xff09;、PPO&…

网工内推 | 云运维工程师,最高19K,五险一金加补充医疗险

01 云计算运维工程师 &#x1f537;岗位职责 1、负责客户云计算解决方案的运维&#xff0c;负责云计算解决方案中云、虚拟化工作&#xff1b; 2、负责客户现场H3C产品的日常问题处理、变更维护、巡检、版本升级等工作&#xff0c;保障客户网络的稳定运行&#xff1b; 3、协调…

yolo数据集格式按照每一个类别的比例划分数据集

写在前面&#xff1a; 写脚本不易&#xff0c;写博客不易&#xff0c;请多点赞关注&#xff0c;谢谢。10多年来&#xff0c;我一直免费给大家毫无保留的分享技术等&#xff0c;不但从来没被打赏过&#xff0c;而且在分享有些模型转化处理的高级脚本中&#xff0c;有些同胞由于自…

pmp证书实用性怎么样,考这个性价比高不高,难度?

要是 PMP 证书没有价值&#xff0c;还会有那么多人愿意去考吗&#xff1f; 我觉得一个原因是因为行业/岗位需求高&#xff0c;还有就是拿证后能不能用得上&#xff0c;看人看公司&#xff0c;很大一部分考证的人都是因为应聘跟投标书要求。 据我了解&#xff0c;PMP 证书目前…

八戒会修特斯拉 特斯拉如何磨合制动器

--------------------------------------------------------------------------------------------------------------------------------- -------------------------------------- 作者&#xff1a; 八戒会修特斯拉 -------------------------…

动态注意力机制新突破!11个最新idea,看了就能发顶会!

在处理复杂数据时&#xff0c;可以通过引入动态注意力机制&#xff0c;让模型根据输入数据的特点动态调整关注点&#xff0c;聚焦最关键的信息&#xff0c;来提高模型的处理能力和效率。 这种比传统方法更高效、灵活的技术足以应对各种复杂任务和挑战&#xff0c;具有强大的适…

C语言程序设计22

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题2.10 先后输出B、O、Y三个字符 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //例题2.10 先后输出B、O、Y三个字符#include <stdio.h> int main() {char a B;char …

E22.【C语言】练习:“详解函数递归”文中青蛙跳台阶的答案

点击查看原文 代码实现 jump(n)jump(n-1)jump(n-2) #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int jump(int n) {if (1 n){return 1;}else if (2 n){return 2;}else{return jump(n - 1) jump(n - 2);} }int main() {int n 0;printf("请输入台阶总数…

MIGO 常用移动类型

MIGO的移动类型&#xff1a; 101&#xff1a;可以指采购订单收货和生产订单收货&#xff0c;在MB51中可以通过移动标识来进行区分。B指采购订单。F指生产订单。 122&#xff1a;采购订单退货。通过A02 物料凭证进行退货后&#xff0c;系统自动带出122的移动类型。 161&#xf…

华清IOday5 24-8-1

1、使用两个线程完成两个文件的拷贝&#xff0c;分支线程1拷贝前一半&#xff0c;分支线程2拷贝后一半&#xff0c;主线程回收两个分支线程的资源 #include <myhead.h> //文件信息结构体创建 struct File {const char *file1;//文件1地址const char *file2;//文件2地址i…

中文网址导航模版HaoWa1.3.1/模版网站wordpress导航主题

HaoWa v1.3.1由挖主题开发的一款网址导航类主题。 HaoWA主题除主体导航列表外&#xff0c;对主题所需的小模块都进行了开放式的HTML编辑器形式的功能配置&#xff0c;同时预留出默认的代码结构&#xff0c;方便大家在现有的代码结构上进行功能调整。 同时加入了字体图标Font …