数组和广义表教学.ppt
《数组和广义表教学.ppt》由会员分享,可在线阅读,更多相关《数组和广义表教学.ppt(83页珍藏版)》请在三一办公上搜索。
1、第五章 数组和广义表,数组可以看成是一种特殊的线性表,即线性表中数据元素本身也是一个线性表,第五章 数组和广义表,5.1 数组的定义,5.3 矩阵的压缩存储,5.2 数组的顺序表示和实现,5.4 广义表的定义,5.5 广义表的存储结构,5.6 m元多项式的表示,5.7 广义表的递归算法,第五章 数组和广义表,5.1 数组的定义,数组特点数组结构固定数据元素同构数组运算给定一组下标,存取相应的数据元素给定一组下标,修改数据元素的值,aj=(a0j,a1j,am-1j),ai=(ai0,ai1,ain-1),数组的定义,抽象数据类型数组的定义如下:,ADT List,数据对象:,数据关系:,数组的
2、定义,数组的定义,二维数组的定义:,数据对象:D=aij|0ib1-1,0 jb2-1数据关系:R=ROW,COL ROW=|0ib1-2,0jb2-1 COL=|0ib1-1,0 jb2-2,InitArray(&A,n,bound1,.,boundn),DestroyArray(&A),Value(A,&e,index1,.,indexn),Assign(&A,e,index1,.,indexn),基本操作:,数组的定义,=,m*,数组的定义,有两种顺序映象的方式:以行序为主序(低下标优先)以列序为主序(高下标优先),数组的顺序表示和实现,5.2 数组的顺序表示和实现 由于计算机的内存结构
3、是一维的,因此用一维内存来表示多维数组,就必须按某种次序将数组元素排成一列序列,然后将这个线性序列存放在存储器中。,Loc(aij)=Loc(a00)+i*n+j*l,按行序为主序存放,数组的顺序表示和实现,按列序为主序存放,Loc(aij)=Loc(a00)+j*m+i*l,数组的顺序表示和实现,4.3 矩阵的压缩存储,特殊矩阵 所谓特殊矩阵是指非零元素或零元素的分布有一定规律的矩阵,下面我们讨论几种特殊矩阵的压缩存储。,1、对称矩阵 在一个n阶方阵A中,若元素满足下述性质:aij=aji 0i,jn-1则称A为对称矩阵。,矩阵的压缩存储,元素总数为:,n(n+1)/2,将这些元素存放在一个
4、向量sa0.n(n+1)/2-1中,矩阵的压缩存储,aij和sak之间对应关系,ij 则ai j在下三角形中。ai j之前的i行(从第0行到第i-1行)一共有1+2+i=i(i+1)/2个元素,在第i行上,ai j之前恰有j个元素(即ai0,ai1,ai2,aij-1),因此有:k=i*(i+1)/2+j 0kn(n+1)/2,矩阵的压缩存储,ij 则aij是在上三角矩阵中。因为aij=aji,所以只要交换上述对应关系式中的i和j即可得到:k=j*(j+1)/2+i 0 kn(n+1)/2,矩阵的压缩存储,2、三角矩阵,以主对角线划分,三角矩阵有上三角和下三角两种。上三角矩阵,它的下三角(不包
5、括主对角线)中的元素均为常数。下三角矩阵正好相反,它的主对角线上方均为常数,如图所示。在大多数情况下,三角矩阵常数为零。,矩阵的压缩存储,三角矩阵中的重复元素c可共享一个存储空间,其余的元素正好有n(n+1)/2个,因此,三角矩阵可压缩存储到向量sa0.n(n+1)/2中,其中c存放在向量的最后一个分量中,,矩阵的压缩存储,3、3.对角矩阵 对角矩阵中,所有的非零元素集中在以主对角线为了中心的带状区域中,即除了主对角线和主对角线相邻两侧的若干条对角线上的元素之外,其余元素皆为零。,矩阵的压缩存储,一个k对角矩阵(k为奇数)A是满足下述条件的矩阵:若i-j(k-1)/2,则元素 aij=0。对角
6、矩阵可按行优先顺序或对角线的顺序,将其压缩存储到一个向量中,并且也能找到每个非零元素和向量下标的对应关系。,Loc(aij)=Loc(a11)+2(i-1)+(j-1),矩阵的压缩存储,假设 m 行 n 列的矩阵含 t 个非零元素,则称 为稀疏因子。通常认为 0.05 的矩阵为稀疏矩阵。,稀疏矩阵,矩阵的压缩存储,M由(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)唯一确定,定义:非零元较零元少,且分布没有一定规律的矩阵压缩存储原则:只存矩阵的行列维数和每个非零元的行列下标及其值,矩
7、阵的压缩存储,稀疏矩阵的压缩存储方法:,一、三元组顺序表,二、行逻辑联接的顺序表,三、十字链表,矩阵的压缩存储,三元组表所需存储单元个数为3(t+1)其中t为非零元个数,6 7 8,1 2 12,1 3 9,3 1-3,3 6 14,4 3 24,5 2 18,6 1 15,6 4-7,ma0.i,ma0.j,ma0.v分别存放矩阵行列维数和非零元个数,三元组顺序表,矩阵的压缩存储,#define MAXSIZE 12500 typedef struct int i,j;/该非零元的行下标和列下标 ElemType e;/该非零元的值 Triple;/三元组类型,typedef union T
8、riple dataMAXSIZE+1;int mu,nu,tu;TSMatrix;/稀疏矩阵类型,矩阵的压缩存储,求转置矩阵问题描述:已知一个稀疏矩阵的三元组表,求该矩阵转置矩阵的三元组表问题分析一般矩阵转置算法:,for(col=0;coln;col+)for(row=0;rowm;row+)ncolrow=mrowcol;T(n)=O(mn),矩阵的压缩存储,其时间复杂度为:O(munu),矩阵的压缩存储,解决思路:只要做到 将矩阵行、列维数互换 将每个三元组中的i和j相互调换 重排三元组次序,使mb中元素以N的行(M的列)为主序,方法一:按M的列序转置 即按mb中三元组次序依次在ma中
9、找到相应的三元组进行转置。为找到M中每一列所有非零元素,需对其三元组表ma从第一行起扫描一遍。由于ma中以M行序为主序,所以由此得到的恰是mb中应有的顺序,矩阵的压缩存储,算法分析:T(n)=O(M的列数n非零元个数t)若 t 与mn同数量级,则,矩阵的压缩存储,7 6 8,1 3-3,1 6 15,2 1 12,2 5 18,3 1 9,3 4 24,4 6-7,6 3 14,col=1,col=2,矩阵的压缩存储,方法二:快速转置 即按ma中三元组次序转置,转置结果放入b中恰当位置 此法关键是要预先确定M中每一列第一个非零元在mb中位置,为确定这些位置,转置前应先求得M的每一列中非零元个数
10、,实现:设两个数组numcol:表示矩阵M中第col列中非零元个数cpotcol:指示M中第col列第一个非零元在mb中位置显然有:,矩阵的压缩存储,1,3,5,7,8,8,9,Status FastTransposeSMatrix(TSMatrix M,TSMatrix&T)/FastTransposeSMatrix,矩阵的压缩存储,T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;if(T.tu)/if return OK;,for(col=1;col=M.nu;+col)numcol=0;for(t=1;t=M.tu;+t)+numM.datat.j;cpot1=1;for(c
11、ol=2;col=M.nu;+col)cpotcol=cpotcol-1+numcol-1;for(p=1;p=M.tu;+p),分析算法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),矩阵的压缩存储,7 6 8,1 3-3,1 6 15,2 1 12,2 5 18,3 1 9,3 4 24,4 6-7,6 3 14,4,6,2,9,7,5,3,矩阵的压缩存储,三元组顺序表又称有
12、序的双下标法,它的特点是,非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。然而,若需随机存取某一行中的非零元,则需从头开始进行查找。,行逻辑联接的顺序表,链式存储结构带行指针向量的单链表表示每行的非零元用一个单链表存放 设置一个行指针数组,指向本行第一个非零元结点;若本行无非零元,则指针为空表头结点与单链表结点类型定义,矩阵的压缩存储,#define MAXMN 500 typedef struct Triple dataMAXSIZE+1;int rposMAXMN+1;int mu,nu,tu;RLSMatrix;/行逻辑链接顺序表类型,需存储单元个数为3t+m,矩阵的压缩
13、存储,例如:给定一组下标,求矩阵的元素值,ElemType value(RLSMatrix M,int r,int c)p=M.rposr;while(M.datap.i=r/value,矩阵的压缩存储,矩阵乘法的精典算法:for(i=1;i=m1;+i)for(j=1;j=n2;+j)Qij=0;for(k=1;k=n1;+k)Qij+=Mik*Nkj;,其时间复杂度为:O(m1n2n1),矩阵的压缩存储,Q初始化;if Q是非零矩阵/逐行求积 for(arow=1;arow=M.mu;+arow)/处理M的每一行 ctemp=0;/累加器清零 计算Q中第arow行的积并存入ctemp 中;
14、将ctemp 中非零元压缩存储到Q.data;/for arow/if,两个稀疏矩阵相乘(QMN)的过程可大致描述如下:,矩阵的压缩存储,Status MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix&Q)/MultSMatrix,矩阵的压缩存储,if(M.nu!=N.mu)return ERROR;Q.mu=M.mu;Q.nu=N.nu;Q.tu=0;if(M.tu*N.tu!=0)/Q是非零矩阵 for(arow=1;arow=M.mu;+arow)/处理M的每一行/for arow/if return OK;,ctemp=0;/当前行各元素累加器
15、清零 Q.rposarow=Q.tu+1;for(p=M.rposarow;pM.rposarow+1;+p)/对当前行中每一个非零元/求得Q中第crow(=arow)行的非零元,处理 的每一行,M,矩阵的压缩存储,brow=M.datap.j;if(brow N.nu)t=N.rposbrow+1;else t=N.tu+1 for(q=N.rposbrow;q t;+q)ccol=N.dataq.j;/乘积元素在Q中列号 ctempccol+=M.datap.e*N.dataq.e;/for q,for(ccol=1;ccol MAXSIZE)return ERROR;Q.dataQ.tu
16、=arow,ccol,ctempccol;/if,矩阵的压缩存储,分析上述算法的时间复杂度,累加器ctemp初始化的时间复杂度为(M.muN.nu)求Q的所有非零元的时间复杂度为(M.tuN.tu/N.mu)进行压缩存储的时间复杂度为(M.muN.nu)总的时间复杂度就是(M.muN.nu+M.tuN.tu/N.mu)。,矩阵的压缩存储,若M是m行n列的稀疏矩阵,N是n行p列的稀疏矩阵,则M中非零元的个数 M.tu=Mmn N中非零元的个数 N.tu=Nnp 相乘算法的时间复杂度就是(mp(1+nMN)当M0.05 和N0.05及 n 1000时,相乘算法的时间复杂度就相当于(mp)。,矩阵的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数组 广义 教学

链接地址:https://www.31ppt.com/p-6297452.html