收藏 分享(赏)

第5章 数组广义表.ppt

上传人:hwpkd79526 文档编号:4109447 上传时间:2018-12-10 格式:PPT 页数:64 大小:1.14MB
下载 相关 举报
第5章 数组广义表.ppt_第1页
第1页 / 共64页
第5章 数组广义表.ppt_第2页
第2页 / 共64页
第5章 数组广义表.ppt_第3页
第3页 / 共64页
第5章 数组广义表.ppt_第4页
第4页 / 共64页
第5章 数组广义表.ppt_第5页
第5页 / 共64页
点击查看更多>>
资源描述

1、第五章 数组广义表,5.1 数组的类型定义5.2 数组的顺序表示和实现5.3 矩阵的压缩存储 5.4 广义表的类型定义5.5 广义表的存储结构 * 5.6 m元多项式的表示 * 5.7 广义表的递归算法,1. 二维数组(矩阵):,Amn=,a00 a01 a02 . a0,n-1 a10 a11 a12 . a1,n-1 am-1,0 am-1,1 am-1,2 . am-1,n-1,按行划分: A可看成一个线性表 A=(a0,a1,am-1) ai=(ai0,ai0,ain-1) 按列划分: A可看成一个线性表 A=(a0,a1,an-1) aj=(a0j,a1j,am-1,j),5.1 数

2、组的类型定义,一个二维数组类型可以定义为其分量类型为一维数组类型的线性表类型;同理,一个n维数组类型可以定义为其数据元素为n-1维数组类型的线性表类型。,5.1 数组的类型定义,ADT Array 数据对象:ji=0,bi-1,i=1,2,n,Daj1,j2,jn| n称为数据元素的维数,bi是数组第i维的长度,ji 是数组元素的第i维下标, aj1,j2,jnElemSet数据关系:RR1, R2, ., RnRi | 0 jk bk -1,1 k n 且k i, 0 ji bi -2, aj1,. ji,. jn , aj1, .ji +1, .jn D, i=2,.,n 基本操作 ADT

3、 Array,5.1 数组的类型定义,基本操作:,InitArray(&A, n, bound1, ., boundn),DestroyArray(&A),Value(A, &e, index1, ., indexn),Assign(&A, e, index1, ., indexn),*,5.1 数组的类型定义,1、数组元素的地址关系以二维数组为例说明。对于二维数组有两种存储方式:(1)以行序为主的存储方式;(2)以列序为主的存储方式。,a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23,a00 a01 a02 a03 a10 a11 a12 a13

4、 a20 a21 a22 a23,第7个位置,第8个位置,假如a00的起始地址是loc(a00),数组中每一个元素所占空间为L,a12的起始地址怎么计算:行序:loc(a12)=loc(a00)+(14)+2L列序:loc(a12)=loc(a00)+(23)+1L,5.2 数组的顺序表示和实现,以行序为主序的存储结构的元素位置确定给定数组Ab1b2,每个元素所占空间为L,a00的起始地址记为loc(0,0),aij的起始地址为:LOCi,j=LOC0,0+(b2i+j)LAb1b2b33维数组的数据元素aijk的存储位置:LOC(i,j,k)=LOC(0,0,0,)+(b2b3i+b3j+k

5、)L,5.2 数组的顺序表示和实现,Ab1b2.bnn维数组的数据元素存储位置: LOC(j1,j2,jn)=LOC(0,0,0)+(b2bnj1+b3bnj2+bnjn-1+jn)L,5.2 数组的顺序表示和实现,#include /标准头文件,提供宏va_start、/va_arg和va_end,用于存放变长参数表 #define MAX_ARRAY_DIM 8 /数组维数 typedef struct Elemtype *base; /基址int dim; /维数int *bound; /数组维界基址int *constants; /数组映像函数常量基址 Array;,5.2 数组的顺序

6、表示和实现,Status InitArray(Array ,5.2 数组的顺序表示和实现,A.base=(ElemType *)malloc(elemtotal*sizeof(ElemType); if(!A.base) exit(OVERFLOW); A.constants=(int *)malloc(dim*sizeof(int); if(!A.constants) exit(OVERFLOW); A.constantsdim-1=1; for (i=dim-2);i=0;-i) A.constantsi=A.boundsi+1*A.constantsi+1; return OK; ,*,

7、5.2 数组的顺序表示和实现,5.3 矩阵的压缩存储,5.3.1 特殊矩阵5.3.2 稀疏矩阵5.3.3 矩阵的压缩存储,下(上)三角矩阵与对称矩阵A,1 0 0 0 2 2 0 0 4 5 3 0 3 6 7 8,1 2 3 5 2 2 4 6 3 4 3 7 5 6 7 8,下三角矩阵,对称矩阵,用一维数组存储san*(n+1)/2,当i=j时 aij对应存储在Ai(i-1)/2+j-1,*,5.3.1 特殊矩阵,假设 m 行 n 列的矩阵含 t 个非零元素,则称为稀疏因子。 通常认为 0.05 的矩阵为稀疏矩阵。,何谓稀疏矩阵?,5.3.2 稀疏矩阵,ADT SparseMatrix 数

8、据对象:Daij| i=1,2,m;j=1,2,n;aijElemSet,m,n分别为行数与列数数据关系:RRow, ColRow | i=1,m,j=1,n-1Col | i=1,m-1,j=1,n基本操作 ADT Array,5.3.2 稀疏矩阵,基本操作:,CreatSMatrix(&M),DestroyArray(&M),MultSMatrix(M,N,&Q),TransposeSMatrix(M, &T),5.3.2 稀疏矩阵,随机稀疏矩阵的压缩存储方法:,1、三元组顺序表,2、行逻辑联接的顺序表,3、 十字链表,5.3.2 稀疏矩阵,数组的表示方法,稀疏矩阵,0 1 0 0 0 0

9、 0 0 2 0 1 0 0 0 0,(1,2,1),(2,4,2),(3,1,1),5.3.3 矩阵的压缩存储,#define MAXSIZE 12500typedef struct int i, j; /该非零元的行下标和列下标ElemType e; / 该非零元的值 Triple; / 三元组类型,三元组顺序表,typedef structTriple dataMAXSIZE + 1; /data0未用int mu, nu, tu; TSMatrix; / 稀疏矩阵类型,5.3.3 矩阵的压缩存储,如何求转置矩阵?,5.3.3 矩阵的压缩存储,用常规的二维数组表示时的算法,其时间复杂度为

10、?O(munu),for (col=1; col=nu; +col)for (row=1; row=mu; +row)Tcolrow = Mrowcol;,5.3.3 矩阵的压缩存储,用“三元组”表示时如何实现?,1 2 14,1 5 -5,2 2 -7,3 1 36,3 4 28,2 1 14,5 1 -5,2 2 -7,1 3 36,4 3 28,5.3.3 矩阵的压缩存储,用“三元组”表示时如何实现?,1 2 14,1 5 -5,2 2 -7,3 1 36,3 4 28,2 1 14,5 1 -5,2 2 -7,1 3 36,4 3 28,5.3.3 矩阵的压缩存储,Status Tra

11、nsposeSMatrix(TSMatrix M, TSMatrix / Transpose,5.3.3 矩阵的压缩存储,分析算法TransposeSMatrix的时间复杂度:,时间复杂度为: O(M.nu*M.tu),for (col=1; col=M.nu; +col)for (p=1; p=M.tu; +p)if (M.datap.j = col) T.dataq.i=M.datap.j;T.dataq.j =M.datap.i;T.dataq.e =M.datap.e; +q; ,5.3.3 矩阵的压缩存储,算法改进:,for (col=1; col=M.nu; +col)for (p

12、=1; p=M.tu; +p)if (M.datap.j = col) T.dataq.i=M.datap.j;T.dataq.j =M.datap.i;T.dataq.e =M.datap.e; +q; ,分析时间复杂性,5.3.3 矩阵的压缩存储,算法改进:,设置num和cpot两个向量。numcol表示矩阵M中第col列中有几个非零元,cpotcol指示M中第col列的第一个非零元在b.data中的恰当位置。,cpot1=1cpotcol=cpotcol-1+numcol-1,5.3.3 矩阵的压缩存储,算法改进:,5.3.3 矩阵的压缩存储,Status FastTransposeSM

13、atrix(TSMatrix M, TSMatrix ,5.3.3 矩阵的压缩存储,cpot1 = 1; / 求 M 中每一列的第一个非零元在 b.data 中的序号for (col=2; col=M.nu; +col)cpotcol = cpotcol-1+numcol-1; for (p=1; p=M.tu; +p) col = M.datap.j; q = cpotcol;T.dataq.i =M.datap.j; T.dataq.j =M.datap.i;T.dataq.e =M.datap.e; +cpotcol; / for / ifreturn OK; / FastTranspo

14、seSMatrix,5.3.3 矩阵的压缩存储,分析算法FastTransposeSMatrix的时间复杂度:,时间复杂度为: O(M.nu+M.tu),for (col=1; col=M.nu; +col) for (t=1; t=M.tu; +t) for (col=2; col=M.nu; +col) for (p=1; p=M.tu; +p) ,5.3.3 矩阵的压缩存储,三元组顺序表又称有序的双下标法,它的特点是,非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。然而,若需随机存取某一行中的非零元,则需从头开始进行查找。,行逻辑联接的顺序表,5.3.3 矩阵的压缩存储,

15、#define MAXRC 500 typedef struct Triple dataMAXSIZE + 1; int rposMAXRC + 1; int mu, nu, tu; RLSMatrix; / 行逻辑链接顺序表类型,将上节快速转置矩阵的算法中创建的指示“行”信息的辅助数cpot固定在稀疏矩阵的存储结构中。,5.3.3 矩阵的压缩存储,两个矩阵相乘的经典算法Q=MNM是m1n1, N是n1n2,Q是m1n2,矩阵乘法的精典算法:for (i=1; i=m1; +i)for (j=1; j=n2; +j) Qij = 0;for (k=1; k=n1; +k) Qij += Mik

16、 * Nkj;,其时间复杂度为?O(m1n2n1),5.3.3 矩阵的压缩存储,稀疏矩阵相乘,5.3.3 矩阵的压缩存储,5.3.3 矩阵的压缩存储,Status MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix / Q初始化if (M.tu*N.tu != 0) / Q是非零矩阵,5.3.3 矩阵的压缩存储, for (arow=1; arow=M.mu; +arow) for (l=1; l=M.nu; +l) ctempl = 0; Q.rposarow = Q.tu+1; if (arowM.mu) tp=M.rposarow+1;else

17、 tp=M.tu+1;for (p=M.rposarow; ptp;+p) / 对当前行中每一个非零元 brow=M.datap.j; / 找到对应元在N中的行号if (brow N.mu ) t = N.rposbrow+1;else t = N.tu+1;,5.3.3 矩阵的压缩存储,for (q=N.rposbrow; q t; +q)ccol = N.dataq.j; / 乘积元素在Q中列号ctempccol += M.datap.e * N.dataq.e; / for q / 求得Q中第crow( =arow)行的非零元,5.3.3 矩阵的压缩存储,for (ccol=1; cco

18、l MAXSIZE) return ERROR;Q.dataQ.tu.i=arow;Q.dataQ.tu.j=ccol;Q.dataQ.tu.e=ctempccol; / if / for arow / if return OK; / MultSMatrix,5.3.3 矩阵的压缩存储,分析上述算法的时间复杂度,累加器ctemp初始化的时间复杂度为 (M.muN.nu), 求Q的所有非零元的时间复杂度为 (M.tuN.tu/N.mu), 进行压缩存储的时间复杂度为 (M.muN.nu), 总的时间复杂度就是 (M.muN.nu+M.tuN.tu/N.mu)。,5.3.3 矩阵的压缩存储,分析上

19、述算法的时间复杂度,若M是m行n列的稀疏矩阵,N是n行p列的稀疏矩阵, 则M中非零元的个数 M.tu = Mmn,N中非零元的个数 N.tu = Nnp, 相乘算法的时间复杂度就是 (mp(1+nMN) , 当M0.05 和N0.05及 n 1000时, 相乘算法的时间复杂度就相当于 (mp)。,*,5.3.3 矩阵的压缩存储,十字链表,3 0 0 5 0 -1 0 0 2 0 0 0,1,1,3,1,4,5,2,2,-1,3,1,2,5.3.3 矩阵的压缩存储,typedef struct OLNodeint i,j;ElemType e; Struct OLNode *right,*dow

20、n; OLNode;*OLink;,typedef struct OLink *rhead,*chead;int mu,nu,tu; CrossList;,5.3.3 矩阵的压缩存储,十字链表,Status CreateSMatrix_OL (CrossList ,5.3.3 矩阵的压缩存储,十字链表,for ( int c=1; ci=i; p-j=j; p-e=e; p-down=NULL; p-right=NULL; / 新结点if (M.rheadi = NULL | M.rheadi-j j) p-right = M.rheadi; M.rheadi= p; ,5.3.3 矩阵的压缩

21、存储,十字链表,else for (q=M.rheadi; (q-right) / CreateSMatrix_OL,5.3.3 矩阵的压缩存储,十字链表,(董事长、总经理、秘书、人事部、分公司),(总经理、秘书、人事部、分公司),5.4 广义表的类型定义,广义表是线性表的推广,也称列表(Lists)。1.定义广义表是n个元素的有限序列,记作A=(a1,a2,an)其中A是表名,n是广义表的长度,ai是广义表的元素,它可以是单个元素,也可以是广义表。原子: 如果ai是单个元素,称为原子,用小写字母表示;子表: 如果ai是广义表,称为子表,用大写字母表示。,5.4 广义表的类型定义,1.定义广义

22、表是n个元素的有限序列,记作A=(a1,a2,an)表头(Head):非空广义表的第一个元素a1;表尾(Tail):除了表头的其余元素组成的表;深度:广义表中括号嵌套的最大层数。2.特点存储空间难以确定,常采用链式存储。,5.4 广义表的类型定义,ADT Glist 数据对象:Dei | i=1,2,n; n0; eiAtomSet 或 eiGList,AtomSet为某个数据对象 数据关系:LR| ei-1 ,eiD, 2in基本操作: ADT Glist,5.4 广义表的类型定义,InitGlist(&L) CreateGlist(&L,S) DestroyGList(&L) CopyGL

23、ist(&T,L) GListLength(L) GListDepth(L) GetHead(L) GetTail(L) ,5.4 广义表的类型定义,3.举例 (1)B=(e)只含一个原子,长度为1,深度为1。 (2)C=(a,(b,c,d)有一个原子,一个子表,长度为2,深度为2。 (3)D=(B,C)二个元素都是列表,长度为2,深度为3。 (4)E=(a,E)是一个递归表,长度为2,深度无限,相当于E=(a,(a,(a,(a,)。,5.4 广义表的类型定义,例:设广义表A=(a,b,c),B=(A,(c,d),C=(a,(B,A),(e,f), 请写出下列各运算结果: 1.CAL(A)=

24、2.CDR(B)= 3.CAL(CAL(CAL(CDR(C)=,CAL(CAL(CAL(B,A),(e,f)= CAL(CAL(B,A)=CAL(B)=CAL(A,(c,d)=A,a,(c,d),*,5.4 广义表的类型定义,广义表是一个多层次的线性结构,例如:,D=(E, F),其中:E=(a, (b, c)F=(d, (e),D,E,F,a,( ),d,( ),b,c,e,5.4 广义表的类型定义,通常采用头、尾指针的链表结构,表结点:原子结点:,tag=1 hp tp,tag=0 data,5.5 广义表的存储结构,广义表的头尾链表存储表示 typedef enumATOM,LIST E

25、lemTag;typedef struct GLNodeElemTag tag;unionAtomType atom;struct struct GLNode *hp,*tp;ptr; ,5.5 广义表的存储结构,1) 表头、表尾分析法:,构造存储结构的两种分析方法:,若表头为原子,则为,空表 ls=NIL,非空表 ls,tag=1,指向表头的指针,指向表尾的指针,tag=0 data,否则,依次类推。,5.5 广义表的存储结构,5.5 广义表的存储结构,a,( x, y ),( ),1,L,L = ( ),0 a,1,1,1,1,1,0 a,( ),x,5.5 广义表的存储结构,子表分析法:,若子表为原子,则为,空表 ls=NIL,非空表,1,指向子表1的指针,tag=0 data,否则,依次类推。,1,指向子表2的指针,1,指向子表n的指针,ls,5.5 广义表的存储结构,例如:,a (x, y) (x),LS=( a, (x,y), (x) ),ls,5.5 广义表的存储结构,广义表的头尾链表存储表示 typedef enumATOM,LIST ElemTag;typedef struct GLNodeElemTag tag;unionAtomType atom;struct GLNode *hp;struct GLNode *tp; ,5.5 广义表的存储结构,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 统计图表

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报