Day36-【13003】短文,数组的行主序方式,矩阵的压缩存储,对称、三角、稀疏矩阵和三元组线性表,广义表求长度、深度、表头、表尾等

server/2025/2/9 7:36:44/

文章目录

  • 本次课程内容
  • 第四章 数组、广义表和串
    • 第一节 数组及广义表
      • 数组的基本操作
      • 数组的顺序存储方式-借用矩阵行列式概念
        • 二维数组C语言对应的函数-通常行主序方式
      • 矩阵的压缩存储
        • 对称矩阵和三角矩阵
        • 压缩存储后,采用不同的映射函数
        • 稀疏矩阵-可以构成三元组线性表
          • 三元组在C语言中的实现
          • 三元组表的转置
            • 三元组转置的算法实现
      • 数组的应用-解决迷宫问题
      • 广义表
        • 广义表示例
        • 广义表操作示例

本次课程内容

在这里插入图片描述

第四章 数组、广义表和串

在这里插入图片描述

第一节 数组及广义表

在这里插入图片描述

数组的基本操作

数组是高级程序设计语言中的重要语法成分,很多语言都定义了数组类型。例如,在C语言中,定义了一维数组。数组元素还可以是数组,由此得到数组的数组,

即多维数组。

一般将n(n>2)维数组看作n-1维数组的数组。

从数据结构的角度来理解,一维数组可以作为线性表的存储结构,数组中保存的各元素可以组成一个线性表。多维数组在系统内部都对应一个隐含的一维数组,所

以多维数组也是一种线性表。例如,二维数组就是以一维数组为元素的线性表。

数组的每个元素都是形如(index,value)的二元对,index是数组下标,也称为索引,value是对应于该下标的数值。任何两个元素的index值都不相同。

从数组的操作可知,它没有一般线性表常用的插入和删除操作,更多的是根据下标index访问元素。

数组的顺序存储方式-借用矩阵行列式概念

一维数组天然地采用顺序存储方式,

多维数组的顺序存储又是什么样的呢?

数组的顺序存储有两种形式。以二维数组为例,它的元素可以按行排列,也可以按列排列。

这里的“行”和“列”借用数学上矩阵或行列式中的概念。

所谓按行排列,就是先排数组的第一行,紧随其后排第二行,依此类推。

所谓按列排列,就是先排数组的第一列,紧随其后排第二列,依此类推。

最终都是将数组中的全部元素排列成一个序列。

在C语言中,可以定义多维数组,它的下标采取如下的形式表示:

在这里插入图片描述

二维数组C语言对应的函数-通常行主序方式

在这里插入图片描述

通常int类型占4字节,数组D2Array中含有18个元素,共占用18x4=72字节。如果保存的起始地址是1000,则数组将占用从1000到1071的内存空间。注意,这里

提到的字节编号并不是内存中真实的编号。将图4-1所示的下标表格按行自上而下、同一行中自左至右的次序进行连续编号,从0开始,

即可得到图4-2a所示的编号结果,

这种按行优先把二维数组中的下标映射到0~n-1之间的某个整数的方式称为按行优先方式,也称为行主序方式

包括C语言在内的大多数程序设计语言均采用行主序的实现模式。

也有一些程序设计语言采用另一种实现模式,称为按列优先方式,也称为列主序方式。

在列主序方式中,按列优先,对于下标表格,从第一列开始,从上到下进行连续编号,直到最后一列。这个结果如图4-2b所示。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

矩阵的压缩存储

数学中的矩阵可以使用二维数组保存。对于n行m列的矩阵,数组元素至少需要分配n x m个。

有些矩阵因其特殊性,可以不必保存其中的所有元素,因而可以减少为数组分配的空间

对称矩阵和三角矩阵

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

如果不考虑矩阵的特殊性,按照一般二维数组的顺序存储方式来存储特殊矩阵,也是完全可行的。

但是,从节省存储空间的角度考虑,对称矩阵和上(下)三角矩阵都可以只保存矩阵中约一半的元素,从而可以节省差不多一半的存储空间。

这样的存储形式称为压缩存储。

  • 具体来说,对干对称矩阵,因为对角线以上及以下的元素对称相等,所以只需要保存其中的一半及对角线上的元素

  • 对于上三角矩阵或下三角矩阵,仅保存上三角部分或下三角部分的元素,另外一半的0元素不再保存。

矩阵有n行n列,则这三种形式下需要保存的元素个数为nx(n+1)/2。

在采用压缩存储以后,需要寻找与普通二维数组不同的映射函数。

压缩存储后,采用不同的映射函数

在这里插入图片描述

在这里插入图片描述

稀疏矩阵-可以构成三元组线性表

在实际的应用中,矩阵中可能会出现大量的0元素,而非0元素数量很少,这就是所谓的稀疏矩阵。至于非0元素少到什么程度才能称为稀疏矩阵,并没有很严格的定义。通常认为,矩阵中非0元素的个数与矩阵的阶数相当,即可将其看作稀疏矩阵

  • 如何理解?

为了节省空间,一般只存储稀疏矩阵中的非0元素。但在稀疏矩阵中,非0元素的出现是没有规律的,

所以在存储非0元素时必须将它所在的行号和列号一起存储起来。这些信息组成一个三元组(i,j,v)的形式

其中v表示非0元素的值,i表示v所在的行号,i表示v所在的列号。

一个稀疏矩阵的所有元素用一个三元组表来表示,也就是可以构成一个三元组的线性表

在这里插入图片描述

为了方便后续其他操作的实现,三元组表应该是一个有序序列,通常按行主序的次序排列,即先按行的大小排列,同一行的三元组再按列的大小排列。

三元组表的初始值从键盘输入,输入时,各三元组可以按行主序排列,也可以按任意的次序排列,但最终都应该按行主序的次序插入到一维数组的合适位置。

当然,在有特殊需求的应用中,也可以按列主序方式保存。

三元组在C语言中的实现

在这里插入图片描述

在这里插入图片描述

三元组表的转置

转置是矩阵中常用的一种操作。下面实现采用三元组表表示的稀疏矩阵的转置算法。矩阵转置即行、列互换,i行的元素放置到i列,这也意味着,j列的元素放置在j行。如果矩阵是nxm则转置后得到的矩阵是mxn的。
很容易想到,将三元组表中的每个三元组项的i与i互换,即可得到转置后矩阵的三元组表。但是,这样转换后得到的三元组表不再按行主序排列,不便于后续操作的实现。所以,要实现矩阵转置程序,必须先得到一个按行主序排列的三元组表。

可以像readSparseMatrix函数那样处理,读入原矩阵的一个三元组,插入到目标矩阵的三元组表中。在插入过程中,需要调整部分三元组在三元组表中的次序,也就是需要进行元素的移动。从顺序表实现的时间复杂度分析中知道,这样的移动会导致转置操作的效率很低。
可以使用一个临时计数数组,记录原矩阵的每个三元组在目标矩阵的三元组表中的插入位置,以辅助完成转置操作,由此避免了三元组的移动,可高效率地实现转置操作。
不失一般性,设原矩阵A的行数是rows,列数是cols,则转置后矩阵B的行数是cols,列数是rows。元组的个数没有改变。

在这里插入图片描述

三元组转置的算法实现

在这里插入图片描述

数组的应用-解决迷宫问题

多维数组,特别是二维数组,在计算机科学中有广泛的应用。

下面以一个有趣的“迷宫”问题为例,介绍数组的应用。

“老鼠走迷宫”是实验心理学中的一个经典问题,也是一种智力游戏。

在计算机模拟实现中,可以用-个较大的二维数组表示迷宫,其中元素0表示走得通,元素1表示走不通(受阻),行走路径只考虑水平和垂直方向上的4个方向(上、下、左、右)。图4-9是一个迷宫示意图。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

  • 适合解决复杂迷宫问题,简单的用算法不至于

广义表

广义表是线性表的推广,也称为列表

它是由n(n≥0)个表元素组成的有限序列,记为:
在这里插入图片描述

在这里插入图片描述

广义表示例

在这里插入图片描述

广义表操作示例

在这里插入图片描述


http://www.ppmy.cn/server/166154.html

相关文章

如何清理浏览器一段时间以前的缓存

浏览器缓存是浏览器为了提高网页加载速度而自动存储的数据,包括图片、脚本、样式表等文件。然而,随着时间的推移,这些缓存数据可能会占用大量磁盘空间,甚至影响浏览器的性能和稳定性。因此,定期清理浏览器缓存是一个良…

kafka服务端之分区管理

文章目录 概述优先副本选举为何要有优先副本优先副本选举弊端如何开启优先副本选举如何开启部分优先副本选举如何正确使用优先副本选举 分区重分配为何需要分区重分配分区重分配工作原理分区重分配弊端及其如何正确使用 复制限流为何需要复制限流如何进行复制限流 修改副本因子…

京准:NTP卫星时钟服务器对于DeepSeek安全的重要性

京准:NTP卫星时钟服务器对于DeepSeek安全的重要性 京准:NTP卫星时钟服务器对于DeepSeek安全的重要性 在网络安全领域,分布式拒绝服务(DDoS)攻击一直是企业和网络服务商面临的重大威胁之一。随着攻击技术的不断演化…

20240206 adb 连不上手机解决办法

Step 1: lsusb 确认电脑 usb 端口能识别设备 lsusb不知道设备有没有连上,就插拔一下,对比观察多了/少了哪个设备。 Step 2: 重启 adb server sudo adb kill-serversudo adb start-serveradb devices基本上就可以了~ Reference https://b…

OpenFeign远程调用返回的是List<T>类型的数据

在使用 OpenFeign 进行远程调用时,如果接口返回的是 List 类型的数据,可以通过以下方式处理: 直接定义返回类型为List Feign 默认支持 JSON 序列化/反序列化,如果服务端返回的是 List的JSON格式数据,可以直接在 Feig…

move_base全局路径规划震荡之参数调优

在使用 move_base 进行导航时,如果全局路径规划在遇到障碍物时频繁在障碍物左右两侧跳变,导致机器人绕障失败,通常可以通过调整参数优化来解决。以下是具体原因分析和解决方案: 问题原因分析: 全局路径规划的震荡&…

Redis存储⑤Redis五大数据类型之 List 和 Set。

目录 1. List 列表 1.1 List 列表常见命令 1.2 阻塞版本命令 1.3 List命令总结和内部编码 1.4 List典型使用场景 1.4.1 消息队列 1.4.2 分频道的消息队列 1.4.3 微博 Timeline 2. Set 集合 2.1 Set 集合常见命令 2.2 Set 集合间命令 2.3 Set命令小结和内部编码 2.…

3.攻防世界 weak_auth

题目描述提示 是一个登录界面,需要密码登录 进入题目页面如下 弱口令密码爆破 用1 or 1 #试试 提示用admin登录 则尝试 用户名admin密码:123456 直接得到flag 常用弱口令密码(可复制) 用户名 admin admin-- admin or -- admin…