【教学课件】第5章数组和广义表.ppt
《【教学课件】第5章数组和广义表.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第5章数组和广义表.ppt(63页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第5章章 数组和广义表数组和广义表教学目标教学目标 数组和广义表,是扩展的线性数据结构,其中广义表是人工智能程序设计的基础。要求熟练掌握其逻辑结构、存储结构各种运算。重点、难点重点、难点 抽象数据类型数组的定义与实现,特殊矩阵的压缩存储,稀疏矩阵(分别用三元组表、十字链表实现转置、加减法等矩阵运),广义表的存储结构,稀疏矩阵的乘法运算。教学方法教学方法 设问解疑,激发学生对数组和广义表的求知欲望和积极的思维活动。第第5章章 数组和广义表数组和广义表5.1 数组的定义和运算数组的定义和运算5.2 数组的顺序存储和实现数组的顺序存储和实现5.3 特殊矩阵的压缩存储特殊矩阵的压缩存储 5.3.1
2、三角矩阵三角矩阵 5.3.2 带状矩阵带状矩阵 5.3.3 稀疏矩阵稀疏矩阵5.4 广义表广义表5.5 总结与提高总结与提高 5.1 数组的定义和运算数组的定义和运算数组是一种数据类型。从逻辑结构上看,数组可以数组是一种数据类型。从逻辑结构上看,数组可以看成是一般线性表的扩充。二维数组可以看成是线看成是一般线性表的扩充。二维数组可以看成是线性表的线性表。例如:性表的线性表。例如:Amn=a12 a12 a1j a1na21 a22 a2j a2n ai1 ai2 aij ain am1 am2 amj amnAmn=a12 a12 a1j a1na21 a22 a2j a2n ai1 ai2
3、aij ain am1 am2 amj amnA=(1 2 j n)我们可以把二维数组看成一个线性表:我们可以把二维数组看成一个线性表:A=(1 2 j n),其中,其中 j(1j n)本身)本身也是一个线性表,称为也是一个线性表,称为列向量列向量。矩阵矩阵Amn看成看成n个列向量的线性表个列向量的线性表,即即 j=(a1j,a2j,amj)Amn=a12 a12 a1j a1na21 a22 a2j a2n ai1 ai2 aij ain am1 am2 amj amnB 1 2 i m我们还可以将数组我们还可以将数组Amn看成另外一个线性表看成另外一个线性表:B=(1,,2,,m),其中,
4、其中 i(1i m)本身也是一个线性)本身也是一个线性表,称为行向量,即:表,称为行向量,即:I=(ai1,ai2,aij,ain)。)。上面二维数组的例子,介绍了数组的结构特性,实上面二维数组的例子,介绍了数组的结构特性,实际上数组是一组有固定个数的元素的集合。由于这际上数组是一组有固定个数的元素的集合。由于这个性质,使得对数组的操作不象对线性表的操作那个性质,使得对数组的操作不象对线性表的操作那样,可以在表中任意一个合法的位置插入或删除一样,可以在表中任意一个合法的位置插入或删除一个元素。个元素。对于数组的操作一般只有两类:对于数组的操作一般只有两类:(1)获得特定位置的元素值;)获得特定
5、位置的元素值;(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和各维
6、的长和各维的长度合法,则构造相应的数组度合法,则构造相应的数组A,并返回,并返回TRUE;(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语
7、言的语言的数组略有不同。数组略有不同。5.2 数组的顺序存储和实现数组的顺序存储和实现 对于数组对于数组A,一旦给定其维数,一旦给定其维数n及各维长度及各维长度bi(1in),则该数组中元素的个数是固定的,不可),则该数组中元素的个数是固定的,不可以对数组做插入和删除操作,不涉及移动元素操作,以对数组做插入和删除操作,不涉及移动元素操作,因此对于数组而言,采用顺序存储法比较合适。因此对于数组而言,采用顺序存储法比较合适。数组的顺序存储结构有两种:一种是数组的顺序存储结构有两种:一种是按行序按行序存存储,如高级语言储,如高级语言BASIC、COBOL和和PASCAL语言都语言都是以行序为主。另一
8、种是是以行序为主。另一种是按列序按列序存储,如高级语言中存储,如高级语言中的的FORTRAN语言就是以列序为主。语言就是以列序为主。对于二维数组对于二维数组Amxn以以行行为为主主的的存存储储序序列列为为:a11,a12,a1n,a21,a22,a2n,am1,am2,amn 以以列列为为主主存存储储序序列列为为:a11,a21,am1,a12,a22,am2,a1n,a2n,amn 假设有一个假设有一个342的三维数组的三维数组A,其逻辑结构图为:其逻辑结构图为:列列行行纵纵 以二维数组以二维数组Amn为例,假设每个元素只占一个存为例,假设每个元素只占一个存储单元,储单元,“以行为主以行为主
9、”存放数组,下标从存放数组,下标从1开始,首开始,首元素元素a11的地址为的地址为Loc1,1 求任意元素求任意元素aij的地址的地址,可由,可由如下计算公式得到:如下计算公式得到: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的的二维数组二维数组,如下图所示:如下图所示:假定每个元素占一个存储单元,采用以行为主序假定每个元素占一个
10、存储单元,采用以行为主序的方法存放的方法存放,首元素,首元素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。如如果果将将三三维维数数组组推推广广到到一一般般情情况况,即即:用用j1,j2,j3代代替替数数组组下下标标i,j,k;并并且且j1,j2,j3的的下下限限为为c1,c2,c3,上上限限分分别别为为d1,d2,d3,每每个个元元素素占占
11、一一个个存存储储单单元元。则则三三维维数数组组中中任任意意元元素素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-c3)=Locc1,c2,c3+i*(ji-ci)(1i3)由公式可
12、知由公式可知Locj1,j2,j3与与j1,j2,j3呈线性关系。呈线性关系。对于维数组对于维数组A(c1:d1,c2:d2,,cn,dn),我们只要把上式,我们只要把上式推广,就可以容易地得到维数组中任意元素推广,就可以容易地得到维数组中任意元素aj1j2jn的存的存储地址的计算公式。储地址的计算公式。Locj1,j2,jn=Locc1,c2,cn+i(ji-ci)i=1n其中其中i=l (dk-ck+1)(1in)k=i+1n5.3 特殊矩阵的压缩存储特殊矩阵的压缩存储特殊矩阵压缩存储的压缩原则是:对有规律的元素特殊矩阵压缩存储的压缩原则是:对有规律的元素和值相同的元素只分配一个存储单元,
13、对于零元素和值相同的元素只分配一个存储单元,对于零元素不分配空间。不分配空间。5.3.1 三角矩阵三角矩阵三角矩阵大体分为:下三角矩阵、上三角矩阵和对三角矩阵大体分为:下三角矩阵、上三角矩阵和对称矩阵。对于一个称矩阵。对于一个n阶矩阵阶矩阵A来说:若当来说:若当ij时,有时,有aij=0,则此矩阵称为上三角矩阵;若矩阵中的所有,则此矩阵称为上三角矩阵;若矩阵中的所有元素均满足元素均满足aij=aji,则称此矩阵为对称矩阵。,则称此矩阵为对称矩阵。对于下三角矩阵,按对于下三角矩阵,按“行序为主序行序为主序”进行存储,得到的进行存储,得到的序列为:序列为:a11,a21,a22,a31,a32,a
14、33an1,an2ann。由于下。由于下三角矩阵的元素个数为三角矩阵的元素个数为n(n+1)/2,所以可压缩存储到一,所以可压缩存储到一个大小为个大小为n(n+1)/2的一维数组中。下三角矩阵中元素的一维数组中。下三角矩阵中元素aij(ij),在一维数组,在一维数组A中的位置为:中的位置为:LOC i,j=LOC1,1+i(i-1)/2+j-1 下三角矩阵:下三角矩阵:A=a11a21 a22a31 a32 a33 an1 an2 an3 ann 同同样样,对对于于上上三三角角矩矩阵阵,也也可可以以将将其其压压缩缩存存储储到到一一个个大大小小为为n(n+1)/2的的一一维维数数组组C中中。其其
15、中中元元素素aij(ij)在数组在数组C中的存储位置为:中的存储位置为:Loci,j=Loc1,1+j(j-1)/2+i-1 对于对称矩阵,因其元素满足对于对称矩阵,因其元素满足aij=aji,我们可以,我们可以为每一对相等的元素分配一个存储空间,即只存下为每一对相等的元素分配一个存储空间,即只存下三角(或上三角)矩阵,从而将三角(或上三角)矩阵,从而将n2个元素压缩到个元素压缩到n(n+1)/2个空间中。个空间中。5.3.2 带状矩阵带状矩阵带状矩阵带状矩阵:在矩阵:在矩阵A中,所有的非零元素都集中在以主对角线中,所有的非零元素都集中在以主对角线为中心的带状区域中。最常见的是三对角带状矩阵。
16、为中心的带状区域中。最常见的是三对角带状矩阵。Ann=a11 a12a21 a22 a23 a32 a33 a34 a43 a44 a45 特点特点:i=1,j=1,2;当当 1in,j=i-1,i,i+1 i=n,j=n-1,n;时,时,aij非零,其他元素均为零。非零,其他元素均为零。三对角带状矩阵的压缩存储,以行序为主序进行三对角带状矩阵的压缩存储,以行序为主序进行存储,并且只存储非零元素。其方法为:存储,并且只存储非零元素。其方法为:1.确定存储该矩阵所需的一维向量空间的大小确定存储该矩阵所需的一维向量空间的大小 从三对角带状矩阵中可看出:除第一行和最后一从三对角带状矩阵中可看出:除第
17、一行和最后一行只有两个元素外,其余各行均有行只有两个元素外,其余各行均有3个非零元素。由个非零元素。由此可得到一维向量所需的空间大小为:此可得到一维向量所需的空间大小为:3n-2。2.确定非零元素在一维数组空间中的位置确定非零元素在一维数组空间中的位置LOCi,j=LOC1,1+3(i-1)-1+j-i+1 =LOC1,1+2(i-1)+j-15.3.3 稀疏矩阵稀疏矩阵稀疏矩阵稀疏矩阵:指矩阵中大多数元素为零的矩阵。一般地,:指矩阵中大多数元素为零的矩阵。一般地,当非零元素个数只占矩阵元素总数的当非零元素个数只占矩阵元素总数的25%30%,或或低于这个百分数时,我们称这样的矩阵为稀疏矩阵。低
18、于这个百分数时,我们称这样的矩阵为稀疏矩阵。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 0M67=0 12 9 0 0 0 00 0 0 0 0 0 0-3 0 0 0 0 14 00 0 24 0 0 0 00 18 0 0 0 0 015 0 0 -7 0 0 0N67=1.稀疏矩阵的三元组表表示法稀疏矩阵的三元组表表示法 对于稀疏矩阵的压缩存储要求在存储非零元素的对于稀疏矩阵的压缩存储要求在存储非零元素的同时,还必须存储该非零元素在矩阵中所处的行号同时,还必须
19、存储该非零元素在矩阵中所处的行号和列号。我们将这种存储方法叫做稀疏矩阵的三元和列号。我们将这种存储方法叫做稀疏矩阵的三元组表示法。组表示法。row col value该该非非零零元元素素所在的行号所在的行号该该非非零零元元素素所所在的列号在的列号该该非非零零元元素素的的值值每个非零元素在一维数组中的表示形式每个非零元素在一维数组中的表示形式如图所示:如图所示:三元组表的类型说明:三元组表的类型说明:#define MAXSIZE 1000 /*非零元素的个数最多为非零元素的个数最多为1000*/typedef structint row,col;/*该非零元素的行下标和列下标该非零元素的行下标
20、和列下标*/ElementType e;/*该非零元素的值该非零元素的值*/Triple;typedef struct Triple dataMAXSIZE+1;/*非非零零元元素素的的三三元元组组表表。data0未未用用*/int m,n,len;/*矩矩阵阵的的行行数数、列列数数和和非非零零元元素素的的个个数数*/TSMatrix;1)用三元组表实现稀疏矩阵的转置运算)用三元组表实现稀疏矩阵的转置运算矩阵转置:指变换元素的位置,把位于(矩阵转置:指变换元素的位置,把位于(row,col)位)位置上的元素换到(置上的元素换到(col,row)位置上,也就是说,把元)位置上,也就是说,把元素的
21、行列互换。素的行列互换。采用矩阵的正常存储方式时,实现矩阵转置的经典算法采用矩阵的正常存储方式时,实现矩阵转置的经典算法如下如下:Void TransMatrix(ElementType sourcenm,ElementType destmn)/*Source和和dest分别为被转置的矩阵和转置后的矩阵(用二维数组表示)分别为被转置的矩阵和转置后的矩阵(用二维数组表示)*/int i,j;for(i=0;im;i+)for(j=0;jm=A.n;B-n=A.m;B-len=A.len;if(B-len0)j=1;for(k=1;k=A.n;k+)for(i=1;idataj.row=A.dat
22、ai.col B-dataj.col=A.datai.row;B-dataj.e=A.datai.e;j+;算法二、算法二、FastTransposeTSMatrix(TSMatrix A,TSMatrix *B)/*基于矩阵的三元组表示,采用快速转置法,将矩阵基于矩阵的三元组表示,采用快速转置法,将矩阵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;col=A.n;col+)numcol=0;for(t=1;t=A.l
23、en;t+)numA.datat.col+;/*计算每一列的非零元素的个数计算每一列的非零元素的个数*/position1=1;for(col=2;colA.n;col+)/*求求col列中第一个非零元素在列中第一个非零元素在B.data 中的正确位置中的正确位置*/positioncol=positioncol-1+numcol-1;for(p=1;pdataq.row=A.datap.col;B-dataq.col=A.datap.row;B-dataq.e=A.datap.epositioncol+;用三元组表实现稀疏矩阵的乘法运算用三元组表实现稀疏矩阵的乘法运算 设矩阵设矩阵M是是m1
24、n1矩阵,矩阵,N是是m2n2矩阵;若可以矩阵;若可以相乘,则必须满足矩阵相乘,则必须满足矩阵M的列数的列数n1与矩阵与矩阵N的行数的行数m2相等,才能得到结果矩阵相等,才能得到结果矩阵Q=MN(一个(一个m1n2的矩的矩阵)。阵)。数学中矩阵数学中矩阵Q中的元素的计算方法如下:中的元素的计算方法如下:Qij =MikNkj n1 k=1其中:其中:1im1,1jn2 根据数学上矩阵相乘的原理,我们可以得到矩根据数学上矩阵相乘的原理,我们可以得到矩阵相乘的经典算法:阵相乘的经典算法:for(i=1;i=m1;i+)for(j=1;j=n2;j+)Qij=0;for(k=1;km=M.m;Q-n
25、=N.n;Q-len=0;if(M.len*N.len!=0)for(arow=1;arow=M.m;arow+)/*逐行处理逐行处理M*/for(p=1;pfirstarow=Q-len+1;for(p=M.firstarow;pM.firstarow+1;p+)/*p指指向向M当当前前行行中每一个非零元素中每一个非零元素*/brow=M.datap.col;/*M中的列号应与中的列号应与N中的行号相等中的行号相等*/if(browN.n)t=N.firstbrow+1;else t=N.len+1;for(q=N.firstbrow;qt;q+)ccol=N.dataq.col;/*乘积元
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 数组 广义
限制150内