收藏 分享(赏)

数据结构与算法3.ppt

上传人:Facebook 文档编号:3817445 上传时间:2018-11-19 格式:PPT 页数:30 大小:476KB
下载 相关 举报
数据结构与算法3.ppt_第1页
第1页 / 共30页
数据结构与算法3.ppt_第2页
第2页 / 共30页
数据结构与算法3.ppt_第3页
第3页 / 共30页
数据结构与算法3.ppt_第4页
第4页 / 共30页
数据结构与算法3.ppt_第5页
第5页 / 共30页
点击查看更多>>
资源描述

1、,数 据 结 构,(数据结构及其算法),冯耀霖,Chp 3 稀疏矩阵和广义表,稀疏矩阵 广义表,1 稀疏矩阵,稀疏矩阵的定义与ADT 稀疏矩阵ADT的C+实现 基本操作的算法,1.1 稀疏矩阵的定义与ADT,稀疏矩阵是0元素居多的矩阵,在科学和工程计算中有着十分重要的应用。如果一个矩阵中许多元素为0,则称该矩阵为稀疏(sparse)矩阵。假设m行n列的矩阵含t个非0元素,一般称 为稀疏因子,且认为0.05的矩阵为稀疏矩阵。,对于稀疏矩阵如采用一般矩阵的存储方法(二维数组)将存储大量0元素,造成大量存储空间的浪费。但是如果不存储0元素,只存储非0元素,这样一来,元素的存储次序就不再能够代表它们的

2、逻辑关系了。因此,必须显式地指出每个元素在原矩阵中的逻辑位置。一种直观、常用的方法是,只存储非0元素,且每个非0元素用一个三元组(行号,列号,元素值)来表示。,稀疏矩阵的ADT,ADT SparseMatrix isDataObjsct:D=aij | i=1,2,m; j=1,2, ,n; aijElemType, m和n分别为矩阵的行数和列数Relation:R=Row, ColRow= | 1im, 1jn-1Col= | 1im-1, 1jn,Operation:InitMatrix功能:初始化稀疏矩阵DestroyMatrix功能:销毁稀疏矩阵ClearElem功能:清除元素GetR

3、ows功能:返回稀疏矩阵的行数GetCols功能:返回稀疏矩阵的列数GetSize功能:返回稀疏矩阵的非0元素个数,SetElem功能:设置指定位置的元素值GetElem功能:返回指定位置的结点元素值Dest功能:矩阵转置Print功能:打印稀疏矩阵 End SparseMatrix,1.2 稀疏矩阵ADT的C+实现,通常以顺序存储结构来组织稀疏矩阵,template struxt Triple /三元组记录类型 int mi,mj; /矩阵的行下标和列下标ElemType e; /非0元素;,template class SparseMatrixprivete: Triple *sm; /三

4、元组顺序表int maxSize; /非0元素最大个数int rows, cols,size; /稀疏矩阵的行数、列数及非0元素个数(表长度)public:SparseMatrix(int m,int n,int t); SparseMatrix();,1.3 基本操作的算法,算法3.1 InitMatrix功能:初始化三元组顺序表,void InitMatrix(int m,int n, int t) /m、n为稀疏矩阵的行数和列数,t为非0元素个数sm=new Triplet ; /为三元组顺序表动态分配存储空间if(sm= =NULL)exit(OVERFLOW);rows=m;cols

5、=n;maxSize=t;size=0 ; ,算法3.2 SetElem 功能:设置指定位置的元素值,算法思路:对于设置指定位置(r,c)的元素值v,首先查找在三元组顺序表中是否有指定位置的三元组:(1)如果存在当v0时为更新操作,即将v赋值给原元素e;否则为删除操作,即删除该三元组。(2)如果不存在指定的三元组当v0时为按序插入操作;否则不作任何操作。,bool SetElem(int r, int c, ElemType v) if(rrows|ccols|r1|c1)return FALSE;for(k=1;k=size;k+)if(r=smk.mi,if(ksize ,稀疏矩阵其他的基

6、本操作的算法都比较简单,不再描述。,稀疏矩阵转置的算法,矩阵转置就是使i行j列元素与j行i列元素对换位置。如果矩阵是用二维数组表示的,则转置操作很简单。但对于用三元组顺序表表示的稀疏矩阵则其实现要复杂一些,因为在行列号互换后,还需调整元素位置,使其仍保持按行排列的顺序。其转置的具体步骤可以分为两步实现:(1)将每个非0元素对应的行号、列号互换。(2)对三元组顺序表重新排序,使其中的元素仍按行排列。转置操作可以设计成ADT的基本操作(类成员函数),也可以设计成非ADT的操作。,算法3.3 作为基本操作的转置算法,void Dest() Triple *temp;temp=new Triplesi

7、ze ; /生成临时三元组顺序表for(k=1 ;k=size ;k+) /复制tempk.mi=smk.mj;tempk.mj=smk.mi;tempk.e=smk.e ;tsize=size;size=0; /清除三元组顺序表,for(k=1;k=tsize;k+) /将临时表中的三元组逐个按序插入到三元组顺序表中SetElem(tempk.mi,tempk.mj,tempk.e);delete temp; /释放临时表 ,算法3.4 非基本操作的转置算法 实现该算法需要在SparseMatrix类中将该转置操作声明为友元。,bool Dest(SparseMatrix ,思考题,Prin

8、t操作(打印稀疏矩阵 )的算法:简单算法是只打印各三元组。考虑以矩阵形式打印整个稀疏矩阵。,2 广义表,广义表是线性表的推广, 也称为列表(lists)。,广义表的ADT定义,ADT GList is DataObject:D=ei | i=1,2, ,n ; n0; eiElemType或eiGlist Relation:R= | ei-1,eiD, 2in Operation:InitGList功能:初始化广义表DestroyGList功能:销毁广义表,CopyGList功能:复制广义表GlistLength功能:获取广义表的长度GlistDepth功能:获取广义表的深度GetHead功能

9、:获取广义表的表头GetTail功能:获取广义表的表尾InsertFirst功能:插入元素作为广义表的第一元素DeleteFirst功能:删除广义表的第一元素,Traverse功能:遍历广义表 End Glist,广义表一般记作GL = ( a1, a2, , an )其中,ai称之为广义表的直接元素,它可以是单个元素(原子),也可以是广义表(子表)。当广义表GL非空时,称第一个元素ai为表头(Head),其余元素合称为表尾(Tail)。显然这是个递归的定义。,广义表的例子:,A = ( ) A是一个空表,其长度为0B = ( e ) 列表B只有一个原子e,长度为1C = (a, (b, c,

10、 d) 列表C的长度为2,两个元素分别为原子a和子表(b, c, d )D = ( A, B, C ) 列表D的长度为3,三个元素都是子表。将子表的值代入后,则有D = ( ( ), ( e ), (a, (b, c, d)E = ( a, E ) 这是一个递归的广义表,长度为2。E相当于一个无限的列表(a, (a, (a, )广义表表达式中括号的最大嵌套层数称为广义表的深度。,广义表的性质:,(1)宏观线性性。对任何一个广义表,如不考虑元素的内部结构,则它的直接元素之间是线性关系,因此,可以将广义表看成是一个线性表。(2)元素分层性。广义表中的元素可以是另外一个广义表,即是一个子表,子表中的元素又可以是一个子表。因此,对广义表中的任一元素,都直属某个层次的子表,整个广义表是一个层次结构。(3)元素复合性。广义表中的元素可以是原子元素和子表元素。其中子表元素又可以由原子元素和子表元素根据广义表构成规则复合而成。所以,广义表的元素类型不统一。对于子表元素,在某一层上被当作子表元素,但就它本身的结构而言,也是一个广义表。,(4)元素递归性。广义表的任一元素又可以是一个广义表(其他广义表或其自身)。这种递归性使得广义表具有很强的表达能力。(5)元素共享性。在同一广义表中,任一元素都可以出现多次,同一元素的多次出现都代表的是同一个目标,可以认为它们是共享同一目标。,Its Over,

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

当前位置:首页 > 中等教育 > 小学课件

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


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

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

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