数据结构数组存储地址问题 (看了不可能不会)2021-05-13

  • Post author:
  • Post category:其他




数据结构数组存储问题



求解数组元素存储位置

一般数组不做插入和删除操作,一旦建立了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动,因此采用顺序存储结构表示数组比较合适。

对二维数组有两种存储方式 1、行序为主序的存储方式

(行优先)


2、列序为主序的存储方式

列优先

b[0][0] b[0][1] b[0][2] b[0][3]

b[1][0] b[1][1] b[1][2] b[1][3]

上边是一个二维数组b[2][3] 下标从0开始,2行3列,下面是这个二维数组以行优先的存储方式 ↓
在这里插入图片描述

同理可知列优先。

假设每个元素占L个存储单元,则二维数组B[0…m-1 ,0…n-1] (即下标从0开始,共有m行n列)中任一元素aij 的存储位置可由

LOC(i,j)=LOC(0,0)+(n×i+j)L

此式子是以行序为主序的存储结构

如下图 ↓

在这里插入图片描述

如果已知b[0][0]的地址,问b[2][4]的地址,且每个元素占L个存储单位。

求解方法:算出从所给的位置到需要求的位置之间有多少个元素再乘以每个元素所占的存储位置,然后再加上所给的元素地址即可


以行优先


LOC(b[2][4])= LOC (b[0][0])+(2×n+4)×每个元素所占存储单元

(因为是行优先存储,求的b[2][4] 第一行元素必须存储完,才能进行下一行,也就是说第2行前面的行已经被优先存储了,那么第2行前面2行一共有 2×n个元素,因为必须前一行存完才能进行下一行,存完就是这一行 n(列)个元素)


以列优先


LOC(b[2][4])= LOC (b[0][0])+(4×m+2)×每个元素所占存储单元

(因为是列优先存储,求的b[2][4]的第一列肯定已经优先存储了才能进行下一列,也就是说前面的列已经被优先存储了,那么这4列一共有 4×m个元素,因为必须前一列存完才能进行下一行,存完就是这一列 有m个元素)



矩阵压缩存储

1、

对称矩阵


特点:n行n列 且 a

ij

=a

ji

即n阶对称矩阵。

因为 a

ij

=a

ji

所以存储时只需要存储一半,另一半相等的不用存,可根据 a

ij

=a

ji

找到。于是就有存上三角区域还是下三角区域的问题。

在这里插入图片描述

要存储这个n阶矩阵,可以根据它下标的特性与一维数组联系起来存储到一维数组里,从B[0]开始 B[0] B[1]…B[k]

关键在于要申请一个多大的一维数组来存储这个矩阵,即k的最大值,从下三角中的a

11

行开始到a

n1

行 每一行比前一行元素多一个,即可用等差数列求得k

在这里插入图片描述

其中i(i-1)/2是 是用等差求和算到i的前一行一共有几个元素,在加上第i行的 j个元素,再-1 是因为一维数组下标从零开始。



存储地址的习题

1、假设以行序为主序存储的二维数组A = a[1…100,1…100] 设每个元素占2个存储单元,基地址为10,则LOC[5,5]=()

LOC(5,5)=((5-1)x100+(5-1))x2+10=818

解释:以行序为主序存储则第5行前的4行都已存完,也就是4×100 个元素已经存到一维数组,然后第五行又存了(5-1)个(因为下标从0开始所减1)

2、设有一个10阶的对称矩阵A,采用压缩矩阵存储的方式,以行序为主存储,a

11

为第一元素,其存储地址为1 ,每个元素占一个地址空间,则a

85

的地址为

LOC(a

85

)=((8×7)+(5-1))÷2+1=33

8行之前的7行等差数列求和7×8(nx(n+1)) ,也可理解为a

ij

中的(i x (i-1))

3、若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括对角线上的所有元素)依次存放于一维数组B[1…n(n+1)/2]中,则在B中确定a

ij

(i<j)的位置k的关系式为

题中说存储的时下三角形的元素,下三角形元素a

ij

满足i>j

而且在对称矩阵中a

ij

=a

ji

所以求出下三角形中a

ji

即为答案 j(j-1)/2+i (B数组下标从1开始)

答题时要看清一维数组下标时从0开始还是从1 这会决定到底减不减1(从0开始要减1)

4、最难的一个题!来了!!

在这里插入图片描述

在这里插入图片描述


求地址算到它前一个元素,求存到一维数组的下标时算到它这个元素

我懂?我懂!



版权声明:本文为qq_52804209原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。