当前位置: 首页 > news >正文

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)个表元素组成的有限序列,记为:
在这里插入图片描述

在这里插入图片描述

广义表示例

在这里插入图片描述

广义表操作示例

在这里插入图片描述

相关文章:

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

文章目录 本次课程内容第四章 数组、广义表和串第一节 数组及广义表数组的基本操作数组的顺序存储方式-借用矩阵行列式概念二维数组C语言对应的函数-通常行主序方式 矩阵的压缩存储对称矩阵和三角矩阵压缩存储后,采用不同的映射函数稀疏矩阵-可以构成三元组线性表三…...

大数据sql查询速度慢有哪些原因

1.索引问题 可能缺少索引,也有可能是索引不生效 2.连接数配置:连接数过少/连接池比较小 连接数过 3.sql本身有问题,响应比较慢,比如多表 4.数据量比较大 -这种最好采用分表设计 或分批查询 5.缓存池大小 可能是缓存问题&#xff…...

文件 I/O 和序列化

文件I/O C#提供了多种方式来读写文件,主要通过System.IO命名空间中的类来实现,下方会列一些常用的类型: StreamReader/StreamWriter:用于以字符为单位读取或写入文本文件。 BinaryReader/BinaryWriter:用于以二进制格…...

机器学习中的关键概念:通过SKlearn的MNIST实验深入理解

欢迎来到我的主页:【Echo-Nie】 本篇文章收录于专栏【机器学习】 1 sklearn相关介绍 Scikit-learn 是一个广泛使用的开源机器学习库,提供了简单而高效的数据挖掘和数据分析工具。它建立在 NumPy、SciPy 和 matplotlib 等科学计算库之上,支持…...

HELLOCTF反序列化靶场全解

level 2 <?php/* --- HelloCTF - 反序列化靶场 关卡 2 : 类值的传递 --- HINT&#xff1a;尝试将flag传递出来~# -*- coding: utf-8 -*- # Author: 探姬 # Date: 2024-07-01 20:30 # Repo: github.com/ProbiusOfficial/PHPSerialize-labs # email: adminhello-ctf.com…...

十二、Docker Compose 部署 SpringCloudAlibaba 微服务

一、部署基础服务 0、项目部署结构 项目目录结构如下: /home/zhzl_hebei/ ├── docker-compose.yml └── geochance-auth/└── Dockerfile└── geochance-auth.jar └── geochance-system/└── Dockerfile└── geochance-system.jar └── geochance-gateway/…...

VUE之插槽

1、默认插槽 <template><div class"father"></div><h3>父组件</h3><div class"content"><Category title"热门游戏列表"><ul><li v-for"g in games" :key"g.id">{{…...

4. Go结构体使用

1、结构体的简介 结构体&#xff08;Struct&#xff09;是编程语言中常见的一种复合数据类型&#xff0c;它将不同类型的数据元素&#xff08;成员&#xff09;组合成一个单一的实体。通过结构体&#xff0c;程序员可以将具有不同类型和性质的信息绑定到一个对象中&#xff0c…...

版本控制的重要性及 Git 入门

版本控制&#xff1a;软件开发的基石 在软件开发的浩瀚宇宙中&#xff0c;版本控制无疑是那颗最为闪耀的恒星&#xff0c;照亮了整个开发过程&#xff0c;成为现代软件开发不可或缺的基石。 历史追溯&#xff0c;定位问题根源 版本控制就像是一位不知疲倦的史官&#xff0c;…...

[NKU]C++安装环境 VScode

bilibili安装教程 vscode 关于C/C的环境配置全站最简单易懂&#xff01;&#xff01;大学生及初学初学C/C进&#xff01;&#xff01;&#xff01;_哔哩哔哩_bilibili 1安装vscode和插件 汉化插件 ​ 2安装插件 2.1 C/C 2.2 C/C Compile run ​ 2.3 better C Syntax ​ 查看已…...

deepseek本地部署

DeepSeek本地部署详细指南 DeepSeek作为一款开源且性能强大的大语言模型&#xff0c;提供了灵活的本地部署方案&#xff0c;让用户能够在本地环境中高效运行模型&#xff0c;同时保护数据隐私&#xff0c;这里记录自己DeepSeek本地部署流程。 主机环境 cpu:amd 7500Fgpu:406…...

网络编程day1

实例&#xff1a; struct sockaddr_in addr {0};//初始化 addr.sin_family AF_INET;//设置地址族 addr.sin_port htons(8888);//设置端口号 addr.sin_addr.s_addr inet_addr("192.168.1.1"); //设置ip地址 bind(sock,(struct sockaddr *)&addr,sizeof(ad…...

QFileDialog::getOpenFileName(this,“文件对话框“,“.“,“c++ files(*.cpp);;“); 文件对话框显示乱码

在使用 QFileDialog::getOpenFileName 时&#xff0c;如果文件对话框显示乱码&#xff0c;通常是因为编码问题。Qt 默认使用 UTF-8 编码&#xff0c;但如果你的系统或源代码文件的编码不一致&#xff0c;可能会导致乱码。 以下是几种可能的解决方法&#xff1a; 1. 确保源代码…...

绿联NAS安装cpolar内网穿透工具实现无公网IP远程访问教程

文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 本文主要介绍如何在绿联NAS中使用ssh远程连接后&#xff0c;使用一行代码快速安装cpolar内网穿透工具&#xff0c;轻松实现随时随地远程访问本地内网中的绿联NAS&#xff0c;无需公网…...

C++学习——缺省参数、重载函数、引用

目录 前言 一、缺省参数 1.1概念 1.2写法 1.3半缺省 1.4使用 二、重载函数 2.1.概念 2.2类型 2.3参数 2.4顺序 2.5问题 2.6原理 三、引用 1、引用是什么&#xff1f; 2、引用的使用方法 3、引用特性 1、引用在定义的时候必须要初始化 2、一个变量会有多个引用…...

web-JSON Web Token-CTFHub

前言 在众多的CTF平台当中&#xff0c;作者认为CTFHub对于初学者来说&#xff0c;是入门平台的不二之选。CTFHub通过自己独特的技能树模块&#xff0c;可以帮助初学者来快速入门。具体请看官方介绍&#xff1a;CTFHub。 作者更新了CTFHub系列&#xff0c;希望小伙伴们多多支持…...

langchain教程-11.RAG管道/多轮对话RAG

前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…...

Postgresql的三种备份方式_postgresql备份

这种方式可以在数据库正在使用的时候进行完整一致的备份&#xff0c;并不阻塞其它用户对数据库的访问。它会产生一个脚本文件&#xff0c;里面包含备份开始时&#xff0c;已创建的各种数据库对象的SQL语句和每个表中的数据。可以使用数据库提供的工具pg_dumpall和pg_dump来进行…...

WebAssembly:前后端开发的未来利器

引言 在互联网的世界里&#xff0c;前端和后端开发一直是两块重要的领域。而 JavaScript 长期以来是前端的霸主&#xff0c;后端则有各种语言诸如 Java、Python、Node.js、Go 等等。然而&#xff0c;近年来一个名为 WebAssembly (Wasm) 的技术正在逐渐改变这一格局。它的高性能…...

Mac下使用brew安装go 以及遇到的问题

首先按照网上找到的命令进行安装 brew install go 打开终端输入go version&#xff0c;查看安装的go版本 go version 配置环境变量 查看go的环境变量配置&#xff1a; go env 事实上安装好后的go已经可以使用了。 在home/go下新建src/hello目录&#xff0c;在该目录中新建…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...