- 1、本文档共50页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章 多维数组与广义表
5.2.3 稀疏矩阵的压缩存储 顺序存储:三元组表 链式存储:十字链表 1.三元组表存稀疏矩阵 考虑: 只存非零元素 一个非零元素的必需信息有: (i, j, aij) 记录一个稀疏矩阵的必需信息有:行数M,列数N,非零元素个数T 1 2 0 0 5 0 3 0 0 0 0 4 0 0 0 0 0 6 0 0 0 0 0 8 0 i j Aij 0 0 1 0 1 2 0 4 5 1 1 3 2 1 4 3 2 6 4 3 8 M=5 N=5 T=7 三元组表的C语言描述 #define maxsize 10000 typedef int datatype; typedef struct{ /*三元组结点*/ int i,j; datatype v; }TriTupleNode; typedef struct{ TriTupleNode data[maxsize]; /*三元组表*/ int m,n,t;/*稀疏矩阵的行数,列数,非零元素个数*/ }TriTupleTable; i j V 2.带行指针的三元组表 把具有相同行号的非零元用一个单链表连接起来,稀疏矩阵中的若干行组成若干个单链表,合起来称为带行指针的链表。 0 2 9 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 4 0 0 24 0 0 0 0 18 0 0 0 0 15 0 0 -7 0 0 3.十字链表 i j Val/Next 列指针col 行指针row 5.2.4应用举例: 稀疏矩阵的转置 1.矩阵转置的数学解释 一个m×n的矩阵A,它的转置B是一个n×m的矩阵,且a[i][j]=b[j][i],0≦i≦m,0≦j≦n。 Aij=Bji 2.利用三元组表实现转置 1 2 0 0 3 0 0 4 0 0 0 6 i j Aij 0 0 1 0 1 2 1 1 3 2 1 4 3 2 6 M=4 N=2 T=5 1 0 0 0 2 3 4 0 0 0 0 6 i j Bij 0 0 1 0 1 2 1 1 3 2 1 4 3 2 6 M=2 N=4 T=5 Aij=Bji 思想一:直接交换a.data中i和j的内容 问题:b.data是一个按列优先顺序存储的稀疏矩阵B 解决方法:重新排列B中三元组的顺序。 0 2 5 0 3 0 0 4 0 0 0 6 i j Aij 0 1 2 0 2 5 1 1 3 2 1 4 3 2 6 M=4 N=2 T=5 0 0 0 0 2 3 4 0 5 0 0 6 i j Bij 1 0 2 2 0 5 1 1 3 1 2 4 2 3 6 Aij=Bji i j Bij 1 0 2 1 1 3 1 2 4 2 0 5 2 3 6 按i排序 M=2 N=4 T=5 b.m=a.n; b.n=a.m; b.t=a.t; /*基本信息的赋值*/ /*按交换i、j的方式给B的三元组赋值*/ for ( i=0; ib.t; i++ ) { b.data[i].i=a.data[i].j; b.data[i].j=a.data[i].i; b.data[i].v=a.data[i].v;} /*扫描B,按i排序*/ i j Aij 0 1 2 0 2 5 1 1 3 2 1 4 3 2 6 M=4 N=2 T=5 i j Bij 1 0 2 2 0 5 1 1 3 1 2 4 2 3 6 i j Bij 1 0 2 1 1 3 1 2 4 2 0 5 2 3 6 按i排序 M=2 N=4 T=5 思想二:在A中按列序找三元组,写入B B的行优先即A的列优先 对A的第col列 ,扫描三元组表a.data,找出所有列号等于col的三元组,将它们的行号和列号互换后依次放入b.data中,即可得到B的按行优先的压缩存储表示。 0 2 5 0 3 0 0 4 0 0 0 6 i j Aij 0 1 2 0 2 5 1 1 3 2 1 4 3 2 6 M=4 N=2 T=5 0 0 0 0 2 3 4 0 5 0 0 6 Aij=Bji i j Bij 1 0 2 1 1 3 1 2 4 2 0 5 2 3 6 M=2 N=4 T=5 col=0,没有匹配的三元组 col=1,找到2,3,4 col=2,找到5,6 Void transmatrix(tripletable a,tripletable b) { int pa, pb, col; b.m=a.n; b.n=a.m; b.t=a.t;
文档评论(0)