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

文章目录

  • 本次课程内容
  • 第四章 数组、广义表和串
    • 第一节 数组及广义表
      • 数组的基本操作
      • 数组的顺序存储方式-借用矩阵行列式概念
        • 二维数组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)个表元素组成的有限序列,记为:
在这里插入图片描述

在这里插入图片描述

广义表示例

在这里插入图片描述

广义表操作示例

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Python人工智能] 四十九.PyTorch入门 (4)利用基础模块构建神经网络并实现分类预测

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解PyTorch构建回归神经网络。这篇文章将介绍如何利用PyTorch构建神经网络实现分类预测,其是使用基础模块构建。前面我们的Python人工智能主要以TensorFlow和Keras为主,而现在最主流的深度学习框…

Java进阶14 TCP日志枚举

Java进阶14 TCP&日志&枚举 一、网络编程TCP Java对基于TCP协议得网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。 1、TCP协议发数据 1.1 构造方法 方法 说明 Socket(InetAddress address…

Java三十天速成(java进阶篇)

Day 15 一、集合框架 1、集合框架图 2、数据结构: ①、逻辑结构; 在计算机科学中,逻辑结构是指数据元素之间的关系,它描述了数据元素之间的逻辑联系,而不是它们在计算机内存中的物理存储方式。逻辑结构可以分为以下…

专门记录台式电脑常见问题

1、蓝屏死机,检查内存硬盘和cpu 2、拆内存条,用橡皮擦金手指 3、放主板静电,扣主板电池 4、系统时间不正确,主板电池没电 5、开机键坏了 6、电脑主机的风扇转,正常通电运行,但显示器没信号。看键盘的num键&…

ubuntu22.40安装及配置静态ip解决重启后配置失效

遇到这种错误,断网安装即可! 在Ubuntu中配置静态IP地址的步骤如下。根据你使用的Ubuntu版本(如 Netplan 或传统的 ifupdown),配置方法有所不同。以下是基于 Netplan 的配置方法(适用于Ubuntu 17.10及更高版…

北大AGI与具身智能评估新范式!Tong测试:基于动态具身物理和社会互动的评估标准

作者:Yujia Peng, Jiaheng Han, Zhenliang Zhang, Lifeng Fan, Tengyu Liu, Siyuan Qi, Xue Feng, Yuxi Ma, Yizhou Wang, Song-Chun Zhu 单位:北京通用人工智能研究院国家通用人工智能重点实验室,北京大学人工智能研究所,北京大…

DeePseek结合PS!批量处理图片的方法教程

​ ​ 今天我们来聊聊如何利用deepseek和Photoshop(PS)实现图片的批量处理。 传统上,批量修改图片尺寸、分辨率等任务往往需要编写脚本或手动处理,而现在有了AI的辅助,我们可以轻松生成PS脚本,实现自动化处…

OkHttpClient请求失败处理与网页下载成功实践

在现代的网络应用开发中,数据的获取和处理是核心任务之一。无论是从第三方API获取数据,还是从网页中提取内容,网络请求都是不可或缺的环节。在Java中,OkHttp是一个非常流行且功能强大的HTTP客户端库,它提供了简洁的API…

Idea ⽆ Maven 选项

Idea ⽆ Maven 选项 1. 在 Idea 项⽬上右键2. 选中 Maven 选项 如果在创建 Spring/Spring Boot 项⽬时,Idea 右侧没有 Maven 选项,如下图所示: 此时可以使⽤以下⽅式解决。 1. 在 Idea 项⽬上右键 2. 选中 Maven 选项 选中 Maven 之后&#…

Vue3状态管理: Pinia使用技巧与最佳实践

Vue3状态管理: Pinia使用技巧与最佳实践 随着Web应用复杂度的提升,前端状态管理变得愈发重要。而在Vue3中,Pinia作为一种全新的状态管理工具,为我们提供了更加灵活和强大的状态管理解决方案。本文将从Pinia的基本概念入手,深入探讨…

从零开始实现一个双向循环链表:C语言实战

文章目录 1链表的再次介绍2为什么选择双向循环链表?3代码实现:从初始化到销毁1. 定义链表节点2. 初始化链表3. 插入和删除节点4. 链表的其他操作5. 打印链表和判断链表是否为空6. 销毁链表 4测试代码5链表种类介绍6链表与顺序表的区别7存储金字塔L0: 寄存…

AI推理性能之王-Groq公司开发的LPU芯片

Groq公司开发的LPU(Language Processing Unit,语言处理单元)芯片是一种专为加速大规模语言模型(LLM)和其他自然语言处理任务而设计的新型AI处理器。以下是对其技术特点、性能优势及市场影响的深度介绍: 技…

【玩转 Postman 接口测试与开发2_016】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(上)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十三章 契约测试与 API 接口验证1 契约测试的概念2 契约测试的工作原理3 契约测试的分类4 DeepSeek 给出的契约测试相关背景5 契约测试在 Postman 中的创建方法6 API 实例的基本用法7 API 实例的类型实…

The specified Gradle distribution ‘gradle-bin.zip‘ does not exist.

The specified Gradle distribution ‘https://services.gradle.org/distributions/gradle-bin.zip’ does not exist. distributionUrl不存在,关联不上,下载不了,那就匹配一个能下载的 distributionUrlhttps://services.gradle.org/distrib…

【Linux系统】线程:认识线程、线程与进程统一理解

一、更新认知 之前的认知 进程:一个执行起来的程序。进程 内核数据结构 代码和数据线程:执行流,执行粒度比进程要更细。是进程内部的一个执行分值 更新认识: a. 进程是承担分配系统资源的基本实体b. 线程是OS调度的基本单位 …

请求响应(接上篇)

请求 日期参数 需要在前面加上一个注解DateTimeFormat来接收传入的参数的值 Json参数 JSON参数:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用 RequestBody 标识 通过RequestBody将JSON格式的数据封装到实体类…

Linux提权--SUDO提权

​sudo​ 是 Linux 中常用的特权管理工具,允许普通用户以其他用户(通常是 root 用户)的身份运行命令。如果配置不当,攻击者可能通过滥用 sudo​ 权限来提升自己的权限。 一.常见的 sudo 提权方法: 误配置的 sudo 权限&…

【Elasticsearch】filter聚合

在Elasticsearch中,Filter聚合是一种单桶聚合,用于根据特定的查询条件筛选文档,并对筛选后的文档集合进行进一步的聚合分析。它允许用户在执行聚合操作之前,先过滤出符合某些条件的文档,从而更精确地分析数据。 Filter…

Colorful/七彩虹 隐星P15 TA 24 原厂Win11 家庭版系统 带F9 Colorful一键恢复功能

Colorful/七彩虹 隐星P15 TA 24 原厂Win11 家庭中文版系统 带F9 Colorful一键恢复功能 自动重建COLORFUL RECOVERY功能 带所有随机软件和机型专用驱动 支持机型:隐星P15 TA 24 文件下载:asusoem.cn/745.html 文件格式:ISO 系统版本&…

实时波形与频谱分析———傅立叶变换

实时波形与频谱分析:一个交互式动画演示 在信号处理领域,时域波形和频域频谱是理解信号特性的重要工具。通过时域波形,我们可以直观地观察信号随时间的变化,而频域频谱则揭示了信号中所包含的频率成分及其幅值。为了帮助大家更好…