【数据结构】4.4 数组

news2024/11/28 14:46:56

4.4.1 数组的定义

数组

  • 按照一定格式排列起来的,具有相同类型的数据元素的集合。

一维数组

  • 若线性表中的数据元素为非结构的简单元素,则称为一维数组。
  • 逻辑结构线性结构,固定长度的线性表。
  • 声明格式:数据类型 变量名 [数组长度],如:int A [20],学过C的都知道,就不多赘述了。

二维数组

  • 若一维数组中的数据元素又是一维数组结构,则称为二维数组。

  • 逻辑结构

    • 非线性结构:每一个数据元素既在一个行表中,又在一个列表中。
    • 线性结构:该线性表的每个数据元素也是一个固定长度的线性表。

    在这里插入图片描述
    除了4个角落的元素之外,每个元素都有不止一个前趋和后继,比如说这里的 a11,在它所在的这一行有前趋 a10 和后继 a12,在它所在的这一列里,又有 a01 这个前趋和 。。。这个后继(好吧图里没有,不过也没差)。

  • 声明格式:数据类型 变量名[行数][列数],如 int A [3][4],这样就定义了一个名为A的数组内每个元素都是 int 类型的三行四列的二维数组出来了。

数组特点

  • 结构固定,定以后,维数和维界不再改变。

数组基本操作

  • 除了结构的初始化和销毁之外,只有取元素合修改元素值的操作。
  • 不会说有什么插入或者删除数组中的某个元素的操作。

n维数组的抽象数据类型

  • n 为数组的维数(1维数组、二维数组…)。
  • bi 为数组第 i 维的长度。
  • ji 为数组元素第 i 维的下标。

在这里插入图片描述

4.4.2 数组的顺序存储

数组特点

  • 结构固定,固定以后,维数和维界不再改变,所以比较适合采用顺序存储结构。

数组基本操作

  • 除了结构的初始化和销毁之外,只有取元素合修改元素值的操作。
  • 不会说有什么插入或者删除数组中的某个元素的操作。

注意:

  • 数组可以是多维的,但存储数据元素的内存单元地址是一维的,因此,在存储数据结构之前,需要解决将多维关系映射到一维关系的问题。

一维数组

例如:int a [5],每个元素占用4个字节,假设a[0]存储在2000单元的位置,a[3] 应该在 2012 的位置上,2000 + (3 - 0)*4。

在这里插入图片描述

下标为 3 的元素前面有 3 个元素,如果是下标为 i 的元素,则前面有 i 个元素,第 i 个元素的位置应该是首元素的地址+i * 每个元素的大小——>LOC(i) = a + i * L

在这里插入图片描述

二维数组

假设一个 m 行 n 列的二维数组,每一行都有 n 个元素,每列都有 m 个元素。

这样一个二维数组可以看成是由若干行组成的,也可以看成是由若干列组成的。

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

二维数组有两种存储方式:

  • 以行为主序(低下标优先)BASIC、COBOL 和 PASCAL
  • 以列为主序(高下标优先)FORTRAN

以行序为主序

  • 按照行来存储,存储完第一行之后再存储第二行,以此类推。
  • 要查找某个元素的话就要找到对应的行列位置,如:第一行一列的元素就在[0][0]的位置,第二行第二列的元素就在下标为[1][1]的位置。

在这里插入图片描述

每一行都从第一个元素开始存储直到存储到下标为 n - 1 的位置然后就换下一行存储。第一行的首元素下表[0][0],最后一行的首元素下标则是[m - 1][0]

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

以行序为主序的存储位置计算

  • 设数组开始存储位置为LOC(0,0),存储每个元素需要 L 个存储单元(字节)。
  • 数组元素 a[i][j] 的存储位置是:LOC(i,j) = LOC(0,.0) + (n * i + j) * L

以列序为主序

  • 按照列来存储,存储好一列之后再存储下一列。

在这里插入图片描述

先从第一列开始存,第一列的首元素存到最后一个元素的下标应该是 a[0][0](首行首列),a[1][0](二行一列)a[2][0])(三行一列)以此类推直到 a[m - 1][0](m行1列)。

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

4.4.3 特殊矩阵的压缩存储

矩阵

  • 一个有 m * n 个元素排成的 m 行 n 列的表。
  • 有时为了节省存储空间,可以对这类矩阵进行压缩存储

在这里插入图片描述

压缩存储

  • 为多个值相同的元素只分配一个存储空间,对零元素不分配空间。
  • 如:相片的压缩之类的。

矩阵的常规存储

  • 将矩阵描述为一个二维数组。
  • 特点
    • 可以对其元素进行随机存取。
    • 矩阵运算非常简单,存储的密度为1(不需要额外的空间存放地址,分配100个字节的空间就能存储100字节的数据)。

适合压缩存储的矩阵

  • 值相同的元素很多且呈某种规律分布;零元素多。
  • 如:对称矩阵、对角矩阵、三角矩阵、稀疏矩阵等。

什么是稀疏矩阵

  • 矩阵中非零元素的个数较少(一般小于 5%)
  • 有 95% 以上的元素是零,不需要给这些元素分配空间,一下节省 95% 的空间。

对称矩阵

沿着对角线相等的矩阵就称为对称矩阵

在这里插入图片描述

特点:

  • 在 n * n 的矩阵 a 中,满足如下性质:aij = aji (1 <= i,j <= n)。
  • 比如说上图中 a[4][1] = a[1][4]

存储方式

  • 因为元素是按照对角线来存储的,另一半是一样的元素,不需要全部存,只存储下(或者上)三角(包括主对角线)的数据元素。

在这里插入图片描述

  • 共占用 n(n + 1) / 2项数 *(首项 + 末项)/ 2个元素空间。

对称矩阵的存储结构

在这里插入图片描述

  • 对称矩阵上下三角中的元素数均为:n(n + 1) / 2
  • 可以以行序为主序将元素存放在一个一维数组 sa[n(n + 1) / 2]中。

在这里插入图片描述
下标用 k 来表示,第一行放1个元素进a[0]中,第二行放两个进a[1],a[2]中,以此类推。

三角矩阵

以主对角线划分,三角矩阵有上三角矩阵和下三角矩阵两种。上三角矩阵是指矩阵下三角(不包含对角线)中的元素均为常数 C (所有值相等) 或零的 n 阶矩阵,下三角矩阵与之相反。对三角矩阵进行压缩存储时,除了和对称矩阵一样,只存储上(下)三角中的元素之外,再加一个存储常数 C 的空间即可。

特点

  • 对角线以下(或以上)的数据元素(不包括对角线)全部为常数 C (所有值一样)。

在这里插入图片描述

存储方式

  • 重复元素 C 共享一个元素存储空间,总共占用 n(n + 1) / 2 + 1个元素空间:sa[1…n(n+1) / 2+1]。
  • 上三角矩阵 sa[k] 和矩阵元 aij 之间的对应关系为

在这里插入图片描述

  • 下三角矩阵 sa[k] 和矩阵元 aij 之间的对应关系为

在这里插入图片描述

对角矩阵(带状矩阵)

对角矩阵所有的非零元素都集中在以主对角线为中心的带状区域中,即除了主对角线上和直接在对角线上、下方若干条对角线上的元之外,所有其他的元素皆为零。

特点

  • 在 n * n 的方阵中,所有非零元素都集中在以主对角线为中心的带状区域中(只在对角线和对角线旁边有值),区域外的值全是 0 ,则称为对角矩阵
  • 常见的有三对角矩阵、五对角矩阵、七对角矩阵。
  • 如:一个 7 * 7 的三对角矩阵,只有在三条对角线的范围内有值。再加两条有值的对角线就是五对角矩阵了,依次类推。

在这里插入图片描述

存储方式

  • 为 0 的元素直接扔掉不存。
  • 用二维数组的方式去存。

在这里插入图片描述

按对角线来存储,第一条对角线是 3385,则将3385存在二维数组的第一行,第二条对角线是 20612 则存在第二行,以此类推,以主对角线为0进行上下对称。这样一个原本需要36个存储空间的矩阵现在就只需要30个了。

稀疏矩阵

什么是稀疏矩阵

  • 矩阵中非零元素的个数较少(一般小于 5%)
  • 有 95% 以上的元素是零,不需要给这些元素分配空间,一下节省 95% 的空间。

在这里插入图片描述
在这里插入图片描述
在这样有42个元素的矩阵中非零元素只有8个,如果将零也存储起来,就非常浪费空间了,存储密度只有 19.05%左右。

存储方法

  • 三元组,每个非零元素由它所在的行列和它本身的值来确定,(i,j,aij)。,比如下图的第一个元素12,它的存储就是1行二列值12确定。

在这里插入图片描述

  • 压缩存储原则:存各非零元素的值,行列位置和矩阵的行列数。
    • 三元组的不同表示方法可以决定稀疏矩阵不同的压缩存储方法。

在这里插入图片描述

第0行表示存储的这个矩阵有几行几列几个非零元素,其余每行就是按顺序存储非零元素的行列值了。

还原稀疏矩阵

试还原出下列三元组所表示的系数矩阵。

在这里插入图片描述

  • 第一行的 646 表示,原来的系数矩阵有 6行4列6个非零元素。
  • 非零值按照 i 和 j 所代表的行列位置以及将value值存放到具体位置,如:第二行的 122 表示值为2的元素出现在1行2列的位置,其余同理。
  • 其余所有位置全部补 0 。

在这里插入图片描述

三元组顺序表的优缺点

  • 优点:非零元素在表中按行执行有序存储,因此便于进行依行顺序处理的矩阵运算
  • 缺点:缺点同样是因为按行处理的,导致不能随机存取。若按行号存取某一行中的非零元,则需要从头开始进行查找。这个时候就需要用到稀疏矩阵的链式存储结构:十字链表了。

十字链表

  • 优点:能够灵活地插入因运算而产生的新的非零元素,删除因运算而产生的新的零元素,实现矩阵的各种运算。

  • 在十字链表中,矩阵的每一个非零元素用一个结点表示,该结点除了(row,col,value)以外,还要有两个域。

    • right :用于连接同一行中的下一个非零元素。
    • down:用于连结同一列中的下一个非零元素。
  • 十字链表中结点的结构示意图:

在这里插入图片描述

假设有这样一个矩阵 m

在这里插入图片描述

  • 先要存储第一个非零元素 3 ,需要知道与它同一行的下一个元素5的位置,以及同列的下一个元素2的位置。

  • 此时还需要1个结点来存储 -1,同样,因为与 -1 同行同列的已经没有非零元素了,所以 right 及 dawn 域都置空。

在这里插入图片描述

此时还需要两个分别指向每行每列的头指针数组,在这样一个十字链表中,有三行,所以就需要弄一个存储三个头指针的数组,列同理。

在这里插入图片描述

再举个栗子

在这里插入图片描述

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

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

相关文章

如何学习微服务架构?(项目学习)

哪些项目适合使用微服务架构&#xff1f;对于一般的公司来说&#xff0c;微服务的实践有着很大的技术挑战&#xff0c;所以并不是所有的公司都适合将整体架构拆分成微服务架构。一般来说&#xff0c;微服务架构更适合于未来具有一定扩展复杂度、具有大量增量用户期望的应用&…

最新综述:基于语言模型提示学习的推理

©PaperWeekly 原创 作者 | OE-Heart引言推理能力是人类智能的核心能力之一。随着预训练技术的不断发展&#xff0c;大模型辅之以提示学习&#xff08;如 Chain-of-Thought Prompting [1]&#xff09;涌现出一系列的惊人的推理能力&#xff0c;引起了学术界、工业界学者的…

动态规划——数位dp

数位dp 文章目录数位dp概述题目特征基本原理计数技巧模板例题度的数量思路代码数字游戏思路代码不要62思路代码概述 数位是指把一个数字按照个、十、百、千等等一位一位地拆开&#xff0c;关注它每一位上的数字。如果拆的是十进制数&#xff0c;那么每一位数字都是 0~9&#xf…

unity 前向渲染 渲染阴影原理

下面情况默认是 前向渲染路径&#xff0c;场景中平行光开启了阴影方式原理备注ShadowMap把相机放到光源的位置&#xff0c;那么场景中该光源的阴影区域就是那些相机看不到的位置得到的是&#xff1a;场景中距离光源最近的表面位置&#xff08;深度信息&#xff09;unity中专门的…

一个基于SpringBoot+vue的学生信息管理系统详细设计

一个基于SpringBootvue的学生信息管理系统详细设计 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

【docker08】本地镜像发布到阿里云

本地镜像发布到阿里云流程 1.流程 2.镜像的生成方法 基于当前容器创建一个新的镜像&#xff0c;新功能增强命令&#xff1a; docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]] 3.将本地镜像推送到阿里云 3.1本地镜像素材原型 3.2阿里云开发者平台 进入阿里云找到控制台进…

Word控件Spire.Doc 【Table】教程(2):如何设置Word表格列宽

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

CV中一些常见的特征点

Harris、SIFT、SURF、ORB特征点总结本篇博客介绍一些常见的特征点。Brief描述子&#xff1a;编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;编辑切换为居…

基于JavaSpringboot+Vue实现前后端分离房屋租赁系统

基于JavaSpringbootVue实现前后端分离房屋租赁系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

已解决Python pandas.read_excel读取Excel文件报错

已解决&#xff08;Python pandas.read_excel读取Excel文件报错&#xff09;io ExcelFile(io&#xff0c;storage_optionsstorage.options, engineengine) 文章目录报错代码报错原因解决方法帮忙解决报错代码 粉丝群一个小伙伴想用pandas.read_excel读取Excel文件&#xff…

Linux文件管理---磁盘上文件如何管理(inode)

文章目录磁盘与文件的关系磁盘的逻辑结构与操作系统关系真实的磁盘逻辑结构一台计算机磁盘上的文件是非常多的&#xff0c;这些文件该如何进行管理&#xff1f;我们想打开某个磁盘上的文件究竟是如何找到该文件的&#xff1f;磁盘与文件的关系 这就是磁盘的物理模型和存储结构 …

Ubuntu20.04安装Mysql5.7

目录 1、下载安装包 2、解压 3、删除测试安装包 4、开始安装Mysql 4.1、如果碰到缺少依赖处理方法&#xff0c;没有碰到忽略即可 5、配置MySQL 5.1、查看mysql状态 5.2、设置root密码 1、下载安装包 wget https://cdn.mysql.com/archives/mysql-5.7/mysql-server_5.7.3…

操作系统死锁相关知识点介绍

死锁 死锁的定义 一组进程中&#xff0c;每个进程都无限等待被该组进程中另一进程所占有的资源&#xff0c;因而永远无法得到的资源&#xff0c;这种现象称为进程死锁&#xff0c;这一组进程就称为死锁进程。 如果死锁发生&#xff0c;会浪费大量系统资源&#xff0c;甚至导致…

【CSDN周赛】第21期第二题千问万问

题目描述&#xff1a; 给定大小为n的整数序列A. 现在会有q次询问&#xff0c;询问子区间的整数数量。 思路&#xff1a; 1、考的时候没做出来&#xff0c;但是感觉不难&#xff0c;一直不懂错在哪里&#xff0c;所以比赛结束后继续修改&#xff1b; 2、以下代码没有按调用函…

QTextDocument

一、描述 此类用来储存结构化的富文本文档。 二、类型成员 1、enum QTextDocument::FindFlag&#xff1a;此枚举描述查找函数可用的选项。这些选项可以用“|”组合&#xff1a; FindBackward&#xff1a;向后搜索。FindCaseSensitive&#xff1a;不区分大小写。FindWholeWo…

用户单点登录

一、用户身份认证 1、单一服务器模式 我们使用传统的Session贺Coookie的模式&#xff0c;就可以完成单一服务器的登录&#xff0c;会话跟踪技术&#xff0c; 一般过程如下&#xff1a; 用户向服务器发送用户名和密码。 验证服务器后&#xff0c;相关数据&#xff08;如用户名…

SpringBoot自定义动态定时任务(三十五)

二八佳人体似酥&#xff0c;腰间仗剑斩愚夫。虽然不见人头落&#xff0c;暗里教君骨髓枯。 上一章简单介绍了SpringBoot整合Quartz实现动态定时任务(三十四) ,如果没有看过,请观看上一章 通过 Quartz 实现了动态定时任务&#xff0c;还需要引入 Quartz 组件&#xff0c; 能不…

腾讯前端二面高频手写面试题总结

实现LRU淘汰算法 LRU 缓存算法是一个非常经典的算法&#xff0c;在很多面试中经常问道&#xff0c;不仅仅包括前端面试 LRU 英文全称是 Least Recently Used&#xff0c;英译过来就是” 最近最少使用 “的意思。LRU 是一种常用的页面置换算法&#xff0c;选择最近最久未使用的…

降本提效 | AIRIOT设备运维管理解决方案

传统运维多是使用在本地化系统&#xff0c;以人工运维和独立系统执行运维工作&#xff0c;重点关注的是设施运行&#xff0c;存在以下几个问题&#xff1a; 1、信息孤岛&#xff1a;本地化系统的接口不同&#xff0c;功能单一独立&#xff0c;各个系统之间的数据无法对接、交互…

了解枚举。

在数学和计算机科学理论中&#xff0c;一个集的枚举是列出某些有穷序列集的所有成员的程序&#xff0c;或者是一种特定类型对象的计数。这两种类型经常&#xff08;但不总是&#xff09;重叠。 [1] 是一个被命名的整型常数的集合&#xff0c;枚举在日常生活中很常见&#xff0…