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

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.mfbz.cn/a/116123.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA 实现PDF转图片(spire.pdf.free版)

1.引入jar包 导入方法1: 手动引入。将Free Spire.PDF for Java下载到本地,解压,找到lib文件夹下的Spire.PDF.jar文件。在IDEA中打开如下界面,将本地路径中的jar文件引入Java程序: 导入方法2:如果您想通过…

uinapp微信小程序隐私政策授权

&#x1f680; 隐私弹窗效果图&#xff1a; 1、启用隐私相关功能在manifest.json文件中配置 usePrivacyCheck: true "mp-weixin" : {"__usePrivacyCheck__" : true, },2、创建组件 <template><view><!-- 隐私政策弹窗 --><uni-popu…

高德地图撒点组件

一、引入amap地图库 - public/index.html <script type"text/javascript">window._AMapSecurityConfig {securityJsCode: 地图密钥 }</script><scripttype"text/javascript"src"https://webapi.amap.com/maps?v1.4.8&key111111…

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测&…

基于单片机的自动感应门设计

博主主页&#xff1a;单片机辅导设计 博主简介&#xff1a;专注单片机技术领域和毕业设计项目。 主要内容&#xff1a;毕业设计、简历模板、学习资料、技术咨询。 文章目录 主要介绍一、自动感应门设计的功能概述二、系统总体方案2.1系统的总体计划2.2元器件的介绍2.2.1单片机的…

【程序员日记】一行console.log引发的血案

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ 艰难的排查过程1. 程序闪退2. 确定为内存泄漏3. 误入歧途4. 二分法注释代码5. 猿脑猜想 2️⃣ 排查procexp.exePerformance 和 Memory 3️⃣ 剔除生产环境中的console.logwebpack插件terser-webpack-plugin &#x1f6ec; 文章…

VX-3R APRS发射试验

VX-3R本身是不带APRS功能的&#xff0c;不过可能通过外加TNC实现APRS功能。 有大佬已经用Arduino实现了相应的发射功能&#xff1a; https://github.com/handiko/Arduino-APRS 我要做的&#xff0c;就是简单修改一下代码&#xff0c;做一个转接板。 YEASU官方没有给出VX-3R的音…

ch0_OSI 七层网络协议介绍

目录 概述 1、三网融合的概念 三网&#xff1a;电信网络、有线电视网络、计算机网络 概念&#xff1a;把上述三种网络融合成一种网络 2、计算机网络的定义、分类 定义&#xff1a;计算机网络是将地理位置不同的独立计算机系统&#xff0c;通过传输介质链接起来&#xff0c…

7-4 修理牧场 分数 15

#include<iostream> #include<queue> using namespace std; #define maxn 10005int main() {int n 0, data 0;cin >> n;//建小堆: //上调建堆中用greater: 父大子小 父子交换 小的上去 大的下去 priority_queue<int, vector<int>, greater<int…

vue+asp.net Web api前后端分离项目发布部署

一、前后端项目介绍 1.前端项目是使用vue脚手架进行创建的。 脚手架版本&#xff1a;vue/cli 5.0.8 编译器版本&#xff1a;vs code 1.82.2 2.后端是一个asp.net Core Web API 项目 后端框架版本&#xff1a;.NET 6.0 编译器版本&#xff1a;vs 2022 二、发布部署步骤 第…

静态链表的定义与实现(数据结构与算法)

1. 静态链表 用数组的方式实现的链表 单链表&#xff1a; 各个结点在内存中星罗棋布、散落天涯 静态链表&#xff1a;分配一整片连续的内存空间&#xff0c; 各个结点集中安置。 1.1 静态链表的优点 不需要像动态链表那样频繁地进行内存分配和释放&#xff0c;可以节省内存…

缺陷之灵魂操作bug

一、前言 正常来说&#xff0c;我们在测试缺陷的时候都是按照case来测试的&#xff0c;但是有些场景&#xff0c;例如说发散思维这种场景&#xff0c;就会找到一些比较不太正常、不好复现的缺陷&#xff0c;然后如果要辅助研发修复&#xff0c;就会极为痛苦。 二、场景描述 大…

mysql迁移data目录(Linux-Centos)

随着时间的推移&#xff0c;mysql的数据量越越大&#xff0c;使用yum默认安装的目录为系统盘 /var/lib/mysql&#xff0c;现重新挂载了一个硬盘&#xff0c;需要做数据目录的迁移到 /mnt/data/。以解决占用系统盘过高情况。 1.强烈建议这种操作。镜像一个一样的Centos系统&…

掌控你的Mac性能:System Dashboard Pro,一款专业的系统监视器

作为Mac用户&#xff0c;你是否曾经想要更好地了解你的电脑性能&#xff0c;以便优化其运行&#xff1f;是否想要实时监控系统状态&#xff0c;以便及时发现并解决问题&#xff1f;如果你有这样的需求&#xff0c;那么System Dashboard Pro就是你的不二之选。 System Dashboar…

sitespeedio.io 前端页面监控安装部署接入influxdb 到grafana

1.docker部署influxdb,部署1.8一下&#xff0c;不然语法有变化后面用不了grafana模板 docker run -d -p 8086:8086 --name influxdb -v $PWD/influxdb-data:/var/lib/influxdb influxdb:1.7.11-alpine docker exec -it influxdb_id bash #influx create user admin with pass…

JavaScript从入门到精通系列第二十九篇:正则表达式初体验

大神链接&#xff1a;作者有幸结识技术大神孙哥为好友&#xff0c;获益匪浅。现在把孙哥视频分享给大家。 孙哥链接&#xff1a;孙哥个人主页 作者简介&#xff1a;一个颜值99分&#xff0c;只比孙哥差一点的程序员 本专栏简介&#xff1a;话不多说&#xff0c;让我们一起干翻J…

modesim verilog仿真验证基本流程(新建工程方式)

文章目录 环境搭建一、在modelsim里创建一个新的工程二、新建verilog设计文件及仿真激励文件三、仿真结果本文演示如何使用modelsim新建工程进行功能仿真。 环境搭建 本文中采用的modelsim版本如下: modelsim altera 10.3d一、在modelsim里创建一个新的工程 打开modelsim软…

基于java+springboot+vue在线选课系统

项目介绍 本系统结合计算机系统的结构、概念、模型、原理、方法&#xff0c;在计算机各种优势的情况下&#xff0c;采用JAVA语言&#xff0c;结合SpringBoot框架与Vue框架以及MYSQL数据库设计并实现的。员工管理系统主要包括个人中心、课程管理、专业管理、院系信息管理、学生…

学习经验分享【NO.18】YOLOv5可视化特征图教程(持续更新)

YOLOv5项目的6.0以上版本中的detect.pt中集成了可视化相关模块&#xff0c;直接调用即可。 一、可视化特征提取网络中所有模块的可视化图 添加形参如下所示&#xff0c;加载相应的权值文件后&#xff0c;选择相应的图片。 运行detect.py文件后得到如下所示&#xff1a; 以stag…

stm32 DMA

目录 简介 框图 DMA请求 DMA通道 DMA优先级 DMA 数据 外设到存储器 存储器到外设 存储器到存储器 传多少&#xff0c;单位是什么 传输完成 hal库代码 标准库代码 简介 CPU根据代码内容执行指令&#xff0c;这些众多指令中&#xff0c;有的用于计算、有的用于控制程…
最新文章