5.1数组的定义与顺序存储

本文详细介绍了数组的定义、运算及其抽象数据类型,并深入探讨了一维、二维和多维数组的顺序存储结构,包括地址计算公式,适用于高级语言中的数组实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5.1数组的定义与顺序存储——讲义

1、数组的定义和运算

数组是我们十分熟悉的结构,高级语言一般都支持数组这种数据类型。

( 1 )数组的定义

从逻辑结构上,数组可以看成是一般线性表的扩充。
一维数组即为线性表, 而二维数组可以定义为“其数据元素为一维数组(线性表)”的线性表。依此类推, 即可得到多维数组的定义。
以二维数组为例,如下图所示。
在这里插入图片描述
可以把二维数组看成是一个线性表: A =(α1 ,α2 ,…,αn),其中αj( 1 ≤ j ≤ n)本身也是一个线性表,称为列向量,即αj=(a1j,a2j,… ,amj),如下图( a) 所示。 A 是由 n 个列向量组成的。

二维数组 Am × n可以看成是由 n 个元素组成的线性表,表中的元素αi即( a1 i a2 i… ai i am i)如下图 ( b)所示,表中的每个数据元素是由 m 个数组元素组成的线性表。
在这里插入图片描述

同样,还可以将数组 Am × n看成另外一个线性表: B=(β 1 ,β2 ,…,β m),其 中βi( 1 ≤ i≤ m)本身也是一个线性表,称为行向量,即:β i =( ai1 ,ai2 ,a ij,…, ai n),如下图所示。
在这里插入图片描述
如上图所示,在二维数组中,元素 ai j处在第 i 行和第 j 列的交叉处,即元素 aij 同时有两个线性关系约束,ai j 既是同行元素 ai j - 1 的“行后继”,又是同列元 素 ai - 1 j的“列后继”。同理三维数组可以看成是这样的一个线性表,其中每个数 据元素均是一个二维数组,即三维数组是“数据元素为二维数组”的线性表。数 组中的每个元素同时有三个线性关系约束,推广之,N 维数组是“数据元素为 N-1 维数组”的线性表。

由数组结构可以看出,数组中的每一个元素由一个值和一组下标来描述。 “值”代表数组中元素的数据信息,一组下标用来描述该元素在数组中的相对位 置信息。数组的维数不同,描述其相对位置的下标的个数也不同。例如,在二维数 组中,元素 ai j由两个下标值 i、 j 来描述。其中 i 表示该元素所在的行号,j 表 示该元素所在的列号。同样可以将这个特性推广到多维数组,对于 n 维数而言, 其元素由 n 个下标值来描述其在 n 维数组中的相对位置。

( 2 )数组的运算

数组是一组有固定个数的元素的集合。即,一旦定义了数组的维数和每一维 的上、下限,数组中元素的的个数就固定了。例如二维数组 A3 × 4 ,它有 3 行、 4 列,即由 12 个元素组成。由于这个性质,使得对数组的操作不像对线性表的操作那样可以在表中任意一个合法的位置插入或删除一个元素。对于数组的操作一般只有两类:

  • ①获得特定位置的元素值;
  • ②修改特定位置的元素值。
    因此数组的操作主要是数据元素的定位,即给定元素的下标,得到该元素在计算机中的存放位置。其本质上就是地址计算问题。

( 3 )数组的抽象数据类型定义

数组的抽象数据类型定义如下:
ADT Array{
在这里插入图片描述

2、数组的顺序存储

数组是一种特殊的数据结构,一旦给定数组的维数 n 及各维长度 bi( 1 ≤ i≤ n),则该数组中元素的个数是固定的,数组的基本操作中不涉及数组结构的变化,因此对于数组而言,采 用顺序存储表示比较适合。

在计算机中,内存储器的结构是一维的。对于一维数组可直接采用顺序存储,用一维的内 存存储表示多维数组,就必须按某种次序将数组中元素排成一个线性序列,然后将这个线性序列存放在一维的内存储器中,这就是数组的顺序存储结构。

数组的顺序存储结构有两种:
一种是按行序存储,如高级语言 BASIC、COBOL、Pascal 和 C 语言都是以行序为主。

另一种是按列序存储,如高级语言中的 FORTRAN 语言就是以列序为主。

显然,二维数组 Am × n 以行为主的存储序列为:
在这里插入图片描述
而以列为主存储序列为:
在这里插入图片描述

假设有一个 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

以上的存放规则可推广到多维数组的情况。总之,知道了多维数组的维数,以及每维的上 下界,就可以方便地将多维数组按顺序存储结构存放在计算机中了。同时,根据数组的下标, 可以计算出其在存储器中的位置。因此,数组的顺序存储是一种随机存取的结构。

( 1 )一维数组的地址计算

一维数组中的元素只需要一个下标,其实质是线性表,存储方法与普通线性表存储方法完 全相同,即将数组元素按它们的逻辑次序存储在一片连续的存储区域内。

设一维数组为: A = ( a1 ,a2 ,…, ai,…, an) 数组中每个元素占 size 个存储单元,则元素 ai的存储地址为:

Loc( A[ i])= Loc( A[ 1 ])+( i-1 )× size

( 2 )二维数组的地址计算

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

Loc( A[ i][ j])= Loc( A[ 1 ][ 1 ])+ n ×( i-1 )+( j -1 )

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

Loc( A[ i][ j])= Loc( A[ 1 ][ 1 ])+ ( n ×( i-1 )+ j-1 )× size

( 3 )三维数组的地址计算

三维数组 A( 1 …r,1 …m,1 …n)可以看成是 r 个 m ×n 的二维数组,如下图所示。
在这里插入图片描述
假定每个元素占 size 个存储单元,采用以行为主序的方法存放,即行下标 r 变化最慢,纵下 标 n 变化最快。首元素 a111的地址为 Loc( A[ 1 ][ 1 ][ 1 ]),求任意元素 aijk的地址。

显然,ai11的地址为 Loc( A[ i][ 1 ][ 1 ])= Loc( A[ 1 ][ 1 ][ 1 ])+( i-1 )× m×n,因为在该元素之前,有 i-1 个 m ×n 的二维数组。

由 a i11的地址和二维数组的地址计算公式,不难得到三维数组任意元素 aijk 的地址:

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

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

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

或记为:
Loc ( A[ j1 ][ j2 ][ j3 ])= Loc( A[ c1 ][ c2 ][ c3 ])+ size ×( d2 - c2 + 1 )×( d3 - c3 +1 )×( j1 - c1 )+ size ×( d3 - c3 + 1 )×( j2 - c2 )+ size ×( j3 - c3 )

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

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

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

( 4 ) n 维数组的地址计算

对于 n 维数组 A( c1 : d1 ,c2 : d2 ,…, cn: dn),只要把上式推广,就可以容易地得到 n 维数组 中任意元素 aj 1 j2 … jn的存储地址的计算公式:
在这里插入图片描述
在高级语言的应用层上,一般不会涉及到 Loc ( A[ j1 ][ j2 ]…[ jn])的计算公式,这一计算内存地 址的任务是由高级语言的编译系统完成的。在使用时,只需给出数组的下标范围,编译系统将 根据用户提供的必要参数进行地址分配,用户则不必考虑其内存情况。但是由 Loc( A[ j1 ][ j2 ][ j3 ]计算公式可以看出,数组的维数越高,数组元素存储地址的计算量就越大, 计算花费的时间就越多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值