- 1、本文档共32页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数组抽象数据类型 数据集合: 数组的数据集合可以表示为a0,a1,…an-1,每个数据元素的数据类型为抽象数据类型DataType. 操作集合: 求元素个数 存数组元素 取数组元素 在行(列)表头结点中,行、列域的值都为0,故两组表头结点可以共用,即第i行链表和第i列链表共用一个表头结点,这些表头结点本身又可以通过V域(非零元值域,但在表头结点中为next,指向下一个表头结点)相链接。另外,再增加一个附加结点(由指针hm指示,行、列域分别为稀疏矩阵的行、列数目),附加结点指向第一个表头结点,则整个十字链表可由hm指针惟一确定。 第一步,建立表头的循环链表: 依次输入矩阵的行、列数和非零元素个数:m,n和t。由于行、列链表共享一组表头结点,因此,表头结点的个数应该是矩阵中行、列数中较大的一个。假设用s 表示个数,即s=max(m,n)。依次建立总表头结点(由hm指针指向)和s个行、列表头结点,并使用next域使s+1个头结点组成一个循环链表,总表头结点的行、列域分别为稀疏矩阵的行、列数目,s个表头结点的行列域分别为0。并且开始时,每一个行、列链表均是一个空的循环链表,即s个行、列表头结点中的行、列指针域rptr和cptr均指向头结点本身。 第二步,生成表中结点: 依次输入t个非零元素的三元组(i,j,v),生成一个结点,并将它插入到第i行链表和第j列链表中的正确位置上,使第i个行链表和第j个列链表变成一个非空的循环链表。 在十字链表的建立算法中,建表头结点,时间复杂度为O(s),插入t个非零元结点到相应的行、列链表的时间复杂度为O(t*s),故算法的总的时间复杂度为O(t*s)。 于是整个运算过程可以从矩阵的第一行起逐行进行。对每一行都从行表头出发分别找到A和B在该行中的第一个非零元结点后开始比较,然后按上述四种不同情况分别处理之。若pa和pb分别指向A和B的十字链表中行值相同的两个结点, 则4种情况描述为: 1)pa-j=pb-j 且pa-k.v+pb-k.v≠0,则只要将aij+bij的值送到pa所指结点的值域中即可,其他所有域的值都不变化。 2)pa-j=pb-j且pa-k.v+pb-k.v=0,则需要在A矩阵的链表中删除pa所指的结点。这时,需改变同一行中前一结点的rptr域值,以及同一列中前一结点的cptr域值。 3)pa-jpb-j且pa-j≠0,则只要将pa指针往右推进一步,并重新加以比较即可。 4)pa-jpb-j或 pa-j=0,则需在A矩阵的链表中插入pb所指结点。 (2)用十字链表实现稀疏矩阵相加运算 假设原来有两个稀疏矩阵A和B,如何实现运算A=A+B呢?假设原来A和B都用十字链表作存储结构,现要求将B中结点合并到A中,合并后的结果有三种可能: 1)aij+bij; 2)aij(bij=0); 3)bij(aij=0)。 将B加到A中去时,对A矩阵的十字链表来说 1)改变结点的v域值(aij+bij≠0), 2)不变(bij=0), 3)插入一个新结点(aij=0), 4)删除一个结点(aij+bij=0)。 * * 本章的主要内容: 1、数组 2、动态数组 3、特殊矩阵的压缩存储 4、稀疏矩阵的压缩存储 本章的重点:数组的基本操作和应用。 本章的难点:用数组实现特殊矩阵极其相关 运算。 4.1 数组 数组的定义 数组是大家都已经很熟悉的一种数据类型,几乎所有高级语言程序设计中都设定了数组类型。在此,我们仅简单地讨论数组的逻辑结构及在计算机内的存储方式。 数组:是n(n1)个相同数据类型的数据元素构成的占用一块连续的内存单元的有限序列. 一维数组:可以看成是一个线性表或一个向量,它在计算机内是存放在一块连续的存储单元中,适合于随机查找。 二维数组:可以看成是向量的推广。例如,设A是一个有m行n列的二维数组,则A可以表示为: 在此,可以将二维数组A看成是由m个行向量[X0,X1, …,Xm-1]T组成,其中,Xi=( ai0, ai1, ….,ain-1), 0≤i≤m-1;也可以将二维数组A看成是由n个列向量[y0, y1, ……,yn-1]组成,其中 yi=(a0i, a1i, …..,am-1i),0≤i≤n-1。由此可知二维数组中的每一个元素最多可有两个直接前驱和两个直接后继(边界除外),故是一种典型的非线性结构。 二维数组在计算机内的存放 怎样将多维数组中元素存入到计算机内存中呢?由于计算机内存结构是一维的(线性的),因此,用一维内存存放多维数组就必须按某种次序将数组元素排成一个线性序列,然后将这个线性序列顺序存放在存储器中,具体实现方法在下一节介绍。 1.存放规则 行优先顺
您可能关注的文档
- 第3章杀虫剂.ppt
- 有机磷文稿.doc
- 有机磷有机氮及氨基甲酸酯类农药残留.doc
- 有机磷杀虫药中毒AOPP.ppt
- 第2章网页图形图像设计.ppt
- 第3章植物的激素调节一轮复习.ppt
- 有机磷药物的中毒及解救.ppt
- 有机磷酯类中毒.ppt
- 第3章房地产项目主题定位.ppt
- 第3章第2节《自然地理环境的整体性》1.ppt
- CNAS-CL63-2017 司法鉴定-法庭科学机构能力认可准则在声像资料鉴定领域的应用说明.docx
- 12J7-3 河北《内装修-吊顶》.docx
- 12N2 河北省12系列建筑标准设计图集 燃气(油)供热锅炉房工程.docx
- 内蒙古 12S8 排水工程 DBJ03-22-2014.docx
- 山西省 12S10 12系列建筑标准设计 管道支架、吊架.docx
- 16J601-木门窗标准图集.docx
- 12J8 河北省12系列《 楼梯》.docx
- CNAS-GL37 2015 校准和测量能力(CMC)表示指南.docx
- CNAS-RL02-2016 能力验证规则.docx
- 津02SJ601 PVC塑料门窗标准.docx
文档评论(0)