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

第五章 数组和广义表

第五章 数组和广义表
数组与广义表可视为线性表的推广,其特点是 数据元素仍然是一个表。
5.1 数组的定义 5.2 数组的顺序表示和实现 5.3 矩阵的压缩存储 5.3.1 特殊矩阵 5.3.2 稀疏矩阵 5.4 广义表的定义 5.5 广义表的存储结构 5.6 广义表的递归算法
5.1 数组的定义
数组的逻辑结构 其特点是结构中的元素本身可以是具有某种结构的 数据,但属于同一数据类型。 比如:一维数组可以看作一个线性表,二维数组 可以看作“数据元素是一维数组”的一维数组, 三维数组可以看作“数据元素是二维数组”的一 维数组,依此类推。例如,二维数组: a11 a12 … a1n a21 a22 … a2n Amn= … … …… am1 am2 … amn


数组:是一个具有固定格式和数量的数据有序集, 每一个数据元素有唯一的一组下标来标识。 通常在各种高级语言中数组一旦被定义,每一维的 大小及上下界都不能改变。

在数组上不能做插入、删除数据元素的操作,在数 组中通常做下面两种操作: (1) 取值操作:给定一组下标,读其对应的数据元素。 (2) 赋值操作:给定一组下标,存储或修改与其相 对应的数据元素。
这样的存储方法确实节约了存储空间,但矩阵的运算从算 法上可能变的复杂些。 下面我们讨论这种存储方式下的稀疏矩阵的两种运算:转 置和相乘。
define SMAX 1024 /*一个足够大的数*/ typedef struct { int i,j; /*非零元素的行、列*/ datatype v; /*非零元素值*/ }SPNode; /*三元组类型*/ typedef struct { int mu,nu,tu; /*矩阵的行、列及非零元素的个数*/ SPNode data[SMAX]; /*三元组表*/ } SPMatrix; /*三元组表的存储类型*/
M=
T=
图5.4 稀疏矩阵M和T
一、三元组顺序表
将三元组按行优先的顺序,同一行中列号从小到 大的规律排列成一个线性表,称为三元组表, 采用顺序存储方法存储该表。如图5.11稀疏矩 阵对应的三元组表为图5.12。 显然,要唯一的表示一个稀疏矩阵,还需要存储 三元组表的同时存储该矩阵的行、列,为了运 算方便,矩阵的非零元素的个数也同时存储。 这种存储的思想实现如下:
LOC(aij)=LOC(a c1 c2)+( (i- c1) *( d2 - c2 + 1)+ (j- c2) )*l
同理对于三维数组Amnp,即m×n×p数组,对于数组元素aijk其物理地址为: LOC(aijk)=LOC(a111)+( ( i-1) *n*p+ (j-1)*p +k-1)*l
例如,下列三元组表 ((1,2,12)(1,3,9),(3,1,- 3),(3,6,14),(4,3,24), (5,2,18),(6,1,15),(6,4,-7))
加上(6,7)这一对行、列值便可作为下列矩阵M的另 一种描述。而由上述三元组表的不同表示方法可 引出稀疏矩阵不同的压缩存储方法。
0 12 9 0 0 0 18 0 0 0 24 0 0 0 0 0 0 0 0 0 0 0 14 0 0 0 0 0 0 –7 0 0 0 0 0 0 0 0 0 -3 0 12 9 0 0 0 0 0 0 0 0 0 0 0 0 0 14 0 0 0 24 0 0 0 0 0 15 18 0 0 0 0 –7 0 0 0 0 0 0 0 -3 0 0 15
LOC(i,j)=LOC(1,1)+[3*(i-1)-1+(j-i+1)]*d =LOC(1,1)+(2i+j-3)*d 上例中,a34对应着sa[7]。 k=2*i+j-3=2*3+4-3=7 a21对应着sa[2] k=2*2+1-3=2 由此,我们称sa[0..3*n-2]是阶三对角带 状矩阵A的压缩存储表示。
5.3.1特殊矩阵
所谓特殊矩阵是指非零元素或零元素的分布有一 定规律的矩阵,下面我们讨论几种特殊矩阵的压 缩存储。 1、对称矩阵 在一个n阶方阵A中,若元素满足下述性质: aij=aji 0≦i,j≦n-1 则称A为对称矩阵。如图5.1便是一个5阶对称矩阵。 对称矩阵中的元素关于主对角线对称,故只要 存储矩阵中上三角或下三角中的元素,让每两个 对称的元素共享一个存储空间,这样,能节约近 一半的存储空间。不失一般性,我们按“行优先
有了上述的下标交换关系,对于任意给定一组下标 (i,j),均可在sa[k]中找到矩阵元素aij,反之,对所有 的k=0,1,2,…n(n-1)/2-1,都能确定sa[k]中的元素在矩阵 中的位置(i,j)。由此,称sa[n(n+1)/2]为阶对称矩阵A的 压缩存储,见下图: a11 a21 k=0 1 a22 a31 2 3 …… an1 … n(n-1)/2 … an,n n(n-1)/2-1
5.2 数组的顺序表示和实现
用向量作为数组的一种存储结构,因为内存的地址空间是一维 的,数组的行列固定后,通过一个映象函数,则可根据数组 元素的下标得到它的存储地址。 l 一维数组:按下标顺序分配 l 多维数组:一般有两种存储方式 1.以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、 COBOL、C等 2.以列为主序(先列后行)的顺序存放,如FORTRAN语言 以行为主序的分配规律是:最右边的下标先变化,即最右下标 从小到大,循环一遍后,右边第二个下标再变,…,从右向 左,最后是左下标。 以列为主序分配的规律恰好相反:最左边的下标先变化,即最 左下标从小到大,循环一遍后,左边第二个下标再变,…, 从左向右,最后是右下标。
设有m×n二维数组Amn,按元素的下标求其地址的计算:
以“ 以行为主序” 的分配为例: 设数组的基址为LOC(a11),每个数组元素占据l个地址单元,那么aij 的物理地址 可用一线性寻址函数计算: LOC(aij) = LOC(a11) + ( (i-1)*n + j-1 ) * l 在C语言中,数组中每一维的下界定义为0,则:LOC(aij) = LOC(a00) + ( i*n + j)*l 推广到一般的二维数组:A[c1..d1] [c2..d2],则aij的物理地址计算函数为:
顺序”存储主对角线(包括对角线)以下的元素,其 存储形式如图所示:
1 5 1 3 7 5 1 3 7 0 8 0 0 8 9 2 6 0 2 5 1 0 6 1 3 a11 a21 a 22 a31 a32 a33 ……………….. an1 a n2 a n3 …a nn
图 5.1 对称矩阵
在这个下三角矩阵中,第i行恰有i个元素,元素总 数为: n(n+1)/2 因此,我们可以按图中箭头所指的次序将这些 元素存放在一个向量sa[0..n(n+1)/2-1]中。为了便 于访问对称矩阵A中的元素,我们必须在aij和sa[k]
例:一个2×3二维数组,逻辑结构可以用图 5.2表示。以行为主序的内存映象如图5.3(a) 所示。 分配顺序为:a11 ,a12 ,a13 ,a21 , a22 ,a23 ; 以列为主序的分配顺序为:a11 , a21 ,a12 ,a22 ,a13 ,a23 ; 它的内存映象 如图5.3(b)所示。
2、三角矩阵 以主对角线划分,三角矩阵有上三角和下三角两种。 上三角矩阵如图所示,它的下三角(不包括主对角线) 中的元素均为常数。下三角矩阵正好相反,它的主对 角线上方均为常数,如图所示。在大多数情况下, 三角矩阵常数为零。 a11 a12 … a 1 n a11 c … c c a22 … a 2 n a21 a22 … c ………………….. …………….. c c … a nn an1 an2 … ann (a)上三角矩阵 (b)下三角矩阵 图5.2 三角矩阵
推广到一般的三维数组:A[c1..d1] [c2..d2] [c3..d3],则aijk的物理地址为:
LOC(i,j)=LOC(a c1 c2 c3)+( (i- c1) *( d2 - c2 + 1)* (d3- c3 + 1)+ (j- c2) *( d3- c3 + 1)+(k- c3))*l
a11 a12 a21 a22 a23 a32 … … a nn-1 a nn
K=0 1 2 3 4 5 … … 3n-4 3n-3 数组sa中的元素sa[k]与三对角带状矩阵中的元 素aij存在一一对应关系,在aij之前有i-1行,共有 3*(i-1)-1个非零元素,在第i行,有j-i+1个非零元 素,这样,非零元素aij的地址为:
之间找一个对应关系。 若i≧j,则ai j在下三角形中。 ai j之前的i-1行(从第1 行到第i-1行)一共有1+2+…+(i-1)=i(i-1)/2个元素,在 第i行上, ai j之前恰有j-1个元素(即ai1,ai2,ai3,…,aij-1), 因此有: k=i*(i-1)/2+j-1 0≦k<n(n+1)/2 若i<j,则aij是在上三角矩阵中。因为aij=aji,所以只要 交换上述对应关系式中的i和j即可得到: k=j*(j-1)/2+i-1 0≦ k<n(n+1)/2
a11 a12 a21 a22 a23 a32 a33 a34 …. ….. …. an-1 n-2 an-1 n-1 an-1 n ann-1 ann
图5.3 对角矩阵
Hale Waihona Puke 对这种矩阵,我们也可按行优序为主序来存储。除 第1行和第n行是2个元素外,每行的非零元素都 要是3个,因此,需存储的元素个数为3n-2。
下三角矩阵的存储和对称矩阵类似,sa[k]和aij对 应关系是: i(i-1)/2+j-1 i≧j k= n(n+1)/2 i<j 3、对角矩阵 对角矩阵中,所有的非零元素集中在以主对角线 为了中心的带状区域中,即除了主对角线和主对 角线相邻两侧的若干条对角线上的元素之外,其 余元素皆为零。下图给出了一个三对角矩阵,
相关主题