【教学课件】第5章数组和广义表.ppt
《【教学课件】第5章数组和广义表.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第5章数组和广义表.ppt(63页珍藏版)》请在三一办公上搜索。
1、第5章 数组和广义表,教学目标 数组和广义表,是扩展的线性数据结构,其中广义表是人工智能程序设计的基础。要求熟练掌握其逻辑结构、存储结构各种运算。重点、难点 抽象数据类型数组的定义与实现,特殊矩阵的压缩存储,稀疏矩阵(分别用三元组表、十字链表实现转置、加减法等矩阵运),广义表的存储结构,稀疏矩阵的乘法运算。教学方法 设问解疑,激发学生对数组和广义表的求知欲望和积极的思维活动。,第5章 数组和广义表,5.1 数组的定义和运算5.2 数组的顺序存储和实现5.3 特殊矩阵的压缩存储 5.3.1 三角矩阵 5.3.2 带状矩阵 5.3.3 稀疏矩阵5.4 广义表5.5 总结与提高,5.1 数组的定义和
2、运算,数组是一种数据类型。从逻辑结构上看,数组可以看成是一般线性表的扩充。二维数组可以看成是线性表的线性表。例如:,我们可以把二维数组看成一个线性表:A=(1 2 j n),其中j(1j n)本身也是一个线性表,称为列向量。,矩阵Amn看成n个列向量的线性表,即j=(a1j,a2j,amj),我们还可以将数组Amn看成另外一个线性表:B=(1,,2,,m),其中i(1i m)本身也是一个线性表,称为行向量,即:I=(ai1,ai2,aij,ain)。,上面二维数组的例子,介绍了数组的结构特性,实际上数组是一组有固定个数的元素的集合。由于这个性质,使得对数组的操作不象对线性表的操作那样,可以在表
3、中任意一个合法的位置插入或删除一个元素。,对于数组的操作一般只有两类:(1)获得特定位置的元素值;(2)修改特定位置的元素值。,数组的抽象数据类型定义(ADT Array),数据对象:D=aj1j2jn|n0,称为数组的维数,ji是数组的第i维下标,1jibi,bi为数组第i维的长度,aj1j2jn ElementSet,数据关系:R=R1,R2,RnRi=|1jkbk,1kn 且ki,1jibi-1,aj1 jijn,aj1 ji+1jn D,i=1,n,基本操作:,(1)InitArray(A,n,bound1,boundn):若维数n和各维的长度合法,则构造相应的数组A,并返回TRUE;
4、,(2)DestroyArray(A):销毁数组A;,(3)GetValue(A,e,index1,indexn):若下标合法,用e返回数组A中由index1,indexn所指定的元素的值。,(4)SetValue(A,e,index1,indexn):若下标合法,则将数组A中由index1,indexn所指定的元素的值置为e。,注意:这里定义的数组下标是从1开始,与C语言的数组略有不同。,5.2 数组的顺序存储和实现,对于数组A,一旦给定其维数n及各维长度bi(1in),则该数组中元素的个数是固定的,不可以对数组做插入和删除操作,不涉及移动元素操作,因此对于数组而言,采用顺序存储法比较合适。
5、,数组的顺序存储结构有两种:一种是按行序存储,如高级语言BASIC、COBOL和PASCAL语言都是以行序为主。另一种是按列序存储,如高级语言中的FORTRAN语言就是以列序为主。,对于二维数组Amxn以行为主的存储序列为:a11,a12,a1n,a21,a22,a2n,am1,am2,amn 以列为主存储序列为:a11,a21,am1,a12,a22,am2,a1n,a2n,amn,假设有一个342的三维数组A,其逻辑结构图为:,以二维数组Amn为例,假设每个元素只占一个存储单元,“以行为主”存放数组,下标从1开始,首元素a11的地址为Loc1,1 求任意元素aij的地址,可由如下计算公式得
6、到:Loci,j=Loc1,1+n(i-1)+(j-1),如果每个元素占size个存储单元,则任意元素aij的地址计算公式为:Loci,j=Loc1,1+(n(i-1)+j-1)size,三维数组A(1.r,1.m,1.n)可以看成是r个mn的二维数组,如下图所示:,假定每个元素占一个存储单元,采用以行为主序的方法存放,首元素a111的地址为Loc1,1,1,ai11的地址为Loci,1,1=Loc1,1,1+(i-1)*m*n,那么求任意元素aijk的地址计算公式为:,Loci,j,k=Loc1,1,1+(i-1)*m*n+(j-1)*n+(k-1)其中1i,1j,1k。,如果将三维数组推广
7、到一般情况,即:用j1,j2,j3代替数组下标i,j,k;并且j1,j2,j3的下限为c1,c2,c3,上限分别为d1,d2,d3,每个元素占一个存储单元。则三维数组中任意元素a(j1,j2,j3)的地址为:Locj1,j2,j3=Locc1,c2,c3+1*(d2-c2+1)*(d3-c3+1)*(j1-c1)+1*(d3-c3+1)*(j2-c2)+1*(j3-c3)其中l为每个元素所占存储单元数。,令1=1*(d2-c2+1)*(d3-c3+1),2=1*(d3-c3+1),3=1,则:,Locj1,j2,j3=Locc1,c2,c3+1*(j1-c1)+2*(j2-c2)+3(j3-c
8、3)=Locc1,c2,c3+i*(ji-ci)(1i3),由公式可知Locj1,j2,j3与j1,j2,j3呈线性关系。,对于维数组A(c1:d1,c2:d2,,cn,dn),我们只要把上式推广,就可以容易地得到维数组中任意元素aj1j2jn的存储地址的计算公式。,5.3 特殊矩阵的压缩存储,特殊矩阵压缩存储的压缩原则是:对有规律的元素和值相同的元素只分配一个存储单元,对于零元素不分配空间。,5.3.1 三角矩阵,三角矩阵大体分为:下三角矩阵、上三角矩阵和对称矩阵。对于一个n阶矩阵A来说:若当ij时,有aij=0,则此矩阵称为上三角矩阵;若矩阵中的所有元素均满足aij=aji,则称此矩阵为对
9、称矩阵。,对于下三角矩阵,按“行序为主序”进行存储,得到的序列为:a11,a21,a22,a31,a32,a33an1,an2ann。由于下三角矩阵的元素个数为n(n+1)/2,所以可压缩存储到一个大小为n(n+1)/2的一维数组中。下三角矩阵中元素aij(ij),在一维数组A中的位置为:LOC i,j=LOC1,1+i(i-1)/2+j-1,下三角矩阵:,同样,对于上三角矩阵,也可以将其压缩存储到一个大小为n(n+1)/2的一维数组C中。其中元素aij(ij)在数组C中的存储位置为:Loci,j=Loc1,1+j(j-1)/2+i-1,对于对称矩阵,因其元素满足aij=aji,我们可以为每一
10、对相等的元素分配一个存储空间,即只存下三角(或上三角)矩阵,从而将n2个元素压缩到n(n+1)/2个空间中。,5.3.2 带状矩阵,带状矩阵:在矩阵A中,所有的非零元素都集中在以主对角线为中心的带状区域中。最常见的是三对角带状矩阵。,特点:,时,aij非零,其他元素均为零。,三对角带状矩阵的压缩存储,以行序为主序进行存储,并且只存储非零元素。其方法为:,1.确定存储该矩阵所需的一维向量空间的大小,从三对角带状矩阵中可看出:除第一行和最后一行只有两个元素外,其余各行均有3个非零元素。由此可得到一维向量所需的空间大小为:3n-2。,2.确定非零元素在一维数组空间中的位置,LOCi,j=LOC1,1
11、+3(i-1)-1+j-i+1=LOC1,1+2(i-1)+j-1,5.3.3 稀疏矩阵,稀疏矩阵:指矩阵中大多数元素为零的矩阵。一般地,当非零元素个数只占矩阵元素总数的25%30%,或低于这个百分数时,我们称这样的矩阵为稀疏矩阵。,0 0 3 0 0 1512 0 0 0 18 0 9 0 0 24 0 0 0 0 0 0 0-7 0 0 0 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0,1.稀疏矩阵的三元组表表示法,对于稀疏矩阵的压缩存储要求在存储非零元素的同时,还必须存储该非零元素在矩阵中所处的行号和列号。我们将这种存储方法叫做稀疏矩阵的三元组表示法。,每个非零元素在一维
12、数组中的表示形式如图所示:,三元组表的类型说明:,#define MAXSIZE 1000/*非零元素的个数最多为1000*/typedef structint row,col;/*该非零元素的行下标和列下标*/ElementType e;/*该非零元素的值*/Triple;typedef struct Triple dataMAXSIZE+1;/*非零元素的三元组表。data0未用*/int m,n,len;/*矩阵的行数、列数和非零元素的个数*/TSMatrix;,1)用三元组表实现稀疏矩阵的转置运算,矩阵转置:指变换元素的位置,把位于(row,col)位置上的元素换到(col,row)位
13、置上,也就是说,把元素的行列互换。,采用矩阵的正常存储方式时,实现矩阵转置的经典算法如下:,Void TransMatrix(ElementType sourcenm,ElementType destmn)/*Source和dest分别为被转置的矩阵和转置后的矩阵(用二维数组表示)*/int i,j;for(i=0;im;i+)for(j=0;j n;j+)desti j=sourcej i;,实现转置的简单方法:,矩阵source的三元组表A的行、列互换就可以得到B中的元素,如图:,为了保证转置后的矩阵的三元组表B也是以“行序为主序”进行存放,则需要对行、列互换后的三元组B,按B的行下标(即
14、A的列下标)大小重新排序。,两种处理转置算法如下:,算法一、,void TransposeTSMatrix(TSMatrix A,TSMatrix*B)/*把矩阵A转置到B所指向的矩阵中去。矩阵用三元组表表示*/int i,j,k;B-m=A.n;B-n=A.m;B-len=A.len;if(B-len0)j=1;for(k=1;kdataj.row=A.datai.col B-dataj.col=A.datai.row;B-dataj.e=A.datai.e;j+;,算法二、,FastTransposeTSMatrix(TSMatrix A,TSMatrix*B)/*基于矩阵的三元组表示,采
15、用快速转置法,将矩阵A转置为B所指的矩阵*/int col,t,p,q;int numMAXSIZE,positionMAXSIZE;B-len=A.len;B-n=A.m;B-m=A.n;if(B-len)for(col=1;coldataq.row=A.datap.col;B-dataq.col=A.datap.row;B-dataq.e=A.datap.epositioncol+;,用三元组表实现稀疏矩阵的乘法运算,设矩阵M是m1n1矩阵,N是m2n2矩阵;若可以相乘,则必须满足矩阵M的列数n1与矩阵N的行数m2相等,才能得到结果矩阵Q=MN(一个m1n2的矩阵)。,数学中矩阵Q中的元素
16、的计算方法如下:,其中:1im1,1jn2,根据数学上矩阵相乘的原理,我们可以得到矩阵相乘的经典算法:,for(i=1;i=m1;i+)for(j=1;j=n2;j+)Qij=0;for(k=1;k=n1;k+)Qij=Qij+Mik*Nkj;,经典算法中,不论Mik,Nkj是否为零,都要进行一次乘法运算,而实际上,这是没有不必要的。采用三元组表的方法来实现时,因为三元组只对矩阵的非零元素做存储,所以可以采用固定三元组a中元素(i,k,Mik)(1im1,1kn1),在三元组b中找所有行号为k的的对应元素(k,j,Nkj)(1km2,1jn2)进行相乘、累加从而得到Qij。即:以三元组a中的元
17、素为基准,依次求出其与三元组b的有效乘积。,相乘基本操作:对于三元组a中每个元素a.datap(p=1,2,3,a.len),找出三元组b中所有满足条件a.datap.col=b.dataq.row的元素b.dataq,求得a.datap.e与b.dataq.e的乘积,而这个乘积只是Qi,j的一部分,应对每个元素设一个累计和变量,其初值为0。扫描完三元组a,求得相应元素的乘积并累加到适当的累计和的变量上。,注意:两个稀疏矩阵相乘的结果不一定是稀疏矩阵。反之,相乘的每个分量Mi,kNk,j不为零,但累加的结果Qi,j可能是零。例如:,#define MAXSIZE 1000/*非零元素的个数最多
18、为1000*/#define MAXROW 1000/*矩阵最大行数为1000*/typedef structint row,col;/*该非零元素的行下标和列下标*/ElementType e;/*该非零元素的值*/Triple;typedef struct Triple dataMAXSIZE+1;/*非零元素的三元组表,data0未用*/int firstMAXROW+1;/*三元组表中各行第一个非零元素所在的位置。*/int m,n,len;/*矩阵的行数、列数和非零元素的个数*/TriSparMatrix;,为方便实现,将三元组表的类型说明修改如下:,具体算法如下:,int MulS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 数组 广义
链接地址:https://www.31ppt.com/p-5658989.html