数据结构——数组和特殊矩阵


一、数组

1.数组的定义

数组是由n(n≥1)个相同类型的数据元素构成的有限序列,每个数据元素称为一个数组元素,每个元素在n个线性关系中的序号称为该元素的下标,下标的取值范围称为数组的维界。
数组与线性表的关系:数组是线性表的推广。一维数组可视为一个线性表;二维数组可视为其元素是定长数组的线性表,以此类推。数组一旦被定义,其维数和维界就不再改变。因此,除结构的初始化和销毁外,数组只会有存取元素和修改元素的操作。

2.数组的存储结构

大多数计算机语言都提供了数组数据类型,逻辑意义上的数组可采用计算机语言中的数组数据类型进行存储,一个数组的所有元素在内存中占用一段连续的存储空间
以一维数组A[0…n-1]为例,其存储结构关系式为
LOC(a[i]) = LOC(a[0]) + i * L (0<=i<n)
其中,L是每个数组元素所占的存储单元。

3.多维数组

对于多维数组,有两种映射方法:按行优先按列优先。以二维数组为例,按行优先存储的基本思想是:先行后列,先存储行号较小的元素,行号相等先存储列号较小的元素。设二维数组的行下标与列下标的范围分别为[0,h1]与[0,h2],则存储结构关系式为:
LOC(a[i,j]) = LOC(a[0,0]) + [ i * ( h1 + 1 ) + j ] * L
当以列优先方式存储时,得出存储结构关系式为:
LOC(a[i,j]) = LOC(a[0,0]) + [ j * ( h2 + 1 ) + i ] * L
例如A[2][3],它按行优先方式在内存中的存储形式如下图所示:
行优先
按列优先方式在内存中的存储形式如下图所示
列优先

二、特殊矩阵的压缩存储

压缩存储:指为多个值相同的元素只分配一个存储空间,对零元素不分配空间。
特殊矩阵:指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律性的矩阵。常见的特殊矩阵有对称矩阵、上(下)三角矩阵、对角矩阵等。
特殊矩阵的压缩存储方法:找出特殊矩阵中值相同的矩阵元素的分布规律,把那些呈现规律性分布的、值相同的多个矩阵元素压缩存储到一个存储空间中。

1.对称矩阵

若对一个n阶矩阵A中的任意一个元素a都有a[i][j]=a[j][i] (i>=1,j<=n),则称其为对称矩阵
对称矩阵
对于n阶对称矩阵,上三角区的所有元素和下三角区的对应元素相同,若仍采用二维数组存放,则会浪费几乎一半的空间,为此将n阶对称矩阵A存放在一维数组B[n(n+1)/2]中,即元素a[i][j],存放在bk中。比如只存放下三角部分(含主对角)的元素。
在数组B中,位于元素a[i][j] (i>=j)前面的元素个数为:
第1行:1个元素(a[1][1])。
第2行:2个元素(a[2][1],a[2][2])。

第i-1行:i-1个元素(a[i-1][1],a[i-1][2],a[i-1][i-1])。
第i行:j-1个元素(a[i][1],a[i][2], … ,a[i][j-1])。
因此,元素a[i][j]在数组B中的下标k = 1 + 2 + … + ( i - 1 ) + j - 1 = i ( i - 1 ) / 2 + j - 1(数组下标从0开始)。因此,元素下标之间的对应关系如下:
对应关系

2.三角矩阵

下三角矩阵:
下三角矩阵
下三角矩阵中,上三角区的所有元素均为同一常量。其存储思想与对称矩阵类似,不同之处在于存储完下三角区和主对角线上的元素之后,紧接着存储对角线上方的常量一次,所以可以将n阶下三角矩阵A压缩存储在B[n(n+1)/2+1]中。
元素下标之间的对应关系如下:
关系图
在内存中的压缩存储形式:
如图

3.三对角矩阵

对角矩阵也称带状矩阵。对n阶矩阵A中的任意一个元素a[i][j],当| i - j |>1时,若有a[i][j]=0 (i>=1,j<=n),则称为三对角矩阵,如下图所示。在三对角矩阵中,所有非零元素都集中在以主对角线为中心的3条对角线的区域,其他区域的元素都为零。
三对角矩阵
三对角矩阵也可以采用压缩存储,将3条对角线上的元素按行优先方式存放在一维数组B中,且a[1]存放于B[0]中,其存储形式如下图所示:
图

4.稀疏矩阵

矩阵中非零元素的个数t,相对矩阵元素的个数s来说非常少,即s>>t的矩阵称为稀疏矩阵
若采用常规的方法存储稀疏矩阵,则相当浪费存储空间,因此仅存储非零元素,但通常非零元素的分布没有规律,所以仅存储非零元素的值是不够的,还要存储它所在的行和列。因此,将非零元素及其相应的行和列构成一个三元组(行标i,列标j,值a[i][j]),如下图所示。然后按照某种规律存储这些三元组线性表。稀疏矩阵压缩存储后便失去了随机存取特性。
picture

ija[i][j]
004
126
219
3123

稀疏矩阵的三元组表既可以采用数组存储,又可以采用十字链表存储。当存储稀疏矩阵时,不仅要保存三元组表,而且要保存稀疏矩阵的行数、列数和非零元素的个数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值