数据结构 第5章 数组_第1页
数据结构 第5章 数组_第2页
数据结构 第5章 数组_第3页
数据结构 第5章 数组_第4页
数据结构 第5章 数组_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章数组,5.1数组的定义5.2数组的顺序表示和实现5.3矩阵的压缩存储5.3.1特殊矩阵5.3.2稀疏矩阵,数组和广义表可看成是一种特殊的线性表,其特殊在于,表中所在的元素本身也是一种线性表。5.1数组的定义数组是我们最熟悉的数据类型,在早期的高级语言中,数组是唯一可供使用的数据类型。由于数组中各元素具有统一的类型,并且数组元素的下标一般具有固定的上界和下界,因此,数组的处理比其它复杂的结构更为简单。例如,二维数组:a11a12a1na21a22a2nam1am2amn,Amn=,可以看成是由若干个行向量组成的向量,也可以看成是若干个列向量组成的向量。在Pascal语言中,一个二维数组类型可以定义为其分量类型为一维数组类型的一维数组类型,也就是说,typematrix=array1.m,1.nofdatatype;等价于:typematrix=array1.mofarray1.nofdatatype;同理,一个维数组类型可以定义为其数据元素为多维数组类型的一维数组类型。数组一旦被定义,它的维数和维界就不再改变。因此,除了结构的初始化和销毁之外,数组只有存取元素和修改元素值的操作。,5.2数组的顺序表示和实现由于计算机的内存结构是一维的,因此用一维内存来表示多维数组,就必须按某种次序将数组元素排成一列序列,然后将这个线性序列存放在存储器中。又由于对数组一般不做插入和删除操作,也就是说,数组一旦建立,结构中的元素个数和元素间的关系就不再发生变化。因此,一般都是采用顺序存储的方法来表示数组。,通常有两种顺序存储方式:行优先顺序将数组元素按行排列,第i+1个行向量紧接在第i个行向量后面。以二维数组为例,按行优先顺序存储的线性序列为:a11,a12,a1n,a21,a22,a2n,am1,am2,amn在PASCAL、C语言中,数组就是按行优先顺序存储的。列优先顺序将数组元素按列向量排列,第j+1个列向量紧接在第j个列向量之后,A的m*n个元素按列优先顺序存储的线性序列为:a11,a21,am1,a12,a22,am2,an1,an2,anm在FORTRAN语言中,数组就是按列优先顺序存储的。,按上述两种方式顺序存储的数组,只要知道开始结点的存放地址(即基地址)、维数和每维的上、下界,以及每个数组元素所占用的单元数,就可以将数组元素的存放地址表示为其下标的线性函数。因此,数组中的任一元素可以在相同的时间内存取,即顺序存储的数组是一个随机存取结构。例如,二维数组Amn按“行优先顺序”存储在内存中,假设每个元素占用d个存储单元。元素aij的存储地址应是数组的基地址加上排在aij前面的元素所占用的单元数。因为aij位于第i行、第j列,前面i-1行一共有(i-1)n个元素,第i行上aij前面又有j-1个元素,故它前面一共有(i-1)n+j-1个元素,因此,aij的地址计算函数为:LOC(aij)=LOC(a11)+(i-1)*n+j-1*d上述讨论均是假设数组各维的下界是1,更一般的二维数组是Ac1.d1,c2.d2,这里c1,c2不一定是1。aij前一共有i-c1行,二维数组一共有d2-c2+1列,故这i-c1行共有(i-c1)*(d2-c2+1)个元素,第i行上aij前一共有j-c2个元素,因此,aij的地址计算函数为:LOC(aij)=LOC(ac1c2)+(i-c1)*(d2-c2+1)+j-c2)*d,5.3矩阵的压缩存储在科学与工程计算问题中,矩阵是一种常用的数学对象,在高级语言编制程序时,简单而又自然的方法,就是将一个矩阵描述为一个二维数组。矩阵在这种存储表示之下,可以对其元素进行随机存取,各种矩阵运算也非常简单,并且存储的密度为1。但是在矩阵中非零元素呈某种规律分布或者矩阵中出现大量的零元素的情况下,看起来存储密度仍为1,但实际上占用了许多单元去存储重复的非零元素或零元素,这对高阶矩阵会造成极大的浪费,为了节省存储空间,我们可以对这类矩阵进行压缩存储:即为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。,5.3.1特殊矩阵一、对称矩阵在一个n阶方阵A中,若元素满足下述性质:aij=aji,1i,jn,则称A为对称矩阵。对称矩阵中的元素关于主对角线对称,故只要存储矩阵中上三角或下三角中的元素,让每两个对称的元素共享一个存储空间,这样,能节约近一半的存储空间。不失一般性,我们按“行优先顺序”存储主对角线(包括对角线)以下的元素在这个下三角矩阵中,第i行恰有i个元素,元素总数为:n(n+1)/2.若ij,则aij在下三角形中。aij之前的i-1行(从第1行到第i-1行)一共有1+2+i-1=i(i-1)/2个元素,在第i行上,aij之前恰有j-1个元素(即ai1,ai2,aij-1),因此有:k=i*(i-1)/2+j1kn(n+1)/2若i1时,元素aij=0。,5.3.2稀疏矩阵一、什么是稀疏矩阵?简单说,设矩阵A中有s个非零元素,若s远远小于矩阵元素的总数(即smn),则称A为稀疏矩阵。精确地说,设在的矩阵A中,有s个非零元素。令e=s/(m*n),称e为矩阵的稀疏因子。通常认为e0.05时称之为稀疏矩阵。在存储稀疏矩阵时,为了节省存储单元,很自然地想到使用压缩存储方法。但由于非零元素的分布一般是没有规律的,因此在存储非零元素的同时,还必须同时记下它所在的行和列的位置(i,j)。,一个三元组(i,j,aij)唯一确定了矩阵A的一个非零元素。因此,稀疏矩阵可由表示非零元素的三元组及其行列数唯一确定。,M由(0,1,12),(0,2,9),(2,0,-3),(2,5,14),(3,2,24),(4,1,18),(5,0,15),(5,3,-7)和矩阵维数(6,7)唯一确定,二、稀疏矩阵的存储1三元组表假设以顺序存储结构来表示三元组的线性表,则可得到稀疏矩阵的一种压缩存储方法三元组表。,下面给出稀疏矩阵的三元组表存储表示的定义:#definemaxsize256/*最大非零元素个数*/typedefstruct/*三元组类型*/inti,j;/*该非零元素的行下标和列下标*/datatypev;triple;typedefstruct/*三元组表类型*/tripledatamaxsize+1;/*三元组表存储空间*/intmu,nu,tu;/*矩阵的行数,列数和非零元素个数*/Tsmatrix;其中data域中的非零元素的三元组是以行序为主序排列的。,三元组表所需存储单元个数为3(t+1)其中t为非零元个数,678,0112,029,20-3,2514,3224,4118,5015,53-7,ma,ijv,012345678,ma0.i,ma0.j,ma0.v分别存放矩阵行列维数和非零元个数,算法4.6首先我们来建立一个三元组表:voidcreatsmatrix(datatypeA1,Tsmatrix*A)/*A1为m行n列的稀疏矩阵,A为产生的相对的三元组表*/k=1;for(row=0;rowm;row+)/*按行优先顺序扫描A1中的元素,不为0者存入A中*/for(col=0;coln;col+)if(A1rowcol!=0)A.datak.i=row;A.datak.j=col;A.datak.v=A1rowcol;k+;A.mu=m;A.nu=n;A.tu=k-1;/*存入A中A1的行数,列数,非零元个数*/,2.有关操作矩阵的转置一个mn的矩阵A,它的转置B是一个nm的矩阵,那么aij=bji,0im-1,0jn-1,即A的行是B的列,A的列是B的行。将A转置为B,就是将A的三元组表a.data置换为表B的三元组表b.data,假设A是按行优先顺序存储,如果只是简单地交换a.data中i和j的内容,那么得到的b.data将是一个按列优先顺序存储的稀疏矩阵B,要得到按行优先顺序存储的b.data,就必须重新排列三元组的顺序。由于A的列是B的行,因此,按a.data的列序转置,所得到的转置矩阵B的三元组表b.data必定是按行优先存放的。,解决思路:将矩阵行、列维数互换将每个三元组中的i和j相互调换重排三元组次序,使B中元素以N的行(M的列)为主序方法一:按M的列序转置即按mb中三元组次序依次在ma中找到相应的三元组进行转置。为找到M中每一列所有非零元素,需对其三元组表ma从第一行起扫描一遍。由于ma中以行序为主序,所以由此得到的恰是mb中应有的顺序。,678,0112,029,20-3,2514,3224,4118,5015,53-7,ijv,012345678,ma,768,02-3,0515,1012,1418,209,2324,35-7,5214,ijv,012345678,mb,col=0,col=1,算法描述如下:intTransposesMatrix(TsmatrixA,TsmatrixB)B.mu=A.nu;B.nu=A.mu;B.tu=A.tu;if(B.tu)q=1;for(col=0;colA.tu;col+)/*扫描A的所有列*/for(p=1;p=A.tu;+p)/*扫描所有非零元*/if(A.datap.j=col)B.dataq.j=A.datap.i;B.dataq.i=A.datap.j;B.dataq.v=A.datap.v;+q;return1;,方法二:快速转置即按ma中三元组次序转置,转置结果放入b中恰当位置,此法关键是要预先确定M中每一列第一个非零元在mb中位置,为确定这些位置,转置前应先求得M的每一列中非零元个数。,实现:设两个数组numcol:表示矩阵M中第col列中非零元个数poscol:指示M中第col列第一个非零元在mb中位置显然有:,1,3,5,7,8,9,8,678,0112,029,20-3,2514,3224,4118,5015,53-7,ijv,012345678,ma,ijv,012345678,mb,768,02-3,0515,1012,1418,209,2324,35-7,5214,4,6,2,9,7,5,3,具体此算法如下:intTransmatrix(TsmatrixA,TsmatrixB)intnumA.nu;B.mu=A.nu;B.nu=A.mu;B.tu=A.tu;if(A.tu)for(col=0;colA.nu;col+)numcol=0;for(t=1;t=A.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论