数据结构描述电子教案精.ppt

上传人:石*** 文档编号:65056757 上传时间:2022-12-02 格式:PPT 页数:52 大小:2.53MB
返回 下载 相关 举报
数据结构描述电子教案精.ppt_第1页
第1页 / 共52页
数据结构描述电子教案精.ppt_第2页
第2页 / 共52页
点击查看更多>>
资源描述

《数据结构描述电子教案精.ppt》由会员分享,可在线阅读,更多相关《数据结构描述电子教案精.ppt(52页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、数据结构描述电子教案第1页,本讲稿共52页5.5广义表5.1多维数组5.2多维数组的存储结构多维数组的存储结构5.3特殊矩阵及其压缩存储5.4 稀疏矩阵稀疏矩阵退出目录第2页,本讲稿共52页5.1多维数组5.1.1多维数组的概念多维数组的概念 1一维数组一维数组一维数组可以看成是一个线性表或一个向量(第二章已经介绍),它在计算机内是存放在一块连续的存储单元中,适合于随机查找。这在第二章的线性表的顺序存储结构中已经介绍。2二维数组二维数组二维数组可以看成是向量的推广。第3页,本讲稿共52页例如,设A是一个有m行n列的二维数组,则A可以表示为:在此,可以将二维数组A看成是由m个行向量X0,X1,X

2、m1T组成,其中,Xi=(ai0,ai1,.,ain1),0im1;也可以将二维数组A看成是由n个列向量y0,y1,yn1组成,其中yi=(a0i,a1i,.,am1i),0in1。第4页,本讲稿共52页由此可知二维数组中的每一个元素最多可有二个直接前驱和两个直接后继(边界除外),故是一种典型的非线性结构。3多维数组多维数组同理,三维数组最多可有三个直接前驱和三个直接后继,三维以上数组可以作类似分析。因此,可以把三维以上的数组称为多维数组,多维数组可有多个直接前驱和多个直接后继,故多维数组是一种非线性结构。第5页,本讲稿共52页5.1.2 多维数组在计算机内的存放多维数组在计算机内的存放怎样将

3、多维数组中元素存入到计算机内存中呢?由于计算机内存结构是一维的(线性的),因此,用一维内存存放多维数组就必须按某种次序将数组元素排成一个线性序列,然后将这个线性序列顺序存放在存储器中5.2多维数组的存储结构多维数组的存储结构由于数组一般不作插入或删除操作,也就是说,一旦建立了数组,则结构中的数组元素个数和元素之间的关系就不再发生变动,即它们的逻辑结构就固定下来了,不再发生变化。因此,采用顺序存储结构表示数组是顺理成章的事了。本章中,仅重点讨论二维数组的存储,三维及三维以上的数组可以作类似分析。第6页,本讲稿共52页多维数组的顺序存储有两种形式:5.2.1 行优先顺序行优先顺序1存放规则行优先顺

4、序也称为低下标优先或左边下标优先于右边下标。具体实现时,按行号从小到大的顺序,先将第一行中元素全部存放好,再存放第二行元素,第三行元素,依次类推在BASIC语言、PASCAL语言、C/C+语言等高级语言程序设计中,都是按行优先顺序存放的。例如,对刚才的Amn二维数组,可用如下形式存放到内存:a00,a01,a0n1,a10,a11,.,a1n1,am10,am11,am1n1。即二维数组按行优先存放到内存后,变成了一个线性序列(线性表)。第7页,本讲稿共52页因此,可以得出多维数组按行优先存放到内存的规律:最左边下标变化最慢,最右边下标变化最快,右边下标变化一遍,与之相邻的左边下标才变化一次。

5、因此,在算法中,最左边下标可以看成是外循环,最右边下标可以看成是最内循环。2地址计算由于多维数组在内存中排列成一个线性序列,因此,若知道第一个元素的内存地址,如何求得其它元素的内存地址?我们可以将它们的地址排列看成是一个等差数列,假设每个元素占l个字节,元素aij的存储地址应为第一个元素的地址加上排在aij前面的元素所占用的单元数,而aij的前面有i行(0i1)共in个元素,而本行前面又有j个元素,故aij的前面一共有in+j个元素,设a00的内存地址为LOC(a00),则aij的内存地址按等差数列计算为LOC(aij)=LOC(a00)+(in+j)l。同理,三维数组 Amnp按 行 优 先

6、 存 放 的 地 址 计 算 公 式 为:LOC(aijk)=LOC(a000)+(inp+jp+k)l。第8页,本讲稿共52页5.2.2 列优先顺序列优先顺序1存放规则存放规则列优先顺序也称为高下标优先或右边下标优先于左边下标。具体实现时,按列号从小到大的顺序,先将第一列中元素全部存放好,再存放第二列元素,第三列元素,依次类推在FORTRAN语言程序设计中,数组是按列优先顺序存放的。例如,对前面提到的Amn二维数组,可以按如下的形式存放到内存:a00,a10,am10,a01,a11,am11,a0m1,a1m1,.,am1n1。即二维数组按列优先存放到内存后,也变成了一个线性序列(线性表)

7、。第9页,本讲稿共52页因此,可以得出多维数组按列优先存放到内存的规律:最右边下标变化最慢,最左边下标变化最快,左边下标变化一遍,与之相邻的右边下标才变化一次。因此,在算法中,最右边下标可以看成是外循环,最左边下标可以看成是最内循环。2地址计算同样与行优先存放类似,若知道第一个元素的内存地址,则同样可以求得按列优存放的某一元素aij的地址。对二维数组有:LOC(aij)=LOC(a00)+(jm+i)l对三维数组有:LOC(aijk)=LOC(a000)+(kmn+jm+i)l第10页,本讲稿共52页5.3特殊矩阵及其压缩存储 5.3.1 特殊矩阵特殊矩阵 若一个n阶方阵A中元素满足下列条件:

8、aij=aji其中0i,jn1,则称A为对称矩阵。例如,图51是一个3*3的对称矩阵。1对称矩阵第11页,本讲稿共52页2三角矩阵(1)上三角矩阵)上三角矩阵即矩阵上三角部分元素是随机的,而下三角部分元素全部相同(为某常数C)或全为0,具体形式见图52(a)。(2)下三角矩阵)下三角矩阵即矩阵的下三角部分元素是随机的,而上三角部分元素全部相同(为某常数C)或全为0,具体形式见图52(b)。第12页,本讲稿共52页3对角矩阵若矩阵中所有非零元素都集中在以主对角线为中心的带状区域中,区域外的值全为0,则称为对角矩阵。常见的有三对角矩阵、五对角矩阵、七对角矩阵等。例如,图53为77的三对角矩阵(即有

9、三条对角线上元素非0)。第13页,本讲稿共52页5.3.2 压缩存储压缩存储1对称矩阵若矩阵Ann是对称的,对称的两个元素可以共用一个存储单元,这样,原来n阶方阵需n2个存储单元,若采用压缩存储,仅需n(n+1)/2个存贮单元,将近节约一半存贮单元,这就是实现压缩的好处。但是,将n阶对称方阵存放到一个向量空间s0到s1中,我们怎样找到sk与aij的一一对称应关系呢?使我们在sk中直接找到aij。我们仅以行优先存放分两种方式讨论:第14页,本讲稿共52页(1)只存放下三角部分)只存放下三角部分由于对称矩阵关于主对角线对称,故我们只需存放主对角线及主对角线以下的元素。这时,a00存入s0,a10存

10、入s1,a11存入s2,具体参见图54。这时sk与aij的对应关系为:i(i+1)/2+j当ijk=j(j+1)/2+i当ij上面的对应关系读者很容易推出:当ij时,aij在下三角部分中,aij前面有i行,共有1+2+3+i个元素,而aij是第i行的第j个元素,即有k=1+2+3+i+j=i(i+1)/2+j;当ij时,交换i与j即可。故sk与aij的对应关系为:i*n+ji当ijk=j*n+ij当ij第17页,本讲稿共52页第18页,本讲稿共52页2三角矩阵(1)下三角矩阵)下三角矩阵下三角矩阵的压缩存放与对称矩阵用下三角形式存放类似,但必须多一个存储单元存放上三角部分元素,使用的存储单元数

11、目为n(n+1)/2+1。故可以将nn的下三角矩阵压缩存放到只有n(n+1)/2+1个存储单元的向量中,假设仍按行优先存放,这时sk与aij的对应关系为:i(i+1)/2+jijk=n(n+1)/2ij第20页,本讲稿共52页3对角矩阵对角矩阵我们仅讨论三对角矩阵的压缩存贮,五对角矩阵,七对角矩阵等读者可以作类似分析。在一个nn的三对角矩阵中,只有n+n1+n1个非零元素,故只需3n2个存储单元即可,零元已不占用存储单元。故可将nn三对角矩阵A压缩存放到只有3n2个存储单元的s向量中,假设仍按行优先顺序存放,则:sk与aij的对应关系为:3i1当i=j+1k=3i当i=j3i+1当i=j1第2

12、1页,本讲稿共52页5.4 稀疏矩阵稀疏矩阵在上节提到的特殊矩阵中,元素的分布呈现某种规律,故一定能找到一种合适的方法,将它们进行压缩存放。但是,在实际应用中,我们还经常会遇到一类矩阵:其矩阵阶数很大,非零元个数较少,零元很多,但非零元的排列没有一定规律,我们称这一类矩阵为稀疏矩阵。按照压缩存储的概念,要存放稀疏矩阵的元素,由于没有某种规律,除存放非零元的值外,还必须存贮适当的辅助信息,才能迅速确定一个非零元是矩阵中的哪一个位置上的元素。下面将介绍稀疏矩阵的几种存储方法及一些算法的实现。第22页,本讲稿共52页5.4.1稀疏矩阵的存储1三元组表三元组表在压缩存放稀疏矩阵的非零元同时,若还存放此

13、非零元所在的行号和列号,则称为三元组表法,即称稀疏矩阵可用三元组表进行压缩存储,但它是一种顺序存贮(按行优先顺序存放)。一个非零元有行号、列号、值,为一个三元组,整个稀疏矩阵中非零元的三元组合起来称为三元组表。第23页,本讲稿共52页此时,数据类型可描述如下:constintmaxsize=100;/定义非零元的最大数目structnode/定义一个三元组inti,j;/非零元行、列号intv;/非零元值;structsparmatrix/定义稀疏矩阵introws,cols;/稀疏矩阵行、列数intterms;/稀疏矩阵非零元个数nodedatamaxsize;/三元组表;第24页,本讲稿共

14、52页稀疏矩阵M和N的三元组表见图58。第25页,本讲稿共52页2带行指针的链表把具有相同行号的非零元用一个单链表连接起来,稀疏矩阵中的若干行组成若干个单链表,合起来称为带行指针的链表。例如,图56的稀疏矩阵M的带行指针的链表描述形式见图59。第26页,本讲稿共52页3十字链表当稀疏矩阵中非零元的位置或个数经常变动时,三元组就不适合于作稀疏矩阵的存储结构,此时,采用链表作为存储结构更为恰当。十字链表为稀疏矩阵中的链接存储中的一种较好的存储方法,在该方法中,每一个非零元用一个结点表示,结点中除了表示非零元所在的行、列和值的三元组(i,j,v)外,还需增加两个链域:行指针域(rptr),用来指向本

15、行中下一个非零元素;列指针域(cptr),用来指向本列中下一个非零元素。稀疏矩阵中同一行的非零元通过向右的rptr指针链接成一个带表头结点的循环链表。同一列的非零元也通过cptr指针链接成一个带表头结点的循链链表。因此,每个非零元既是第i行循环链表中的一个结点,又是第j列循环链表中的一个结点,相当于处在一个十字交叉路口,故称链表为十字链表。第27页,本讲稿共52页另外,为了运算方便,我们规定行、列循环链表的表头结点和表示非零元的结点一样,也定为五个域,且规定行、列、域值为0,并且将所有的行、列链表和头结点一起链成一个循环链表。在行(列)表头结点中,行、列域的值都为0,故两组表头结点可以共用,即

16、第i行链表和第i列链表共用一个表头结点,这些表头结点本身又可以通过V域(非零元值域,但在表头结点中为next,指向下一个表头结点)相链接。另外,再增加一个附加结点(由指针hm指示,行、列域分别为稀疏矩阵的行、列数目),附加结点指向第一个表头结点,则整个十字链表可由hm指针唯一确定。第28页,本讲稿共52页十字链表的数据类型描述如下:structlinknodeinti,j;linknode*cptr,*rptr;unionvnext/定义一个共用体intv;/表结点使用V域,表示非零元值linknode*next;/表头结点使用next域k;例如,图56的稀疏矩阵M的十字链表描述形式见图510

17、。第29页,本讲稿共52页第30页,本讲稿共52页5.4.2稀疏矩阵的运算1稀疏矩阵的转置运算转置是矩阵中最简单的一种运算。对于一个mn的矩阵A,它的转置B是一个nm的,且Bij=Aji,0in,0j0)intbno=0;for(intcol=0;cola.cols;col+)/按列号扫描for(intano=0;anoa.terms;ano+)/对三元组表扫描if(a.dataano.j=col)/进行转置b.databno.j=a.dataano.i;b.databno.i=a.dataano.j;b.databno.v=a.dataano.v;bno+;第33页,本讲稿共52页分析这个算

18、法,主要工作在col和ano二重循环上,故算法的时间复杂度为O(a.cols*a.terms)。而通常的mn阶矩阵转置算法可描述为:for(col=0;coln;col+)for(row=0;rowm;row+)bcolrow=arowcol;它的时间复杂度为o(mn)。而一般的稀疏矩阵中非零元个数a.terms远大于行数m,故压缩存贮时,进行转置运算,虽然节省了存贮单元,但增大了时间复杂度,故此算法仅适应于a.ternsa.rowsa.cols的情形。第34页,本讲稿共52页(2)按照)按照A的行序进行转置的行序进行转置即按a.data中三元组的次序进行转置,并将转置后的三元组放入b中恰当的

19、位置。若能在转置前求出矩阵A的每一列col(即B中每一行)的 第 一 个 非 零 元 转 置 后 在 b.data中 的 正 确 位 置potcol(0cola.cols),那么在对a.data的三元组依次作转置时,只要将三元组按列号col放置到b.datapotcol中,之后将potcol内容加1,以指示第col列的下一个非零元的正确位置。为了求得位置向量pot,只要先求出A的每一列中非零元个数numcol,然后利用下面公式:pot0=0potcol=potcol1+numcol1当1col0)for(col=0;cola.cols;col+)potcol=0;for(intt=0;ta.t

20、erms;t+)/求出每一列的非零元个数col=a.datat.j;potcol+1=potcol+1+;pot0=0;for(col=1;cola.cols;col+)/求出每一列的第一个非零元在转置后的位置potcol=potcol1+potcol;第36页,本讲稿共52页for(ano=0;anoatom=0)/有子表intdep=depth(LSslink);if(depmax)max=dep;LS=LSlink;returnmax+1;该算法的时间复杂度为O(n)。第48页,本讲稿共52页2.广义表的建立creat(LS)假设广义表以单链表的形式存储,广义表的元素类型elemtype

21、为字符型char,广义表由键盘输入,假定全部为字母,输入格式为:元素之间用逗号分隔,表元素的起止符号分别为左、右圆括号,空表在其圆括号内使用一个“#”字符表示,最后使用一个分号作为整个广义表的结束。例如,给定一个广义表如下:LS=(a,(),b,c(d,(e),则从键盘输入的数据为:(a,(#),b,c(d,(e);,其中表示回车换行。具体算法描述如下:第49页,本讲稿共52页voidcreat(node*LS)charch;cinch;if(ch=#)LS=NULL;elseif(ch=()LS=newnode;LSatom=0;creat(LSslink);elseLS=newnode;L

22、Satom=1;LSdata=ch;cinch;if(LS=NULL);elseif(ch=,)creat(LSlink);elseif(ch=)|(ch=;)LSlink=NULL;该算法的时间复杂度为O(n)。第50页,本讲稿共52页3.输出广义表print(LS)voidprint(node*LS)if(LSatom=0)coutslink=NULL)coutslink);elsecoutdata;if(LSatom=0)coutlink!=NULL)coutlink);该算法的时间复杂度为O(n)。第51页,本讲稿共52页4取表头运算head若广义表LS=(a1,a2,an),则head(LS)=a1。取表头运算得到的结果可以是原子,也可以是一个子表。例 如,head(a1,a2,a3,a4)=a1,head(a1,a2),(a3,a4),a5)=(a1,a2)。5取表尾运算取表尾运算tail若广义表LS=(a1,a2,an),则tail(LS)=(a2,a3,an)。即取表尾运算得到的结果是除表头以外的所有元素,取表尾运算得到的结果一定是一个子表。值得注意的是广义表()和()是不同的,前者为空表,长度为0,后者的长度为1,可得到表头、表尾均为空表,即head()=(),tail()=()。第52页,本讲稿共52页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com