数据结构 第五章 数组和广义表

news2024/11/17 21:49:29

还是会想你:点击收听

1 基本知识点

1、数组可以看作是下标和值的偶对的集合(具有相同类型的数据元素)

注意:数组是同类型值的集合?**错误**

2、数组的存储方式:以行为主序(一行存储完成之后继续存储下一行)、以列为主序(一列存储完成之后继续存储下一列)
3、对矩阵压缩存储是为了减少存储空间
4、稀疏矩阵的三元组存储方法:

矩阵的非零元素个数和位置在操作过程中变化不大时较为有效

5、从逻辑结构上看,n维数组的每个元素均属于n个向量

二维数组:不但参与了行向量还参与了列向量

2 以行序为主序的数组计算元素的存储位置

请添加图片描述

1 因为第一维度i是从c1到d1,那么第一维度大小为:d1-c1+1
2 因为第二维度j是从c2到d2,那么第二维度大小为:d2-c2+1
3 数组的第一个元素为A[c1][c2],数组的首地址为Loc(c1,c2)

任何一个元素aij的内存地址 = 数组首地址+在aij前面存储的元素的个数(乘以)每个数组元素占用的存储单元L

1 aij之前的行数:i-c1
2 总的列数(每一行元素的个数):d2-c2+1
3 在aij这一行的第j列之前的元素个数:j-c2
4 注意:i在c1到d1之间、j在c2到d2之间
5 如果数组的下标是从1开始,那么c1 = c2 = 1
6 如果数组的下标是从0开始,那么c1 = c2 = 0
7 假设n为每一行的元素个数(总的列数)

可得:

下标从1开始存储:Loc(aij) = Loc(a11) + ((i-1)*n+j-1)*L
下标从0开始存储:Loc(aij) = Loc(a00) + (i*n+j)*L

3 矩阵的压缩存储

1、二维数组(矩阵),行和列相等时候为方阵
2、压缩存储:对于多个值相同的元素分配一个存储空间,对于零元素不分配空间

3.1 特殊矩阵

3.1.1 对称矩阵

请添加图片描述

满足:Aij = Aji(i和j处于0到(n-1)之间)
使用压缩存储的方式可以:

1	将n平方个元素压缩到n*(n+1)/2个空间中
2 以行序为主将该矩阵的下三角(包括对角线)中的元素存储到一个向量B[n*(n+1)/2]中

解释:n*(n+1)/2怎么得来的呢?
请添加图片描述
因为只需要存储下三角的元素,那么第一行需要存储1个、第二行需要存储2个…第n行需要存储n个,最后求和可得n*(n+1)/2个存储空间

将一个二维的矩阵压缩存储到一维的数组中,其中一维数组的大小为n*(n+1)/2

因为总共有n*(n+1)/2个空间,所以说下标为0到n*(n+1)/2 - 1

请添加图片描述
一维数组和二维矩阵的对应关系:

1、i和j从0开始:
请添加图片描述
如何推导出下三角的对应公式呢?

1 因为二维矩阵的下标是从0开始的
2 当获取aij的时候,比如说a21,那么a21正处于第三行第二列
3 所以说aij处于第i+1行
4 从第一行到第i行求和可得:1+2+...+i = i*(i+1)/2个元素
5 最后还要加上aij所在这一行的前面的元素个数,刚好等于j个元素
6 所以说下三角对应一维数组的下标为: k = i*(i+1)/2+j(i和j是从0开始)+0(不要忘了数组的起始下标)

2、i和j从1开始:
请添加图片描述
如何推导出下三角的对应公式呢?

1 因为二维矩阵的下标是从1开始的
2 当获取aij的时候,比如说a21,那么a21正处于第二行第一列
3 所以说aij处于第i行
4 从第一行到第i-1行求和可得:1+2+...+i-1 = i*(i-1)/2个元素
5 最后还要加上aij所在这一行的前面的元素个数,刚好等于j-1个元素
6 所以说下三角对应一维数组的下标为: k = i*(i-1)/2+j-1(i和j是从1开始)+1(不要忘了数组的起始下标)

3.1.2 三角矩阵

请添加图片描述
那么二维矩阵和一维数组之间的对应关系是:
例如:下三角矩阵
1、i和j从0开始:
请添加图片描述

1 其中下三角部分和对称矩阵一样(i和j从0开始)
2 需要多添加一个存储空间(因为上三角部分都为0或者一个常数)
3 本来元素总数是n*(n+1)/2个,对应的一维数组的下标为0到n*(n+1)/2 - 1
4 需要再添加一个空间就是在:n*(n+1)/2这个位置上存储那个常数或者0

2、i和j从1开始:
请添加图片描述


3.1.3 对角(带状)矩阵

请添加图片描述
1、下标从1开始:
将带状矩阵压缩存储到一维数组中

已知Aij如何计算在一维数组中的对应的下标值

请添加图片描述

注意:在3(i-1)的基础上,再加上起始下标1,就可得到对角线Aij在一维数组中的对应的下标值

请添加图片描述
那么用i和j来表示k:

k1 = 3(i-1) = 2(i-1)+i-1      i = j+1
k2 = 3(i-1)+1 = 2(i-1)+i-1+1 = 2(i-1)+i   i = j
k3 = 3(i-1)+2 = 2(i-1)+i-1+2 = 2(i-1)+i+1   i = j-1
可得:**k = 2(i-1)+j**

如果用k来表示i和j呢?

floor代表向下取整
floor(x)返回的是**小于或等于x**的最大整数
1 i = floor(k/3) + 1
2 i和j具有对应关系
3 j = floor(k/3) + (k mod 3) (mod是求模运算)

三对角矩阵共有3n-2个元素

1 当n等于5的时候(5x5的三对角矩阵)
2 除了第一行和最后一行只有2个非零元素以外,其余各行都有3个非零元素
3 那么所需要的一维数组的大小为:2+2+3(n-2) = 3n-2
4 n = 5代入可得:为13个空间大小
5 压缩存储刚好需要13个空间大小

2、下标从0开始:
请添加图片描述

那么用i和j来表示k:

k1 = 3i-1 = 2i+i-1 = 2i+j      i = j+1
k2 = 3i = 2i+i = 2i+j          i = j
k3 = 3i+1 = 2i+i+1 = 2i+j   i = j-1
可得:**k = 2i+j**

如果用k来表示i和j呢?

floor代表向下取整
floor(x)返回的是**小于或等于x**的最大整数
1 i = floor((k+1)/3) 
2 i和j具有对应关系

3.2 稀疏矩阵

非零元素特别少并且分布无规律

存储结构:

1、顺序存储结构:三元组表(行号、列号、值)
2、链式存储结构:十字链表

稀疏因子:用矩阵中非零元素个数t除以矩阵的大小(mxn)<=0.05

3.2.1 基于三元组的矩阵转置

请添加图片描述

int m;//矩阵的行数
int n;//矩阵的列数
int len;//矩阵的非零元素的个数

请添加图片描述

//A为转置之前的矩阵
//B为转置以后的矩阵
B.m = A.n;
B.n = A.m;
B.len = A.len;

if(A.len)
{
	q = 1;
	//用q来作为B中元素的下标
	//从1开始不断加加
	for(j=1;j<=A.n;j++)
	{
		for(p=1;p<=A.len;p++)
		{
			if(A.data[p].col == j)
			//A中保存的元素的列数和j相等
			{
				B.data[q].row = A.data[p].col;
				B.data[q].col = A.data[p].row;
				B.data[q].e = A.data[p].e;
				q++;
			}
		}
	}
	return B;
}

3.2.2 矩阵的快速转置

请添加图片描述
请添加图片描述

两个数组的大小都和A.n大小相同

请添加图片描述

请添加图片描述

请添加图片描述

3.2.3 十字链表(链式存储形式)

请添加图片描述
请添加图片描述

非零元素在行和列的方向上都构成了单链表

4 典型题目解析

请添加图片描述

请添加图片描述

请添加图片描述


5 算法题目

1、矩阵中元素的查找
请添加图片描述
请添加图片描述

解释:
(行数相同的元素:从前到后递增)
(列数相同的元素:从上到下递增)
1 在第一行最后一个元素开始与待查找元素比较
2 如果比待查找元素小,移动到下一行的最后一个元素
3 在最后一行的最后一个元素的位置发现比待查找元素大
4 然后向前走
5 走到等于待查找元素

请添加图片描述

i = 0;
j = n-1;
flag = 0;

while(i<=(m-1)&&j>=0&&!flag)
{
	if(A[i][j] == x)//等于
		flag = 1;//找到
	else if(A[i][j]>x)//大于
		j--;//向左变小
	else//小于
		i++;//向下变大
}
if(flag)
	//查找成功
else	
	//查找失败

6 易错题目

请添加图片描述

**易错:需要加上数组的起始下标1**

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

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

相关文章

【C++修行之路】C++入门之深剖变量

&#x1f37f;本文主题&#xff1a;C语法中的变量 &#x1f388;更多内容&#xff1a;C较C的改进 &#x1f495;我的主页&#xff1a;蓝色学者 文章目录前言概念什么是变量变量名变量类型为什么要有不同数据类型各自数据类型的本质结语前言 大家好久不见&#xff0c;今天是我…

22.1.29打卡 2023牛客寒假算法基础集训营1 ACDHKLM

2023牛客寒假算法基础集训营1_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 网上高质量题解太多了, 我这就作为打卡日报随便写写 A 四个变量 a b记录两队得分 c d记录两队最多还能获得的得分 简单模拟 /* ⣿⣿⣿⣿⣿⣿⡷⣯⢿⣿⣷⣻⢯⣿⡽⣻⢿⣿⣿⣿⣿⣿⣿⣿⣿…

Ruoyi-Cloud框架学习-【02 Redis安装搭建+Ruoyi下载+Nacos数据库配置】

Redis服务端与客户端的安装与搭建 参考该博文 https://joycez.blog.csdn.net/article/details/128776284?spm1001.2014.3001.5502 安装文件 链接&#xff1a;https://pan.baidu.com/s/1v19C9Dhh-ZkNQ8l1RVGQkA 提取码&#xff1a;6mim Ruoyi-Cloud下载以及数据库配置 1、前…

MySQL主从复制的数据同步延迟(二)

1、介绍 主从复制环境在单机应用的时候没有问题&#xff0c;但是在实际的生产环境中&#xff0c;会存在 复制延迟 的问题 查看从库同步状态 在从库中执行 show slave status\G &#xff1a; mysql> show slave status\G *************************** 1. row **************…

Matlab论文插图绘制模板第73期—带等高线的光影曲面图

在之前的文章中&#xff0c;分享了Matlab曲面图的绘制模板&#xff1a; 光影曲面图&#xff1a; 带等高线的曲面图&#xff1a; 进一步&#xff0c;再来看一下带等高线的光影曲面图的绘制模板。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系…

make <board_name>_defconfigmake menuconfig

1.make <board_name>_defconfig (1)在uboot的顶层目录的Makefile中查找目标&#xff08;defconfig无法查到&#xff09;&#xff0c;检索config&#xff0c;找到目标config和目标%config 因为我们的目标为<board_name>_defconfig&#xff0c;所以需要看的是有通配…

发现了一个提取时间序列技术指标的神器

互联网上有一个最简单而又强大的技术库&#xff0c;叫做pandas_ta。这个python库为你提供了一个简化的API&#xff0c;让你从时间序列中提取技术分析指标。今天我将和大家一起学习这个库。记得点赞、收藏&#xff5e; 虽然你可能会将这些函数应用于股票价格&#xff0c;但你可…

python开发环境搭建实践

这里写自定义目录标题前言搭建过程anaconda下载与安装下载安装配置环境变量pycharm下载和安装下载安装激活总结前言 新年新气象&#xff0c;我也把电脑进行了重装系统。所以现在需要重新搭建各种开发环境&#xff0c;也不能说是各种&#xff0c;因为我只会python和Java。 先搭…

全国产交换机基本介绍(分类、性能指标、硬件构成及工作方式)

关于全国产交换机基础知识&#xff0c;您了解多少呢&#xff1f;来和海翎光电的小编一起学习一下吧&#xff01; 一、交换机的分类与性能指标 1.1 交换机的分类 按照网络构成方式来分的话&#xff0c;交换机分为三类&#xff1a;接入层交换机、汇聚层交换机和核心层交换机。按照…

93.transformer、多头注意力以及代码实现

1. Transformer架构 2. 多头注意力 3. 数学上来解释多头注意力 4. 有掩码的多头注意力 5. 基于位置的前馈网络 6. 层归一化 batch norm&#xff1a;比如说一行是一个样本&#xff0c;那么BN就是对一列进行归一化&#xff0c;就是对所有数据项的某一列特征进行归一化 layer nor…

【数据结构和算法】了解认识栈,并实现栈的相关函数

到现在我们了解并认识了线性表的概念&#xff0c;动态、静态顺序表的建立&#xff0c;以及两种链表的实现&#xff0c;接下来我们要认识一个新的内容&#xff0c;新的概念&#xff0c;栈&#xff0c;是基于顺序表或者链表的一种新型数据结构。 目录 一、栈是什么&#xff1f; …

RabbitMQ入门中篇

本篇博文目录一.Spring整合RabbitMQ1.导入依赖2.生产者3.消费者4.测试二.SpringBoot整合RabbitMQ1.导入依赖2.生产者3.消费者4.测试三.代码下载一.Spring整合RabbitMQ 在spring项目中使用RabbitMQ的Exchange模式的Topics&#xff0c;项目分为消费者spring项目和生产者spring项目…

Centos7安装kvm服务器

Centos7安装kvm服务器什么是kvm检查硬件是否支持kvm虚拟化启用嵌套虚拟化(可选)查看是否启用嵌套虚拟化嵌套虚拟化立即生效(临时)重新加载模块并验证虚拟机硬件直通虚拟机内查看嵌套虚拟化是否成功安装kvm服务器安装kvm的所有包(不推荐)启动libvirt服务查看是否正确设置了虚拟化…

Linux操作系统之线程安全

一、引入线程安全关于strtok函数不能在多线程中使用&#xff0c;为什么&#xff1f;运行结果原因如下&#xff1a;在strtok内部会有一个全局变量静态指针&#xff08;static char* ptr&#xff09;&#xff0c;一开始指针指向主线程的a&#xff0c;等到后面子线程开始分割时&am…

18 Java反射reflect(类加载+获取类对象+通用操作+设计模式+枚举+注解)

Java反射18 反射reflect18.1 类的加载18.2 Class对象18.3 获取类对象的3种方法18.4 反射通用操作18.4.1 常见方法18.4.2 通用操作18.5 设计模式18.5.1 概念18.5.2 好处18.5.3 工厂设计模式18.5.4 单例模式18.6 枚举18.7 注解18.7.1 概念18.7.2 定义注解18.7.3 注解属性类型18.7…

知名休闲服饰品牌——慕尚集团借力泛微实现统一办公、业务协同

客户简介 宁波中哲慕尚控股有限公司&#xff08;以下简称慕尚集团&#xff09;是中国知名的由新零售模式驱动的休闲时尚服饰多品牌运营公司。 旗下品牌有GXG,gxgjeans,gxg.kids,MODE COMMUTER等&#xff0c;覆盖时尚男女装、童装市场和其他时尚领域。2019年5月慕尚集团正式登…

不要在线上滥用CopyOnWriteArrayList,姿势不对性能真的很拉胯

从JDK1.5版本&#xff0c;JAVA提供了线程安全的List增强版CopyOnWriteArrayList&#xff0c;其保持线程安全的方式是&#xff1a;每次修改数据时&#xff0c;不会直接修改数据&#xff0c;而是把数据复制出来一份&#xff0c;对复制出来的数组进行操作。 通过这样的机制&#…

【图像算法】马赛克识别

【目的】 校验视频中出现马赛克的频率&#xff0c;抽象成将视频切割成图片&#xff0c;对每张代测图片进行自动化验证。 【实现】 图像边缘检测算法识别 算法步骤&#xff1a; 使用高斯滤波器&#xff0c;以平滑图像&#xff0c;滤除噪声。计算图像中每个像素点的梯度强度和…

buuctf-web-[BJDCTF2020]Easy MD51

打开环境一个简单的页面查看源代码一个get传参&#xff0c;随便输入试试看输入1,1",1,均无反应&#xff0c;每次遇到这种有输入框的都以为是sql注入&#xff0c;但是题目为md5标头里面看到提示select * from admin where passwordmd5($pass,true)搜索相关漏洞&#xff0c;…

gost 常用tunnel配置示例(隧道模式)

gost是用golang语言实现的一个安全隧道。地址位于&#xff1a;https://github.com/ginuerzh/gost是一个不可多得的隧道工具。至于什么是隧道&#xff1f; 就是可以通过这个工具传输一些其他协议的数据。就像这个样子。隧道有什么用呢&#xff1f;可以起到一些加速的作用或者流量…