数据结构学习笔记——多维数组、矩阵与广义表

目录

  • 一、多维数组
    • (一)数组的定义
    • (二)二维数组
    • (三)多维数组的存储
    • (四)多维数组的下标的相关计算
  • 二、矩阵
    • (一)特殊矩阵和稀疏矩阵
    • (二)对称矩阵
    • (三)对角矩阵
    • (四)稀疏矩阵的压缩存储
  • 三、广义表
    • (一)广义表的定义
    • (二)广义表的表头和表尾
    • (三)广义表的深度和长度
    • (四)广义表表示二叉树

一、多维数组

(一)数组的定义

数组是由n(n≥1)个相同数据类型的数据元素组成的有限序列,在定义数组时,会为数组分配一个固定大小的内存空间,用来存储元素,数组在被定义后,其维度不可以被改变。

数组在确定其维度和维界后,元素的个数是固定的,所以不能进行插入和删除运算。数组中最常见的两种操作是查找和修改。

(二)二维数组

数组可分为一维数组和多维数组(常见的有二维数组),二维数组可以看作一维数组的一维数组。顺序表是一个一维数组,所以它是线性结构,与栈、队列、串的逻辑结构相同,而多维数组则是典型的非线性结构,也可以说它是嵌套的线性结构。

例如,一个二维数组A[3][4]在内存中实际上是一个长度为3的一维数组,每个元素是一个长度为4的一维数组,即对应三行四列,其中元素是从上到下、从左到右依次存储的,如下:

0123
0[0,0][0,1][0,2][0,3]
1[1,0][1,1][1,2][1,3]
2[2,0][2,1][2,2][2,3]

由于数组中是从下标0开始的,所以一个m行n列的二维数组中,最开始的元素是[0,0],最后的元素是[m-1,n-1],上面三行四列的二维数组A[3][4]中的最后一个元素即为[2,3]。

(三)多维数组的存储

二维数组的存储较一维数组不一样,有两种存储方式,可分为行优先存储列优先存储,前者是先按每行存储满后再继续下一行,后者相反先按每列存储满后再继续下一列。

例如,定义一个二维数组A[3][3],在连续的内存空间里,如下:
在这里插入图片描述

若按照行优先存储,以A[2][0]为例,在存储A[2][0]之前,是这样存储的:
在这里插入图片描述
而按照列优先存储,以A[1][1]为例,在存储A[1][1]之前,是这样存储的:
在这里插入图片描述

(四)多维数组的下标的相关计算

设一个二维数组A[i][j],其中行下标和列下标的范围分别为[0,a]和[0,b],若每个数组元素在内存中占用L个存储单元,且数组中第一个元素的存储位置为LOC[c1][c2],求该二维数组中任意一元素A[i][j]的存储位置?

1、按行优先存储
所求行乘列界限加1,然后加所求列确定位置
(1)先确定有多少行,加上列数,然后乘以存储单元,最后加上第一个元素的存储位置,得:LOC[i][j]=LOC[c1][c2]+[(i-c1)×(b-c2+1)+(j-c2)]×L。
(2)若在编程语言中,由于数组元素下标是从0开始的,该式子改写为:LOC[i][j]=LOC[0][0]+[i×(b+1)+j]×L。

例、二维数组A[m][n]采用行序为主方式存储,每个元素占L个存储单位。元素A[0][0]的存储地址是b,求元素A[i][j](0 ≤ i ≤ m-1,0 ≤ j ≤ n-1)的存储地址。

解析:由于二维数组中行列元素都是从0开始的,即LOC[i][j]=b+[i×(n-1+1)+j]×L=b+[i×n+j]×L。
2、按列优先存储
所求列乘行界限加1,然后加所求行确定位置
(1)先确定有多少列,加上行数,然后乘以存储单元,最后加上第一个元素的存储位置,得:LOC[i][j]=LOC[c1][c2]+[(j-c1)×(a-c2+1)+(j-c1)]×L。
(2)若在编程语言中,由于数组元素下标是从0开始的,该式子改写为: LOC[i][j]=LOC[0][0]+[j×(a+1)+i]×L。

例、设7行6列的数组a以列序为主序顺序存储,基地址为1024,每个元素占2个存储单元,架设无第0行第0列,求第4行第5列的元素的存储地址。

解析:由于第一个元素为a[1][1],所以要减去后再代入计算,即
LOC[4][5]=1024+[(5-1)×(7-1+1)+(4-1)]×2=1024+62=1086。

  • 对于一个数组An×n(方阵),其元素aij按行优先与按列优先存储时地址之差为(n-1)(i-j)。

二、矩阵

(一)特殊矩阵和稀疏矩阵

相同的元素或零元素在矩阵中的分布存在一定规律的矩阵称为特殊矩阵,反之则为稀疏矩阵。简单的来说,特殊矩阵既然特殊,说明其中有很多相同或者有零元素,且存在一定规律在矩阵中分布。

常见的特殊矩阵有对称矩阵、反对称矩阵、上/下三角矩阵、对角矩阵等等,例如对角矩阵中,只有对角线上有元素,其余元素均为零:
在这里插入图片描述

(二)对称矩阵

若一个方阵满足Ai×j=Aj×i,则称为对称矩阵。由于对称矩阵中上三角部分和下三角部分的元素对应相同,在存储对称矩阵时,为了避免空间的浪费,可以只存储上或下三角部分的元素,将其存放在一个一维数组中,该数组的大小为1+2+……+n=n(1+n)/2。

(三)对角矩阵

三对角矩阵就是一种对角矩阵,其中非零元素都集中在以主对角线为中心的三条对角线的区域中,其他区域均为零。

(四)稀疏矩阵的压缩存储

前面讲到,稀疏矩阵中非零元素的分布与特殊矩阵相反,是没有规律的。稀疏矩阵中大部分元素都为0,且与非零元素的分布一样,也是没有规律的。对矩阵压缩的目的是节省存储空间。
1、三元组表
为了压缩存储稀疏矩阵,在存储时不仅要存储矩阵中非零元素的值,同时还要存储该元素所在的行与列,从而组成一个三元组表(行、列、值),依此减少了存储空间。由于是将稀疏矩阵中的非零元素以及其对应的行、列号以三元组的形式存储在一个数组中,所以经过这种压缩存储后就无法通过数组的下标直接存取矩阵的元素,失去了随机存取的特性。另外,稀疏矩阵的三元组表也可以采用十字链表法存储。【稀疏矩阵的两种存储结构是三元组表(数组)和十字链表】

//以整型int为例,可替换其他类型
typedef struct{int i,j;	//行与列int x;		//值
}Sparsematrix;

例如,一个稀疏矩阵A,进行压缩存储:
在这里插入图片描述
对应的三元组表,如下:

i(行)j(列)x(值)
114
132
205

例如,有一个100×90的稀疏矩阵,非0元素有10个,设每个整型数占2字节,则用三元组表示矩阵时,求所需的字节数。

解析:三元组表包括行、列、值,每个整型数占2字节,所以10个非0元素占3×2×10=60字节,另外还有三元组表中行数、列数和总的非零元素个数共6个字节,一共60+6=66字节。

2、十字链表
十字链表法中,稀疏矩阵的行和列都用一个带头结点的链表表示,从而对应着五个分量:行、列、数据域、指向下方结点的指针和指向右方结点的指针,其结点的结构如下:
在这里插入图片描述

三、广义表

(一)广义表的定义

广义表是线性表的进一步推广,是由n(n≥0)个数据元素组成的有序序列。线性表中的数据元素只能是单个元素(原子),它是不可分割的,而广义表中的数据元素既可以是原子,也可以是一个广义表(包括空表和非空表),广义表通过圆括号“()”括起来,通过逗号“,”隔开表中的各个数据元素。
在这里插入图片描述

一个n维数组可以看成元素是n-1维数组的广义表,广义表的元素都是n-1维数组。另外,若广义表中的所有元素都是原子时,此时的广义表就是一个线性表。

(二)广义表的表头和表尾

广义表是可以递归的,一个广义表也可以是其自身的子表,广义表中的第一个元素称为广义表的表头,而剩余数据元素组成的表称为广义表的表尾,广义表的表头和表尾可以看作通过函数Head()和Tail()对广义表操作。任何一个非空广义表,表头可能是单个元素(原子)或广义表,但表尾只可能是广义表,其原因是广义表的取表尾Tail()是非空广义表除去表头元素后,剩余元素组成的表,所以不可能是原子。
在这里插入图片描述
例如,C=(a,b,c,d,e,f,g),该广义表的表头是(a),表尾是(b,c,d,e,f,g);
例如,D=((a,b),((c,d,e),(f,g,h))),该广义表的表头是(a,b),表尾是((c,d,e),(f,g,h))。

另外,若一个广义表为空,则为一个空表。例如,E=( ),F=(( )),广义表E是一个空表,只有非空广义表才能取表头,广义表F的表头和表尾都是()。

(三)广义表的深度和长度

  • 广义表的深度通过括号的层数求得,而长度是广义表中所含元素的个数

例如,一个空广义表G=(),括号层数为1,所以广义表的深度为1,而由于是空表,所以广义表的长度为0;
例如,一个广义表H=((a,b),(c,(d,e))),括号层数为3,所以广义表的深度为3,最高层为(c,(d,e)),逗号隔开了原子( c )和广义表( d,e ),元素个数为2,所以广义表的长度为2。
例如,一个广义表I=((),(a),(b,c,(d),((d,f)))),由于括号的最大层数为4,所以广义表的深度为4,可知广义表有三个元素,分别是()、(a)、(b,c,(d),((d,f))),元素个数为3,所以广义表的长度为3。
例如,设广义表J=(( ),( )),对广义表J,head(J)=( ),Tail(J)=(( )),括号的最大层数为2,所以广义表的深度为2,广义表有两个元素,分别是()、(),元素个数为2,所以广义表长度为2。

注:这里的Tail(J)=(( )),而不是( )。

(四)广义表表示二叉树

根据广义表中“ 数据元素既可以是原子,也可以是一个广义表(包括空表和非空表) ”这一点可以来表示二叉树,即通过(根结点,根结点的广义表)的形式来表示,其中可以嵌套。
例如,下面是一个满二叉树:
在这里插入图片描述
通过广义表表示该二叉树:
(A , ( B , ( D , E ) ) , ( C , ( F , G ) ) ) )
这个二叉树的解释如下:
根结点是A,它的左孩子是B,B的左孩子是D,B的右孩子是E。
根结点A的右孩子是C,C的左孩子是F,C的右孩子是G。

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

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

相关文章

从权限跳转看Activity的data android:scheme

在应用申请悬浮窗权限的时候,可以跳转到相应的设置界面,并且自动切换到应用的条目,高亮显示一下, android悬浮窗权限怎么申请 在Android中,要申请悬浮窗权限,需要以下步骤: 在 AndroidManifes…

hp惠普Victus Gaming Laptop 15-fa1025TX/fa1005tx原装出厂Win11系统ISO镜像

光影精灵9笔记本电脑原厂W11系统22H2恢复出厂时开箱状态一模一样 适用型号:15-fa1003TX,15-fa1005TX,15-fa1007TX,15-fa1025TX 链接:https://pan.baidu.com/s/1fBPjed1bhOS_crGIo2tP1w?pwduzvz 提取码&#xff1a…

每天一道算法题(十一)——滑动窗口最大值_困难(中等)

文章目录 1、问题2、示例3、解决方法(1)方法1——双指针 总结 1、问题 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗…

c++ 函数的申明

1 一个cpp中 两种情况 1.1 定义 使用 1.2 声明 使用 定义 2 按 定义 后 直接使用的顺序 不用 声明 函数 #include <iostream> using namespace std;int max(int a, int b) {int max a>b?a:b;return max; }int main() {int a 1;int b 2;cout << max(a, b…

解决vue中引入天地图显示不全问题,设置setTimeout即可解决!

index.html中引入天地图api <script type"text/javascript" src"https://api.tianditu.gov.cn/api?v4.0&tk你的key"></script>map.vue中初始化天地图 //初始化天地图 initTMap() {const T window.T;// 3.初始化地图对象this.tMap new…

flink1.13.6版本的应用程序(maven版)

问题 想要一个指定flink版本的java计算任务hello world最简工程。 解决 mvn archetype:generate \-DarchetypeGroupIdorg.apache.flink \-DarchetypeArtifactIdflink-quickstart-java \-DarchetypeVersion1.13.6这里直接使用官方mave模版工程&#xff0c;指…

系统架构设计:13 论基于构件的软件开发

论基于构件的软件开发 软件系统的复杂性不断增长、软件人员的频繁流动和软件行业的激烈竟争迫使软件企业提高软件质量、积累和固化知识财富,并尽可能地缩短软件产品的开发周期。 集软件复用、分布式对象计算、企业级应用开发等技术为一体的“基于构件的软件开发”应运而生,…

LeetCode 2304. 网格中的最小路径代价:DP

【LetMeFly】2304.网格中的最小路径代价&#xff1a;DP 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-path-cost-in-a-grid/ 给你一个下标从 0 开始的整数矩阵 grid &#xff0c;矩阵大小为 m x n &#xff0c;由从 0 到 m * n - 1 的不同整数组成。你可以…

【python基础(二)】列表详解

文章目录 一. 访问列表元素二. 使用列表中的各个值三. 修改、添加和删除元素1. 修改列表元素2. 在列表中添加元素3. 从列表中删除元素 四.组织列表1. sort()对列表永久排序2. sorted()对列表临时排序3. 倒着打印列表4. 确定列表的长度 列表由一系列按特定顺序排列的元素组成。可…

Django框架之Cookie和Session和CBV加装饰器的三种方法

【一】Cookie与Session Cookie和Session是用来在Web应用程序中跟踪用户会话数据的两种常用技术。 【1】Cookie和Session的发展史 【1】Cookie的发展史&#xff1a; 1994年&#xff0c;网景通信公司推出了第一个浏览器Cookie技术。Cookie是存储在用户计算机上的小型文本文件…

redis五种基本数据类型

redis存储任何类型的数据都是以key-value形式保存&#xff0c;并且所有的key都是字符串&#xff0c;所以讨论基础数据结构都是基于value的数据类型 常见的5种数据类型是&#xff1a;String、List、Set、Zset、Hash 一) 字符串(String) String是redis最基本的类型&#xff0c;v…

linux日志不循环问题诊断

有一台Linux虚拟机的messages日志文件自2023年7月下旬开始没有按周为周期重新生成新的日志&#xff0c;一直累积在同一个messages文件中&#xff0c;如下所示&#xff1a; [root logrotate.d]# ls -l /var/log|grep me -rw-r--r-- 1 root root 107170 Nov 15 1…

地图导航测试用例,你get了吗?

地图导航是我们经常使用的工具&#xff0c;能帮助我们指引前进的方向。 接下来&#xff0c;会从功能测试、UI测试、兼容测试、安全测试、网络测试、性能测试、易用性测试、文档和国际化语言测试8个方面来编写地图导航测试用例。 一 功能测试 输入起点和终点&#xff0c;验证…

python3.7升级为更高版本并迁移库

创建虚拟环境 # 在进入当前的虚拟环境【py3.7的环境】使用pip导出全部包txt文件 pip freeze > all_package.txt# 创建虚拟环境 conda create -n py39 python3.9# 激活新创建的虚拟环境 conda activate py39# 用 pip 一键文件安装 # pip install --help 查看-r命令的作用 # …

LeetCode48旋转图像

思路是沿对角线交换元素,之后沿矩阵中线交换元素 参考链接 &#x1f517;:【LeetCode 每日一题】48. 旋转图像 | 手写图解版思路 代码讲解-哔哩哔哩】 class Solution {public void rotate(int[][] matrix) {int i0,j0;if(matrixnull){return;}int n matrix.length;// int[]…

优先级队列(priority_queue)

文章目录 优先级队列的定义定义&#xff1a;接口头文件优先队列和堆的关系使用&#xff1a;排序的规则容器 仿函数应用 队列存指针问题&#xff1a; 优先级队列的定义 定义&#xff1a; 黄色部分是仿函数 接口 头文件 这里不需要包含其他的头文件只需要使用队列的头文件就可以…

mysql 与 Oracle 的区别,oracle 与 mysql分页查询的区别

文章目录 mysql 与 Oracle 的区别1、并发性2、一致性3、事务4、数据持久性5、提交方式6、逻辑备份7、热备份8、sql语句的扩展和灵活性9、复制10、性能诊断11、权限与安全12、分区表和分区索引13、管理工具 oracle 与 mysql分页查询1.Oracle分页查询中提供了一个伪列&#xff1a…

LeetCode算法题解(动态规划)|LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树

一、LeetCode343. 整数拆分 题目链接&#xff1a;343. 整数拆分 题目描述&#xff1a; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入…

​极氪,中国传统汽车品牌电动化的样板间

这篇文章早就想写了&#xff0c;因为太忙的原因就一直跳票&#xff0c;正好最近两件事的出现&#xff0c;又触发了想写这篇文章的冲动。 两件事主要是&#xff1a; 一&#xff0c;10 月份各家陆续公布了单月销量以及累计销量&#xff1b; 二&#xff0c;极氪在北京正式发布了 …

LeetCode100131. Make Three Strings Equal

文章目录 一、题目二、题解 一、题目 You are given three strings s1, s2, and s3. You have to perform the following operation on these three strings as many times as you want. In one operation you can choose one of these three strings such that its length i…