数据结构(超详细讲解!!)第二十节 数组

1.定义

1.概念

相同类型的数据元素的集合。    

记作:A=(A0,A1,…,Am-1)

二维数组可看作是每个数据元素都是相同类型的一维数组的一维数组。多维数组依此类推。

二维数组是数据元素为线性表的线性表。

A=(A0,A1,……,An-1)

其中:  Ai=(ai0,ai1,……,ai m-1)         (0≤i≤n-1)

 Am×n的二维数组

矩阵Am×n看成n个列向量的线性表

矩阵Am×n看成m个行向量的线性表

 以上我们以二维数组为例介绍了数组的结构特性,实际上数组是一组有固定个数的元素的集合。

 也就是说,一旦定义了数组的维数和每一维的上下限,数组中元素的个数就固定了。      

例如二维数组A3×4,它有3行、4列,即由12个元素组成。

由于这个性质,使得对数组的操作不像对线性表的操作那样可以在表中任意一个合法的位置插入或删除一个元素。      

对于数组的操作一般只有两类:                        

(1) 获得特定位置的元素值;                        

(2) 修改特定位置的元素值。

2.数组的逻辑结构定义

数组的逻辑结构定义:ARRAY=(D, R)

其中D是数据元素的集合,R是描述下标的关系的集合

由此,对于一维数组有:

c1 ,d1为一维数组下标的下界和上界。

二维数组:

n维数组:

逻辑特性:

3.数组的抽象类型定义:

基本操作:

基本操作:InitArray(&A,n,bound1,…,boundn)操作结果:若维数n和各维长度合法,则构造相应的数组A,并返回OK。DestroyArray(&A)操作结果:销毁数组A。Value(A,&e,index1,…,indexn)初始条件:A 是n维数组,e为元素变量,随后是n个下标值。操作结果:若各下标不越界,则e赋值为所指定的A的元素值,并返回OK。Assign(&A,e,index1,…,indexn)初始条件:A是n维数组,e为元素变量,随后是n个下标值。操作结果:若下标不越界,则将e的值赋值给所指定的A的元素,并返回OK。
}//ADT Array

2.数组的顺序表示和实现

由于数组的运算一般不包括插入和删除,因此不必考虑数据元素的移动。因而采用顺序存储方式是较为适宜的。

(1)行主次序存取,即把二维数组看成行向量组成的一维结构。

此方式下的存储映象为:行主次序

(2)列主次序存取,即把二维数组看成列向量   组成的一维结构。

此方式下的存储映象为:列主次序

假设有一个3×4×2的三维数组A ,共有24个元素,其逻辑结构如图所示。

 三维数组元素的标号由三个数字表示,即行、列、纵三个方向。

a142表示第1行,第4列,第2纵的元素。

如果对A3×4×2(下标从1开始)采用以行为主序的方法存放,即行下标变化最慢,纵下标变化最快,则顺序为:

       a111,a112,a121,a122, …,a331,a332,a341,a342       

采用以纵为主序的方法存放, 即纵下标变化最慢, 行下标变化最快, 则顺序为:    

 a111,a211,a311,a121,a221,a321,…,a132,a232,a332,a142,a242,a342  

按上述两种方式顺序存储的数组,只要知道整个数组的起始地址、维数和每维的上下界,以及每个数组元素所占用的单元数,就可以将数组元素的存储地址表示为其下标的线性函数。

因此,顺序存储的数组是一种随机存取的结构。

3.二维数组的顺序存储

以二维数组Am×n为例,假设每个元素只占一个存储单元,“以行为主”存放数组,下标从1开始,首元素a11的地址为Loc[1, 1],求任意元素aij的地址。aij是排在第i行,第j列,并且前面的第i-1行有n×(i-1)个元素,第i行第j个元素前面还有j-1个元素。

由此得到如下地址计算公式: Loc[i, j]=Loc[1, 1]+n×(i-1)+(j-1)

 根据计算公式,可以方便地求得aij的地址是Loc[i, j]。如果每个元素占size个存储单元,

则任意元素aij的地址计算公式为: Loc[i, j]=Loc[1, 1] + (n×(i-1)+j-1)×size

4.三维数组的顺序存储

 三维数组A(1..r ,  1..m ,  1..n)可以看成是r个m×n的二维数组。

  假定每个元素占一个存储单元,采用以行为主序的方法存放,即行下标r变化最慢, 纵下标n变化最快。 首元素a111的地址为Loc[1, 1, 1],求任意元素aijk的地址。        

显然,ai11的地址为Loc[i, 1, 1]=Loc[1, 1, 1]+(i-1)×m×n, 因为在该元素之前, 有i-1个m×n的二维数组。由ai11的地址和二维数组的地址计算公式,不难得到三维数组任意元素aijk的地址:    

Loc[i, j, k]=Loc[1, 1, 1]+(i-1)×m×n+(j-1)×n+(k-1) 其中1≤i≤r,1≤j≤m, 1≤k≤n。、

 如果将三维数组推广到一般情况,即:用j1、j2、j3代替数组下标i、j、k, 并且j1、j2、j3的下限为c1、c2、c3,上限分别为d1、 d2、d3,每个元素占一个存储单元,则三维数组中任意元素a(j1, j2,j3)的地址为:

Loc[j1, j2, j3]=Loc[c1, c2, c3]+l×(d2-c2+1)×(d3-c3+1)×(j1-c1) +l×(d3-c3+1)×(j2-c2)+l×(j3-c3)

其中l为每个元素所占存储单元数。

令α1=l×(d2-c2+1)×(d3-c3+1),  α2=l×(d3-c3+1), α3=1

则: Loc[j1, j2, j3]=Loc[c1, c2, c3]+α1×(j1-c1)+α2×(j2-c2)+α3(j3-c3)=Loc[c1, c2, c3]+∑αi×(ji-ci)     (1≤i≤3) 

 由公式可知Loc[j1, j2, j3]与j1, j2, j3呈线性关系。        

对于n维数组A(c1∶d1, c2∶d2,…, cn∶dn),我们只要把上式推广,就可以容易地得到n维数组中任意元素aj1j2…jn的存储地址的计算公式:

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

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

相关文章

JumpServer开源堡垒机与万里安全数据库完成兼容性认证

近日,中国领先的开源软件提供商FIT2CLOUD飞致云宣布,JumpServer开源堡垒机已经与万里安全数据库软件GreatDB完成兼容性认证。针对产品的功能、性能、兼容性方面,经过双方共同测试,万里安全数据库软件(简称:…

Anaconda安装与配置

1.打开Anaconda官网,选择对应版本,下载到对应目录即可 或者进入: Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2.双击打开.exe文件,然后点击next ; 3.点击agree 4.点击just me,然后next; 5.在Choose Install L…

【JavaEE初阶】 网络编程基础与Socket套接字

文章目录 🎋网络编程基础🚩为什么需要网络编程?🚩什么是网络编程?🚩网络编程中的基本概念📌发送端和接收端📌请求和响应📌客户端和服务端📌常见的客户端服务端…

【蓝桥杯软件赛 零基础备赛20周】第2周——常考知识点+判题

文章目录 0. 第1周答疑1. 常考知识点2. 蓝桥杯怎么判题2.1 判题系统如何判题2.2 测试数据和得分的关系2.3 自己做测试数据 3. 备赛计划4. 本周刷题 0. 第1周答疑 问题1:蓝桥杯怎么报名,什么时候报名? 答:集体报名或个人报名。大…

Redis中的List类型

目录 List类型的命令 lpush lpushx rpush lrange lpop rpop lindex linsert llen lrem ltrim lset 阻塞命令 阻塞命令的使用场景 1.针对一个非空的列表进行操作 2.针对一个空的列表进行操作 3.针对多个key进行操作. 内部编码 lisi类型的应用场景 存储(班级…

前端vue,后端springboot。如何防止未登录的用户直接浏览器输入地址访问

前端,使用Vue框架来实现前端路由拦截: 设置需要登录校验的页面: 登录成功后,去设置LocalStorage里面的IsLogin为true:

MATLAB颜色索引表---持续更新中--各个平台都可使用

MATLAB颜色索引表—持续更新中–各个平台都可使用

2023.11.2事件纪念

然而造化又常常为庸人设计,以时间的流逝,来洗涤旧迹,仅以留下淡红的血色和微漠的悲哀。 回顾这次事件,最深的感触就是什么是团队的力量! 当我们看到希望快要成功的时候,大家洋溢出兴奋开心的表情,一起的欢声笑语;但看…

ElasticSearch集群环境搭建

1、准备三台服务器 这里准备三台服务器如下: IP地址主机名节点名192.168.225.65linux1node-1192.168.225.66linux2node-2192.168.225.67linux3node-3 2、准备elasticsearch安装环境 (1)编辑/etc/hosts(三台服务器都执行) vim /etc/hosts 添加如下内…

电源管理(PMIC)MAX20428ATIA/VY、MAX20428ATIC/VY、MAX20428ATIE/VY适合汽车ADAS应用的开关稳压器

一、概述 MAX20428是一款高效率、八路输出、低压PMIC。OUT1将输入电源升压至5V,电流高达500mA,而三个同步降压转换器的输入电压范围为3.0V至4.2V,输出电压范围为0.8V至3.9875V,峰值电流分别高达1.3A、1.3A和3.5A。三个300mA pMOS…

【ES专题】ElasticSearch搜索进阶

目录 前言阅读导航前置知识特别提醒笔记正文一、分词器详解1.1 基本概念1.2 分词发生的时期1.3 分词器的组成1.3.1 切词器&#xff1a;Tokenizer1.3.2 词项过滤器&#xff1a;Token Filter1.3.3 字符过滤器&#xff1a;Character Filter 1.4 倒排索引的数据结构 <font color…

论文阅读—— BiFormer(cvpr2023)

论文&#xff1a;https://arxiv.org/abs/2303.08810 github&#xff1a;GitHub - rayleizhu/BiFormer: [CVPR 2023] Official code release of our paper "BiFormer: Vision Transformer with Bi-Level Routing Attention" 一、介绍 1、要解决的问题&#xff1a;t…