数据结构基础讲解(七)——数组和广义表专项练习

本文数据结构讲解参考书目:

通过网盘分享的文件:数据结构  C语言版.pdf
链接: https://pan.baidu.com/s/159y_QTbXqpMhNCNP_Fls9g?pwd=ze8e 提取码: ze8e

数据结构基础讲解(六)——串的专项练习-CSDN博客

个人主页:樱娆π-CSDN博客​​​​​​

大佬们!!!需要互三的d我!!!!1

目录

数组的类型定义

抽象数据类型数组可形式地定义

基本操作

 数组的顺序存储

特殊矩阵的压缩存储

1.对称矩阵

2.三角矩阵

1)上三角矩阵

2) 下三角矩阵

3.对角矩阵

广 义 表

广义表的运算

广义表的存储结构

1.头尾链表的存储结构

2.扩展线性链表的存储结构

总结

广义表的举例说明

广义表的深度

 广义表的元素访问

广义表的元素插入

 广义表的元素删除

广义表的遍历


 


 * 本文中提到的aij表示下标为ij                                                             

数组的类型定义

数组是由类型相同的数据元素构成的有序集合,每个元素称为数组元素,每个元素受 n(n>=1) 个线性关系的约束,每个元素在 n 个线性关系中的序号儿 i1, …,in 称为该元素的下标,可 以通过下标访问该数据元素。因为数组中每个元素处千 n(n>=1) 个关系中,故称该数组为 n 维 数组。数组可以看成是线性表的推广,其特点是结构中的元素本身可以是具有某种结构的数据, 但属于同一数据类型.

抽象数据类型数组可形式地定义

ADT Array{

数据对象: ji=0, ···,bi-1, i=l, 2, …, n,

D = { a• 五j2"·Jn·ln(>O)称为数组的维数,坛是数组第i 维的长度,

ji 是数组元素的第j维下标,aj1j2...jn

数据关系: R = {Rl,R2, …, Rn}

基本操作:

}ADT Array

基本操作

基本操作初始条件操作结果
InitArray (&A, n, bound i, ···, boundn)/若维数n和各维长度合法, 则构造相应的数组A, 并返回OK
DestroyArray (&A)/销毁数组A
Value(A,&e, indexl , …,indexn)A是n维数组,e为元素变量,随后是n个下标值若各下标不超界,则e赋值为所指定的 A 的元素值, 并返回OK
Assign(&A,e, indexl, …,indexn)A是 n 维数组, e 为元素变扯,随后是 n 个下标值若下标不超界,则将 e 的值赋给所指定的A的元素, 并返回OK

 数组的顺序存储

由千数组一般不做插入或删除操作, 也就是说; 一旦建立了数组, 则结构中的数据元素个数 和元素之间的关系就不再发生变动。 因此, 采用顺序存储结构表示数组比较合适

假设每个数据元素占 L 个存储单元, 则二维数组 A[0.. m-1, 0 .. n-1] (即下标从 0 开始, 共有 m行n列)中任一元素 au的存储位置可由下式确定

LOC(i, j) = LOC(0, 0) + (nx i + j)L

式中, LOC(i,J)是 au的存储位置; LOC(O, 0) 是 aoo的存储位置, 即二维数组 A 的起始存储位置, 也称为基地址或基址.

注:此处没有链式存储。 

特殊矩阵的压缩存储

假若值相同的元素或者零元素在矩阵中的分布有一定规律, 则称此类矩阵为特殊矩阵

1.对称矩阵

若 n 阶矩阵A中的元满足下述性质

 则称为n阶对称矩阵

        对于对称矩阵,可以为每一对对称元分配一个存储空间,则可将忙个元压缩存储到 n(n + 1)/2 个元的空间中, 不失一般性, 可以行序为主序存储其下三角 (包括对角线)中的元。

2.三角矩阵

以主对角线划分,三角矩阵有上三角矩阵和下三角矩阵两种。上三角矩阵是指矩阵下三角(不 包括对角线)中的元均为常数c或零的n阶矩阵, 下三角矩阵与之相反。 对三角矩阵进行压缩存 储时, 除了和对称矩阵一样, 只存储其上 (下)兰角中的元素之外, 再加一个存储常数c的存储 空间即可

1)上三角矩阵

sa[k]和矩阵元 aij 之间的对应关系为

2) 下三角矩阵

sa[k]和矩阵元 aij 之间的对应关系为

3.对角矩阵

对角矩阵 所有的非零元都集中在以主对角线为中心的带状区域中,即除了主对角线上 和直接在对角线上、下方若干条对角线上的元之外,所有其他的元皆为零.

广 义 表

广义表是线性表的推广,也称为列表,广义表一般记作:

LS = (a1 , a2, · · ·, an )

其中,LS是广义表(a1, a2, …,an )的名称,n是其长度。广义表的定义中,a; 可以是单个元素,也可以是广义表,分别称为广义表 LS 的原子和子表。

  1. A = ()—A 是一个空表, 其长度为零
  2. B=(e)-B 只有一个原子 e, 其长度为1
  3. C= (a, (b, c, d))—C的长度为2, 两个元素分别为原子 a 和子表(b,c, d)
  4. D = (A, B, C)—D 的长度为3,3个元素都是广义表。显然,将子表的值代入后,则有 D = ((), (e), (a, (b, c, d)))
  5.  E = (a, E)—这是一个递归的表, 其长度为2。E 相当于一个无限的广义表 E=(a, (a, (a, ···)))
广义表的图形表示
​​​​​​

广义表的重要结论:

  1. 广义表的元素可以是子表,而子表的元素还可以是子表……由此,广义表是一个多层次 的结构,可以用图形象地表示。
  2. 广义表可为 其他广义表所共享。例如在上述例子中,广义表 A、 B 和 C 为 D 的子表, 则在 D 中可以不必列出子表的值,而是通过子表的名称来引用
  3. 广义表可以是一个递归的表,即广义表也可以是 其本身的一个子表。例如,表 E 就是一 个递归的表

广义表的运算

取表头 GetHead(LS): 取出的表头为非空广义表的第一个元素,它可以是一个单原子,也 可以是一个子表。

取表尾 GetTail(LS):取出的表尾为除去表头之外,由其余元素构成的表。即表尾一定是 一个广义表

注:广义表()和(())不同。前者为空表,长度n = 0; 后者长度n = 1, 可分解得到 其表头、 表尾均为空表()

广义表的存储结构

由于广义表中的数据元素可以有不同的结构(或是原子,或是列表),因此难以用顺序存储结 构表示,通常采用链式存储结构。常用的链式存储结构有两种,头尾链表的存储结构和扩展线性 链表的存储结构。

1.头尾链表的存储结构

由千广义表中的数据元素可能为原子或广义表,由此需要两种结构的结点:一种是表结 点, 用以表示广义表; 一种是原子结点, 用以表示原子。从上节得知:若广义表不空, 则可 分解成表头和表尾, 因此, 一对确定的表头和表尾可唯一确定广义表。 一个表结点可由3个 域组成:标志域、 指示表头 的指针域和指示表尾的指针域。而原子结点只需两个域 :标志域值域。

具体操作:

//-----广义表的头尾链表存储表示 -----typedef enum{ATOM, LIST } ElemTag; 
typedef struct GLNode 
{ 
ElemTag tag; 
union
{ 
AtomType atom; 
struct{struct GLNode*hp, *tp; }ptr; 
}; 
}*GList;
  1.  除空表的表头指针为空外, 对任何非空广义表, 其表头指针均指向一个表结点, 且该结点中的 hp 域指示广义表表头(或为原子结点 , 或为表结点), tp 域指向广义表表尾(除非表尾为 空, 则指针为空, 否则必为表结点)
  2. 容易分清列表中原子和子表所在层次。 如在广义表 D 中, 原子 a 和 e 在同一层次上, 而 b 、 c 和 d 在同一层次且比 a 和 e 低一层, B 和 C 是同一层的子表
  3. 最高层的表结点个数即为广义表的长度

2.扩展线性链表的存储结构

这种结构中, 无论是原子结点还是表结点均由三个域组成

总结

(1)串是内容受限的线性表,它限定了表中的元素为字符。串有两种基本存储结构:顺序存 储和链式存储,但多采用顺序存储结构。串的常用算法是模式匹配算法,主要有BF算法和KMP 算法。BF算法实现简单 ,但存在回溯,效率低,时1 、 郎 司复杂度为O(m x n)0 KMP算法对BF算法 进行改进,消除回溯,提高了效率,时间复杂度为O(m + n)。

(2)多维数组可以看成是线性表的推广,其特点是结构中的元素本身可以是具有某种结 构的数据,但属千同一数据类型。 一个n维数组实质上是n个线性表的组合, 其每一维都 是一个线性表。数组一般采用顺序存储结构,故存储多维数组时,应先将 其确定转换为 一 维结构,有按 “行 “ 转换和按 “列 “ 转换两种。科学与工程计算中的矩阵通常用二维数组 来表示,为了节省存储空间,对于几种常见形式的特殊矩阵,比如对称矩阵、 三 角矩阵和 对角矩阵,在存储时可进行压缩存储,即为 多个值相同的元只分配一个存储空间,对零元 不分配空间。

(3)广义表是另外一种线性表的推广形式,表中的元素可以是 称为原子的单个元素,也 可以是一个子表,所以线性表可以看成广义表的特例。广义表的结构相当灵活,在某种前提 下 ,它可以兼容线性表、数组、树和有向图等各种常用的数据结构。广义表的常用操作有取 表头和取表尾。广义表通常采用链式存储结构:头尾链表的存储结构和扩展线性链表的存储 结构。

广义表的举例说明

串和数组大家应该都很清楚,但广义表应该是比较对新手而言比较陌生,那么我将用代码加深大家的印象。

广义表是一种递归的数据结构,它可以表示线性表、树形结构甚至图结构。它允许元素是原子或其他广义表,因此可以用来表示复杂的数据结构。

广义表的深度

给定一个广义表 L = (a, (b, c), d),请计算该广义表的深度

广义表的深度是指从根节点到最深节点的路径长度。

def depth(L):  if isinstance(L, list):  max_depth = 0  for sublist in L:  max_depth = max(max_depth, depth(sublist))  return max_depth + 1  else:  return 0  L = ['a', ['b', 'c'], 'd']  
print(f"广义表 L 的深度为:{depth(L)}")  # 输出:广义表 L 的深度为:2

 广义表的元素访问

给定一个广义表 L = (a, (b, c), d),请访问该广义表的第 2 个元素

L = ['a', ['b', 'c'], 'd']  
print(f"广义表 L 的第 2 个元素为:{L[1]}")  # 输出:广义表 L 的第 2 个元素为:['b', 'c']

广义表的元素插入

给定一个广义表 L = (a, (b, c), d),请在该广义表的第 2 个元素的开头插入元素 'e'

L = ['a', ['b', 'c'], 'd']  
L[1].insert(0, 'e')  
print(f"插入元素 'e' 后,广义表 L 为:{L}")  # 输出:插入元素 'e' 后,广义表 L 为:['a', ['e', 'b', 'c'], 'd']

 广义表的元素删除

给定一个广义表 L = (a, (b, c), d),请删除该广义表的第 2 个元素的第 2 个元素

L = ['a', ['b', 'c'], 'd']  
del L[1][1]  
print(f"删除元素后,广义表 L 为:{L}")  # 输出:删除元素后,广义表 L 为:['a', ['b'], 'd']

广义表的遍历

给定一个广义表 L = (a, (b, c), d),请遍历该广义表的所有元素

def traverse(L):  for element in L:  if isinstance(element, list):  traverse(element)  else:  print(element)  L = ['a', ['b', 'c'], 'd']  
traverse(L)  # 输出:a b c d

————由于博主还是大三的在读生,时间有限,每天会不定时更新一些学习经验和一些32的项目,如果喜欢就点点关注吧,大佬们!!!!———— 

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

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

相关文章

教你用 Python 自制简单版《我的世界》

《我的世界 Minecraft》大家应该都听说过,但你有没有想过自己写一个这样的游戏呢?太难、太复杂了?也许吧,但是不试一试你怎么知道能不能成呢? 国外有位叫fogleman的开发者就用Python做了这样的一件事——自制《我的世…

【Qt网络】—— Qt网络编程

目录 (一)UDP Socket 1.1 核心API概览 1.2 代码示例 1.2.1 回显服务器 1.2.2 回显客户端 (二)TCP Socket 2.1 核心API概览 2.2 代码示例 2.2.1 回显服务器 2.2.2 回显客户端 (三)HTTP Client 3…

虚拟现实智能家居实训系统实训解决方案

随着科技的飞速发展,智能家居已成为现代生活的重要组成部分,它不仅极大地提升了居住的便捷性与舒适度,还推动了物联网、大数据、人工智能等前沿技术的融合应用。为了满足市场对智能家居专业人才日益增长的需求,虚拟现实智能家居实…

Mongodb 4.2.25 安装教程

一、上传部署包 1.1上传mongodb包进入/usr/local目录,将mongodb-linux-x86_64-rhel70-4.2.25.tgz包传到该目录下。 cd /usr/local 二、安装 2.1解压 tar zxvf mongodb-linux-x86_64-rhel70-4.2.25.tgz 2.2修改名称 mv mongodb-linux-x86_64-rhel70-4.2.25/ mong…

突破最强算法模型,Transformer !!

这几天,大家对于Transformer的问题,还是不少。 今儿再和大家聊聊~ 简单来说,Transformer 是一种神经网络模型,在机器翻译、语言理解等任务中表现特别好。它的核心思想是自注意力机制(Self-Attention)&…

反序列化漏洞练习2

拿到题目&#xff0c;发现目标是获得flag.php的内容,且sis中admin和passwd等于sis2407时会输出fag的内容 根据源码编写序列化代码 <?php error_reporting(0); class sis{public $admin;public $passwd;public function __construct(){$this->admin "sis2407"…

【redis】认识redis和分布式系统

文章目录 认识 redisredis 的主要功能实现数据库实现缓存实现消息中间件 基础概念评价指标 分布式系统单机架构为什么数据多了主机就难以应对 &#xff1f;分布式系统 认识 redis redis 的主要功能 用来在内存中存储数据 定义变量不就是在内存中存储数据吗&#xff1f;为什么…

Python计算机视觉 第7章-图像搜索

Python计算机视觉 第7章-图像搜索 7.1 基于内容的图像检索 在大型图像数据库上&#xff0c;CBIR&#xff08;Content-Based Image Retrieval&#xff0c;基于内容的图像检索&#xff09;技术用于检索在视觉上具相似性的图像。这样返回的图像可以是颜色相似、纹理相似、图像中…

halcon try_catch无try不项目

#1&#xff0c;没有用过try的人&#xff0c;肯定是没有真正实战做过项目的。 #2&#xff0c;try_catch又被称为抓异常语句&#xff0c;出现异常的代码会在 exception里进行显示&#xff0c;这个exception就是一个字符串的数组。 #3&#xff0c;为什么要用&#xff0c;halcon的一…

OpenCV结构分析与形状描述符(13)拟合椭圆函数fitEllipseDirect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆&#xff0c;该椭圆拟合一组2D点。它返回一个内切于该椭圆的旋转矩形。使用了由[91]提出的直接…

将字符串序列中的每个字符串,用字符“0“扩充到x位 Series.str.zfill(x)

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 将字符串序列中的每个字符串sn 如果sn的位数不足x位 则在sn左侧补充0凑齐x位 即在sn左侧补充x-sn个0 Series.str.zfill(x) 选择题 关于以下代码输出结果的说法中正确的是? import pandas …

在国产芯片上实现YOLOv5/v8图像AI识别-【4.4】RK3588网络摄像头推理后推流到RTSP更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案&#xff0c;专栏中实现了YOLOv5/v8在国产化芯片上的使用部署&#xff0c;并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频&#xff1a;https://www.bilibili.com/video/BV1or421T74f 前言…

基于微信小程序点餐、外卖系统的设计与实现 (源码+lw+参考文档+核心代码讲解等)

基于微信小程序点餐、外卖系统的设计与实现(源码lw部署文档讲解等) 项目概述&#xff1a; 这段时间做了一个关于点餐的小程序&#xff0c;也是学习和总结的一部分&#xff0c;希望对大家有所帮助。本课题的主要目标是设计并能够实现一个基于微信小程序点餐系统。项目采用的是…

transforemr网络理解

1.transformer网络中数据的流动过程&#xff1a; 2.transformer中残差的理解&#xff1a; 残差连接&#xff08;Residual Connection&#xff09; 的核心思想就是通过将输入与经过变化的输出相加&#xff0c;来最大限度地保留原始信息。 transforemr中注意力层网络和前馈神经…

GMS地下水数值模拟及溶质(包含反应性溶质)运移模拟技术深度应用

以地下水数值模拟软件GMS操作为主要授课内容&#xff0c;在教学中强调模块化教学&#xff0c;分为前期数据收集与处理&#xff1b;三维地质结构建模&#xff1b;地下水流动模型构建&#xff1b;地下水溶质运移模型构建和反应性溶质运移构建5个模块&#xff1b;采用全流程模式将…

计算机技术专硕,三维数字地球的学习路径?

三维数字地球是一个跨学科领域&#xff0c;涉及地理信息系统&#xff08;GIS&#xff09;、计算机图形学、遥感技术、大数据处理等多个方面。作为计算机技术专硕的学生&#xff0c;可以按照以下学习路径来逐步深入&#xff1a; 1、基础理论学习&#xff1a; 地理信息系统&…

C 408—《数据结构》算法题基础篇—链表(上)

目录 Δ前言 一、链表中特定值结点的删除 0.题目&#xff1a; 1.算法设计思想&#xff1a; 2.C语言描述&#xff1a; 3.算法的时间和空间复杂度&#xff1a; 二、链表链表最小值结点的删除 0.题目 : 1.算法设计思想 : 2.C语言描述 : 3.算法的时间和空间复杂度 : 三、链…

【FPGA数字信号处理】- FIR串行滤波器

理解和掌握 FIR 串行滤波器是踏入数字信号处理领域的重要一步。 那么&#xff0c;什么是 FIR 串行滤波器&#xff1f;它是如何工作的&#xff1f;又有着怎样的神奇之处呢&#xff1f;让我们一起揭开它的神秘面纱。 一、FIR 滤波器简介 FIR 滤波器&#xff0c;全称为有限脉冲…

PointNet++改进策略 :模块改进 | x-Conv | PointCNN, 结合局部结构与全局排列提升模型性能

目录 前言PointCNN实现细节1. X X X-Conv 操作输入输出步骤 2. PointCNN 网络架构层级卷积分类与分割任务 3. 数据增强4. 效率优化 前言 这篇论文介绍了一种名为 PointCNN 的方法&#xff0c;旨在从点云&#xff08;point cloud&#xff09;数据中学习特征。传统卷积神经网络…

【前端】探索webpack3项目build速度优化, 优化个p

文章目录 背景uglifyjs-webpack-pluginwebpack3 压缩混淆js 优化踩坑。结论 背景 webpack3 babel7 uglifyjs-webpack-plugin的项目&#xff0c;build起来是什么体验。 大抵是写了两个月后&#xff0c;发现build时间从120s激增到400s。而这400秒中&#xff0c;有50多秒是Ugli…