数据结构讲义精品文稿.ppt
《数据结构讲义精品文稿.ppt》由会员分享,可在线阅读,更多相关《数据结构讲义精品文稿.ppt(67页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构讲义数据结构讲义第1页,本讲稿共67页第2页,本讲稿共67页5.1 数组的定义数组的定义5.2 数组的顺序表示和实现数组的顺序表示和实现5.3 矩阵的压缩存储矩阵的压缩存储5.4 广义表的定义广义表的定义5.5 广义表的存储结构广义表的存储结构*5.6 m元多项式的表示元多项式的表示*5.7 广义表的递归算法广义表的递归算法目录目录第第 五五 章章 数组和广义表数组和广义表第3页,本讲稿共67页5.1数组的定义数组的定义 数组和广义表可看成是一种特殊的线性表,其特殊在于,表中的数据元素本身也是一种线性表数据元素本身也是一种线性表数据元素本身也是一种线性表数据元素本身也是一种线性表。数组
2、的定义数组的定义数组的定义数组的定义 几乎所有的程序设计语言都把数组类型设定为固有类型。数组也是我们最熟悉的数据类型。由于数组中各元素具有统一的类型,并且数组元素的下标一般具有固定的上界和下界,因此,数组的处理比其它复杂的结构更为简单。第4页,本讲稿共67页 以抽象数据类型的形式讨论数组的定义和实现,可以让我们加深对数组类型的理解。数组的抽象数据类型定义:数组的抽象数据类型定义:数组的抽象数据类型定义:数组的抽象数据类型定义:ADT Array 数据对象:ji=0,.,bi-1,i=1,2,.,n;D=aj1j2.jn|n(0)称为数组的维数,bi是数组第i维的长度,ji是数组元素的第i维下标
3、,aj1j2.jn(-ElemSet 数据关系:R=R1,R2,.Rn Ri=|0=jk=bk-1,1=k=n且ki,0=ji=bi-2,aj1.ji.jn,aj1.ji+1 jn(-D,i=2,.n第5页,本讲稿共67页基本操作:InitArray(&A,n,bound1,.,boundn)若维数和各维长度合法,则构造相应的数组A,并返回OK.DestroyArray(&A)操作结果:销毁数组A.Value(A,&e,index1,.,indexn)初始条件:A是n维数组,e为元素变量,随后是n个下标值.操作结果:若各下标不超界,则e赋值为所指定的A的元素值,并返回OK.Assign(&A,
4、e,index1,.,indexn)初始条件:A是n维数组,e为元素变量,随后是n个下标值.操作结果:若下标不超界,则将e的值赋给 所指定的A的元素,并返回OK.ADT Array第6页,本讲稿共67页多维数组是一维数组的推广。例如,二维数组:a11 a12 a1n A1 a21 a22 a2n A2 am1 am2 amn AnAmn=见书见书P91页图页图5.1第7页,本讲稿共67页 所以数组可以看成是由行向量组成的线性表,也可以看成是个列向量组成的线性表。在C语言中,一个二维数组类型可以定义为其分量类型为一维数组类型的一维数组类型,也就是说,typedef elemtype array2
5、mn;等价于:typedef elemtype array1n;typedef array1 array2m;同理,一个N维数组类型可以定义为其数据元素为N-1维数组类型的一维序组类型。数组一旦被定义,它的维数和维界就不再改变。因此,除了结构的初始化和销毁之外,数组只有存取元素和修改元素值的操作。第8页,本讲稿共67页5.2数组的顺序表示和实现数组的顺序表示和实现 由于计算机的内存结构是一维的,因此用一维内存来表示多维数组,就必须按某种次序将数组元素排成一列序列,然后将这个线性序列存放在存储器中。又由于对数组一般不做插入和删除操作,也就是说,数组一旦建立,结构中的元素个数和元素间的关系就不再发
6、生变化。因此,一般都是采用顺序存储的方法来表示数组。通常有两种顺序存储方式:通常有两种顺序存储方式:行优先顺序行优先顺序将数组元素按行排列,第i+1个行向量紧接在第i个行向量后面。以二维数组为例,按行优先顺序存储的线性序列为:a11,a12,a1n,a21,a22,a2n,am1,am2,amn 在PASCAL、C语言中,数组就是按行优先顺序存储的。列优先顺序列优先顺序将数组元素按列向量排列,第j+1个列向量紧接在第j个列向量之后,A的m*n个元素按列优先顺序存储的线性序列为:a11,a21,am1,a12,a22,am2,an1,an2,anm在FORTRAN语言中,数组就是按列优先顺序存储
7、的。第9页,本讲稿共67页 以上规则可以推广到多维数组的情况:优先顺序可规定为先排最右的下标,从右到左,最后排最左下标:列优先顺序与此相反,先排最左下标,从左向右,最后排最右下标。按上述两种方式顺序存储的序组,只要知道开始结点的存放只要知道开始结点的存放只要知道开始结点的存放只要知道开始结点的存放地址(即基地址),维数和每维的上、下界,以及每个数组元素地址(即基地址),维数和每维的上、下界,以及每个数组元素地址(即基地址),维数和每维的上、下界,以及每个数组元素地址(即基地址),维数和每维的上、下界,以及每个数组元素所占用的单元数,就可以将数组元素的存放地址表示为其下标的所占用的单元数,就可以
8、将数组元素的存放地址表示为其下标的所占用的单元数,就可以将数组元素的存放地址表示为其下标的所占用的单元数,就可以将数组元素的存放地址表示为其下标的线性函数线性函数线性函数线性函数。因此,数组中的任一元素可以在相同的时间内存取,即顺序存储的数组是一个随机存取结构。例如例如,二维数组Amn按“行优先顺序”存储在内存中,假设每个元素占用d个存储单元。元素aij的存储地址应是数组的基地址加上排在aij前面的元素所占用的单元数。因为aij位于第i行、第j列,前面i-1行一共有(i-1)n个元素,第i行上aij前面又有j-1个元素,故它前面一共有(i-1)n+j-1个元素,因此,aij的地址计算函数为:L
9、OC(aij)=LOC(a11)+(i-1)*n+j-1*d同样,三维数组Aijk按“行优先顺序”存储,其地址计算函数为:LOC(aijk)=LOC(a111)+(i-1)*n*p+(j-1)*p+(k-1)*d第10页,本讲稿共67页 将上述的式子推广到一般情况,可得到n维数组的数据元素存储位置的计算公式:LOC(j1,j2,jn)=LOC(0,0,0)+(b2 bn j1+b3 bn j2+bn jn-1+jn)L=LOC(0,0,0)+=LOC(0,0,0)+上式就称为n维数组的映象函数。容易看出,数组元素的存储位置是其下标的线性函数,一旦确定了数组的各维的长度,Ci就是常数。第11页,
10、本讲稿共67页数组的顺序存储表示和实现:#include#define MAX_ARRAY_DIM 8typedef struct ElemType*base;/数组元素基址,由InitArray分配 int dim;/数组维数 int*bounds;/数组维界基址,由InitArray分配 int*constants;/数组映象函数常量基址,由InitArray分配Array;Status InitArray(Array&A,int dim,.);Status DestroyArray(Array&A);Status Value(Array A,ElemType&e,.);Status As
11、sign(Array&A,ElemType e,.);第12页,本讲稿共67页基本操作的算法描述:Status InitArray(Array&A,int dim,.)if(dimMAX_ARRAY_DIM)return ERROR;A.dim=dim;A.bounds=(int*)malloc(dim*sizeof(int);if(!A.bounds)exit(OVERFLOW);elemtotal=1;va_start(ap,dim);for(i=1;idim;+i)A.boundsi=va_arg(ap,int);if(A.boundsi=0;-i)A.constantsi=A.boun
12、dsi+1*A.constantsi+1;return OK;第14页,本讲稿共67页Status DestoyArray(Array&A)if(!A.base)return ERROR;free(A.base);A.base=NULL;if!(A.bounds)return ERROR;free(A.bounds);A.bounds=NULL;if!(A.constatns)return ERROR;free(A.constants);A.constants=NULL;return OK;第15页,本讲稿共67页Status Locate(Array A,va_list ap,int&off
13、)off=0;for(i=0;iA.dim;+i)ind=va_arg(ap,int);if(ind=A.boundsi)return OVERFLOW;off+=A.constantsi*ind;return OK;第16页,本讲稿共67页Status Value(Array A,ElemType&e,.)va_start(ap,e);if(result=Locate(A,ap,off)=0 return result;e=*(A.base+off);return OK;第17页,本讲稿共67页Status Assign(Array&A,ElemType e,.)va_start(ap,e)
14、;if(result=Locate(A,ap,off)=jk=当i=j i1时,元素aij=0。由此可知,一个k对角矩阵(k为奇数)A是满足下述条件的矩阵:若i-j(k-1)/2,则元素 aij=0。对角矩阵可按行优先顺序或对角线的顺序,将其压缩存储到一个向量中,并且也能找到每个非零元素和向量下标的对应关系。在三对角矩阵里附满足条件i=0,j=0、1,或i=n-1j=n-2、n-1或1in-1,j=i-1、i、i+1的元素aij外,其余元素都是零。对这种矩阵,我们也可按行优序为主序来存储。除第0行和第n-1行是2个元素外,每行的非零元素都要是3个,因此,需存储的元素个数为3n-2。3(n-2)
15、+2+2=3n-2第25页,本讲稿共67页a n-1 n-1a n-1 n-2a21 a12a11a10a01 a00 K=0 1 2 3 4 5 3n-2 3n-1 数组sa中的元素sak与三对角带状矩阵中的元素aij存在一一对应关系,在aij之前有i行,共有3*i-1个非零元素,在第i行,有j-i+1个非零元素,这样,非零元素aij的地址为:LOC(i,j)=LOC(0,0)+3*i-1+(j-i+1)*d=LOC(0,0)+(2i+j)*d 上例中,a34对应着sa10。k=2*i+j=2*3+4=10 a21对应着sa5 k=2*2+1=5由此,我们称sa0.3*n-2是阶三对角带状矩
16、阵A的压缩存储表示。第26页,本讲稿共67页 上述的各种特殊矩阵,其非零元素的分布都是有规律的,因此总能找到一种方法将它们压缩存储到一个向量中,并且一般都能找到矩阵中的元素与该向量的对应关系,通过这个关系,仍能对矩阵的元素进行随机存取。第27页,本讲稿共67页稀疏矩阵稀疏矩阵稀疏矩阵稀疏矩阵 什么是稀疏矩阵稀疏矩阵稀疏矩阵稀疏矩阵?简单说,设矩阵A中有s个非零元素,若s远远小于矩阵元素的总数(即smn),则称A为稀疏矩阵。精确点,设在的矩阵A中,有s个非零元素。令 e=s/(m*n),称e为矩阵的稀疏因子。通常认为e0.05时称之为稀疏矩阵稀疏矩阵稀疏矩阵稀疏矩阵。第28页,本讲稿共67页 矩
17、阵运算的种类很多,在下列抽象数据类型稀疏矩阵的定义中,只列举了几种常见的运算:ADT SparseMatrix 数据对象:D=aij|i=1,2,m;j=1,2,n;aij ElemSet,m和n分别称为矩阵的行数和列数。数据关系:R=Row,Col Row=|1=i=m,1=j=n-1 Col=|1=i=m-1,1=j=n 基本操作:CreateSMatrix(&M);操作结果:创建稀疏矩阵M。DestroySMatrix(&M);初始条件:稀疏矩阵M存在。操作结果:销毁稀疏矩阵M。第29页,本讲稿共67页 PrintSMatrix(M);初始条件:稀疏矩阵M存在。操作结果:输出稀疏矩阵M。
18、CopySMatrix(M,&T);初始条件:稀疏矩阵M存在。操作结果:由稀疏矩阵M复制得到T。AddSMatrix(M,N,&Q);初始条件:稀疏矩阵M与N的行数和列数对应相等。操作结果:求稀疏矩阵的和Q=M+N。SubtMatrix(M,N,&Q);初始条件:稀疏矩阵M与N的行数和列数对应相等。操作结果:求稀疏矩阵的差Q=M-N。MultSMatrix(M,N,&Q);初始条件:稀疏矩阵M的列数等于N的行数。操作结果:求稀疏矩阵的积Q=M*N。TransposeSMatrix(M,&T);初始条件:稀疏矩阵M存在。操作结果:求稀疏矩阵M的转置矩阵T。ADT SparseMatrix第30页
19、,本讲稿共67页 在存储稀疏矩阵时,为了节省存储单元,很自然地想到使用压缩存储方法。如何进行稀疏矩阵的压缩存储呢?按照压缩存储的概念,只存储稀疏矩阵的非零元。但由于非零元素的分布一般是没有规律的,因此在存储非零元素的同时,还必须同时记下它所在的行和列的位置(i,j)。反之,用一个三元组(i,j,aij)唯一确定了矩阵A的一个非零元。因此,稀疏矩阵可由表示非零元的三元组及其行列数唯一确稀疏矩阵可由表示非零元的三元组及其行列数唯一确稀疏矩阵可由表示非零元的三元组及其行列数唯一确稀疏矩阵可由表示非零元的三元组及其行列数唯一确定定定定。第31页,本讲稿共67页例如,下列三元组表(1,2,12)(1,3
20、,9),(3,1,-3),(3,6,14),(4,3,24),(5,2,18),(6,1,15),(6,4,-7)加上(6,7)这一对行、列值便可作为下列矩阵M的另一种描述。而由上述三元组表的不同表示方法可引出稀疏矩阵不同的压缩存储方法 1 2 3 4 5 6 71 2 3 4 5 6 71 2 3 4 5 6 71 2 3 4 5 6 7 0 12 9 0 0 0 0 0 0-3 0 0 15 0 0 0 0 0 0 0 12 0 0 0 18 0 -3 0 0 0 0 14 0 9 0 0 24 0 0 0 0 24 0 0 0 0 0 0 0 0 0 7 0 18 0 0 0 0 0 0
21、 0 14 0 0 0 15 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 图5.4 稀疏矩阵M和TM=T=1 12 23 34 45 56 6第32页,本讲稿共67页1.1.三元组顺序表三元组顺序表 假设以顺序存储结构来表示三元组表,则可得到稀疏矩阵的一种压缩存储方法三元顺序表三元顺序表三元顺序表三元顺序表。#define maxsize 12500/假设非零元个数的最大值为12500 typedef struct int i,j;/该非零元的行下标和列下标 ElemType e;Triple;typedef struct triple datamaxsize+1;
22、/非零元三元组表 int m,n,t;/矩阵的行数、行数和非零无个数 TSMatrix;第33页,本讲稿共67页设A为TSMatrix型的结构变量,图5.4中所示的稀疏矩阵的三元组的表示如下:i j e 1 2 12 data1 1 3 9 data2 3 1 -3 data3 3 6 14 data4 4 3 24 data5 5 2 18 data6 6 1 15 data7 6 4 -7 data8 A.mu=6 A.nu=7 A.tu=8 在此,data域中表示非零元的三元组是以行序为主序顺行序为主序顺序排列序排列的。第34页,本讲稿共67页 下面以矩阵的转置为例,说明在这种压缩存储结
23、构上如何实现矩阵的运算。一个mn的矩阵A,它的转置B是一个nm的矩阵,且aij=bji,0im,0jn,即A的行是B的列,A的列是B的行。将A转置为B,就是将A的三元组表a.data置换为表B的三元组表b.data,如果只是简单地交换a.data中i和j的内容,那么得到的b.data将是一个按列优先顺序存储的稀疏矩阵B,要得到按行优先顺序存储的b.data,就必须重新排列三元组的顺序。由于A的列是B的行,因此,按a.data的列序转置,所得到的转置矩阵B的三元组表b.data必定是按行优先存放的。第35页,本讲稿共67页 按这种方法设计的算法,其基本思想基本思想基本思想基本思想是:对A中的每一
24、列 col(0coln-1),通过从头至尾扫描三元表a.data,找出所有列号等于col的那些三元组,将它们的行号和列号互换后依次放入b.data中,即可得到B的按行优先的压缩存储表示。i j ei j ei j ei j e1 3 -3 data11 6 15 data22 1 12 data32 5 18 data43 1 9 data53 4 24 data64 6 -7 data76 3 14 data8i j ei j ei j ei j e 1 2 12 data1 1 3 9 data2 3 1 -3 data33 6 14 data4 4 3 24 data5 5 2 18 d
25、ata6 6 1 15 data7 6 4 -7 data8A AB BA.mu=6 A.nu=7 A.tu=8A.mu=6 A.nu=7 A.tu=8B.mu=7 B.nu=6 A.tu=8B.mu=7 B.nu=6 A.tu=8第36页,本讲稿共67页Status TransposeSMatrix(TSMatrix A,TSMatrix&B)/采用三元组表存储表示,求稀疏矩阵采用三元组表存储表示,求稀疏矩阵A的转置矩阵的转置矩阵B。B.mu=A.nu;B.nu=A.mu;B.tu =A.tu;if(B.tu)q=1;for(col=1;col=A.nu;+col)for(p=1;p=A.t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 讲义 精品 文稿
限制150内