- 1、本文档共32页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第四章 数组和矩阵
第四章 数组和矩阵 ----蒋菲菲 数组的定义 从逻辑结构上看,数组可以看成是一般线性表的扩充。二维数组可以看成是“其数据元素是一维数组(线性表)”的线性表。以二维数组为例: 二维数组中的每个元素都受两个线性关系的约束即行关系和列关系,在每个关系中,每个元素aij都有且仅有一个直接前趋,都有且仅有一个直接后继。 数组的顺序存储和实现 实际上数组是一组有固定个数的元素的集合。也就是说,一旦定义了数组的维数和每一维的上下限,数组中元素的的个数就固定了。例如二维数组A34,它有3行,4列,即由12个元素组成。由于这个性质,使得对数组的操作不象对线性表的操作那样,不可以在表中任意一个合法的位置插入或删除一个元素 对于数组的操作一般只有两类: 1)? 获得特定位置的元素值; 2)? 修改特定位置的元素值。 对于数组A,一旦给定其维数n及各维长度bi(1≤i≤n),则该数组中元素的个数是固定的,不可以对数组做插入和删除操作,不涉及移动元素操作,因此对于数组而言,采用顺序存储法比较合适。 以二维数组Amn为例,假设每个元素只占一个存储单元,“以行为主”存放数组,下标从1开始,首元素a11的地址为Loc[1,1],求任意元素aij的地址。aij是排在第i,第j列,并且前面的第i-1行有n*(i-1)个元素,第i行第j个前面还有j-1个元素。由此得到如下地址计算公式: Loc[i,j]=Loc[1,1]+n×(i-1)+(j-1) 以列为主:Loc[i,j]=Loc[1,1]+m×(j-1)+(i-1) 例2:已知二维数组Am,m按行存储的元素地址公式是: Loc(aij)= Loc(a11)+[(i-1)*m+(j-1)]*K , 按列存储的公式是? Loc(aij)=Loc(a11)+[(j-1)*m+(i-1)]*K (尽管是方阵,但公式仍不同) 特殊矩阵的压缩存储 有些高阶矩阵中,非零元素非常少(远小于m×n),此时若仍采用二维数组顺序存放就不合适了,因为很多存储空间存储的都是0,只有很少的一些空间存放的是有效数据,这将造成存储单元很大的浪费。另外,还有一些矩阵其元素的分布有一定规律,我们可以利用这些规律,只存储部分元素,从而提高存储空间的利用率。上述矩阵叫做特殊矩阵。 为了节省空间,对这类矩阵进行压缩存储 压缩原则是:对有规律的元素和值相同的元素只分配一个存储空间,对于零元素不分配空间。 1、三角矩阵 三角矩阵大体分为三类 对于一个n阶矩阵A来说: 下三角矩阵:当ij时,有aij= C(典型C=0) 上三角矩阵:当 ij时,有aij=C(典型C=0) 对称矩阵:矩阵中的所有元素均满足aij=aji 下三角矩阵 下三角矩阵的压缩形式: 2、稀疏矩阵的压缩存储 对于稀疏矩阵的压缩存储,我们采取只存储非零元素的方法。但由于稀疏矩阵中非零元素aij的分布一般是没有规律的,因此,对于稀疏矩阵的压缩存储就要求在存储非零元素的同时,还必须存储一些辅助信息,即该非零元素在矩阵中所处的行号和列号。我们将这种存储方法叫做稀疏矩阵的三元组表示法 int transpose(smatrix a) /*a转置为b*/ { smatrix b; int cols,m,k,n=0; if(a.term==0)return(0); b.row=a.col; b.col=a.row; b.term=a.term; for(cols=0;colsa.col;cols++) /*按列号扫描*/ for(m=0;ma.term;m++) /*对三元组扫描*/ if(a.data[m].j==cols) /*进行转置*/ { b.data[n].i=a.data[m].j; b.data[n].j=a.data[m].i; b.data[n].e=a.data[m].e; n++; } printf(\n转置后的矩阵为:\n); for(k=0;ka.term;k++) printf(%5d%5d%5d\n,b.data[k].i,b.data[k].j,b.data[k].e);
文档评论(0)