当前位置:文档之家› 第5章 多维数组和广义表

第5章 多维数组和广义表

第五章 多维数组和广义表 前面讨论的线性表、链表、栈和队列都是线性的数据结构,它们 的逻辑特征是:每个数据元素至多有一个直接前驱和一个直接后继。 本章要介绍的数组是指至少二维数组的多维数组,它是一种复杂的非 线性结构,它的逻辑特征是:一个数据元素可能有多个直接前驱和多 个直接后继。
5.1 多维数组 一、一维数组
k=I×(I+1)/2+J , 0≤k<n(n+1)/2。 3)对称矩阵的地址计算公式
LOC(aij)=LOC(sa[k]) =LOC(sa[0])+kd=LOC(sa[0])+(I(I+1)/2+J)d。 2、三角矩阵 1)三角矩阵的定义:把主对角线以下(不包括主对角线)的元素均为 常数c的n阶矩阵,称为上三角矩阵;把主对角线以上(不包括主对角线) 的元素均为常数c的n阶矩阵,称为下三角矩阵;上三角矩阵和下三角 矩阵统称为三角矩阵。三角矩阵中的常数c在多数情况下为0。
面。例如,二维数组Amn的按行优先存储的线性序列为: a11,a,am2,…,amn
2、 列优先顺序 将数组元素按列向量排列,第j+1个列向量紧接在第j个列向量后
面。例如,二维数组Amn的按列优先存储的线性序列为: a11,a21,…,am1,a12,a22,…,am2,……,a1n,a2n,…,amn
将下三角中的元素aij(i≥j)按线性序列a00,a10,a11,…, an-10, an-11,…,an-
1n-1的次序存放在一个含有n(n+1)/2个元素的向量sa[]中(因下三角元素
总数为n(n+1)/2)。即将aij存放在sa[i(i+1)/2+j]中(0≤i≤n-1,0 ≤j≤i)。
7
②对称矩阵中的元素aij和sa[k]之间的对应关系: 若i≥j,k=i×(i+1)/2+j 0≤k<n(n+1)/2 若i<j,k=j×(j+1)/2+i 0≤k<n(n+1)/2 令I=max(i,j),J=min(i,j),则k和i,j的对应关系可统一为:
2
二、多维数组
1、二维数组的表示 二维数组可表示成矩阵
Amn 的 aa形1211 式aa122,2
a1n a2n
矩看阵成的是每由m一个行行和向每量一组列成都的可(以列看)向成量是,一也个可a向m以1 量看a,m2成因是此由a,mnn二个维列数向组量可组以成
的(行)向量。
2、二维数组的逻辑结构
int row,col; //非零元的行号、列号 DataType v; //非零元的值 }TriTupleNode;
12
typedef struct{ //三元组表定义
TriTupleNode data[MaxSize]; //三元组表空间
int m,n,t; //矩阵总行数、总列数及非零元个r数ow col v
因此,二维数组的逻辑结构是:每个元素至多有两个直接前驱和两个
直接后继。
3
3、多维数组的逻辑结构 1)三维数组:三维数组可以看成是以二维数组为元素的向量。三维 数组的每个元素aijk至多有三个直接前驱和三个直接后继。 2)n维数组:n维数组可以看成是以n-1维数组为元素的向量。 n维数 组的每个元素至多有n个直接前驱和n个直接后继。 因此,多维数组的逻辑特征是:一个数据元素可能有多个直接前驱和 多个直接后继。 三、数组的顺序存储表示
8
2)三角矩阵的压缩存储:三角矩阵中的重复元素c可共享一个存储空 间,其余的元素正好有n(n+1)/2个,因此,三角矩阵可压缩存储到含 有n(n+1)/2+1个元素的向量sa[]中,其中c存放在向量的最后一个分量 中。 ①上三角矩阵中aij和sa[k]之间的对应关系
上三角矩阵中,主对角线之上的第i行(0≤i<n)恰有n-i个元素,按 行优先顺序存放上三角矩阵中的元素aij时:aij前有i行(从第0行到第i-1 行),一共有: (n-0)+(n-1)+(n-2)+…+(n-i+1)=i(2n-i+1)/2个元素;在第i行上,aij前 恰有j-i个元素,因此aij存放在 sa[i(2n-i+1)/2+j-i]中(0≤i≤n-1,i≤j≤n-1)。 ②下三角矩阵中aij和sa[k]之间的对应关系
由于计算机内存的结构是一维的,因此用内存来表示多维数组,必 须将数组元素按某种次序排成线性序列后存人存储器。又由于数组一 般不做插入和删除操作,即数组一旦建立,结构中元素个数和元素间 关系不再发生变化。因此,一般采用顺序存储方法表示数组,通常有 以下两种顺序存储方式。
4
1、 行优先顺序 将数组元素按行向量排列,第i+1个行向量紧接在第i个行向量后
设二维数组Amn按行优先存储,各维的下界为0,上界分别为m1,n-1,每个元素占内存的字节数为d,如果用LOC(a00)表示a00的地址, 则aij的地址为:
同理,三维数组Amnp按行优先存储,则aijk的地址为:
LOC (aij ) LOC (a00 ) (i n j) d 0 i m, 0 j n
同理可以得到,按行优先顺序存放下三角矩阵中的元素aij时,aij 存放在sa[i(i+1)/2+j]中(0≤i≤n-1, 0≤j≤i)。
9
3、对角矩阵 1)对角矩阵的定义:所有的非零元素集中在以主对角线为中心的带 状区域中,即除了主对角线和主对角线相邻两侧的若干条对角线上的 元素之外,其余元素皆为零的矩阵为对角矩阵。 2)k对角矩阵:一个满足条件若|i-j|>(k-1)/2,则aij=0的矩阵A是k对 角矩阵,其中k为奇数。特别,当k=3时,称为三对角矩阵。 3)三对角矩阵的压缩存储:三对角矩阵中非0元素正好有3n-2个,因 此,三对角矩阵可压缩存储到含有3n-2个元素的向量sa[]中。 ➢三对角矩阵中aij和sa[k]之间的对应关系
一维数组可用向量(a1,a2,…,an)的形式来表示,因此,也把一维 数组称为向量。向量中的每一个数据元素都具有统一的、相同的数据 类型,数组元素的下标一般具有固定的上界和下界,同一个数组中的 不同元素可通过下标来标识。向量的逻辑特征是:每个数据元素至多 有一个直接前驱和一个直接后继。向量是存储在计算机的连续存储空 间中,可通过数组的地址求出每个元素的地址,因此,可以随机的进 行存取。多维数组是向量的推广。
注意:C语言中的数组是按行优先顺序存储的,数组元素下标的下界 值为0。
5
四、数组元素的地址计算公式 按行优先方式顺序存储的数组,只要知道开始结点的存储地址、
多维数组的维数和各维的上下界,以及数组元素在内存中占用的字节 数,就可以求出每个元素的存储地址。因此,数组中的任一元素可以 在相同的时间内存取,即顺序存储的数组是一个随机存取结构。
LOC (aijk ) LOC (a000 ) (i n p j p k) d
0 i m,0 j n,0 k p
6
5.2 矩阵的压缩存储 一、常用矩阵的压缩存储 1、对称矩阵 1)对称矩阵的定义:如果n阶矩阵A的元素满足
,则称A为n阶对称矩阵。 2所a)ij以对只a称ji 要矩存0阵储i的,矩j压阵n缩中存上储三:角由或于下对三称角矩中阵的中元的素元,素让关每于两主个对对角称线的对元称素, 共享同一个存储空间,这样可以节约近一半的存储空间。 ①按“行优先顺序”存储下三角中的元素
稀疏矩阵进行压缩存储通常有两类方法:顺序存储和链式存储 (十字链表法)。
11
3、三元组表 若将表示稀疏矩阵的非零元素的三元组按行(或列)优先的顺序排
列(跳过零元素),则得到一个结点均为三元组的线性表,我们将该线 性表的顺序存储结构称为三元组表。
对于三元组表,除了描述稀疏矩阵的非零元素外,为了运算方便, 还应将矩阵的总行数、总列数和非零元素的总数也作为三元组表的属 性进行描述。 4、三元组表的描述 #define MaxSize 100 //三元组表空间的最大容量 typedef int DataType //结点类型 typedef struct { //三元组结点定义
元素aij前共有i行,其中非0元素共有3i-1个;第i行中前面已有i-1 个0,所以aij前非0元素有j-(i-1)个,因此aij前已有的非零元素个数 为: 3i-1+j-(i-1)=2i+j。按行优先顺序元素aij存放在sa[2i+j]中。
10
二、稀疏矩阵的压缩存储 1、稀疏矩阵的定义:设矩阵Amn中有s个非零元素,若s远远小于矩阵 元素的总数(即s<<m×n),则称A为稀疏矩阵。 2、稀疏矩阵的压缩存储
3)实现方法:
方得到法按一列:优简先单顺地稀序交存换疏储矩矩的阵阵转A的置三矩元阵组B的表三a->元da组t三a表中元br-o组>wd表和atac;ol中再的将内b->容d,ata
重排成按行优先顺序的三元组表;
13
方用法三二元:组由表于实A现的矩列阵是的B的转行置,运因算此的,算按法a:->data的列序转置,所得到 的vo转id置Tr矩an阵sMB的atr三ix元(Tr组iT表upbl-e>Tdaabtlae必*b定,T是riT按up行le优Ta先bl存e *放a)的。我们将采用 方{/法/*二a,*来b是实矩现阵。A、B的三元组表表示,求A转置为B 4)ibn-算t>pm法,q=,步aj;->骤n;:b->n=a->m; //A和B的行列总数互换 第b一->步t=:a->根t;据//A非矩零阵元的总行数数、列数和非零元总数确定B矩阵的列数、行 数i和f(b非->零t<元=0总) 数。 第q二=0步{;p:rin当tf(三"A元中组无表非非零空元(");Ae矩xit阵(0的);}非//零退元出个数不为0)时,根据A矩 阵f三or(元j=组0;表j<a的->结n;点j++空) 间//对daAta的,每将一A的列三元组表a->data置换为B的三元组 表b-f>odr(apta=。0;p<a->t;p++) //扫描A的三元组表 具列j体(0置≤ijf≤换(baa--方->>>bddn法-aa->1tt:daa)[[a,为qpta]]通..保[rcqoo过]证wl.=c从=o=Balj的=头)-{>a三至/-d>/a元d尾找taa组[t扫列pa[]表描号p.c]o是三为.rl;o按元jw的行;组三优表元先a组->存d放ata的,,找对出A所中有的列每号一 等于j的那些b三->d元at组a[,q]将.v=它a-们>d的at行a[p号].和v; 列号互换后依次放人b->data中, 即可得到B的q+按+;行优先的压缩存贮表示。 5})具体算}法:
相关主题