- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如果稀疏矩阵A?m ? n用行三元组表A表示,问题会变得相对复杂一些。对A实施转置运算后,其转置矩阵应仍采用行三元组表表示。图4-14(b)是图4-12的稀疏矩阵A的转置矩阵B的行三元组表。因三元组表用一维数组表示,所以,我们分别称它们为数组A和数组B。下面是实现矩阵转置的几种可能的做法: 方法一:将数组A的元素的行、列号交换后保存到数组B中(见图4-14(a)),然后对数组B按行号进行排序,便得到A的转置矩阵B的行三元组表(见图4-14(b))。这里,矩阵转置的时间取决于排序的时间。典型的排序算法的时间复杂度为O(t2)或O(t?lb?t),t为非零元素的个数(详见第11章内容)。 图4-14 稀疏矩阵的转置:方法一 (a) 交换图4-12(b)三元组表A的行、列号;(b) A的转置矩阵的行三元组表B 方法二:对数组A扫描n遍,第一遍取出矩阵A的第0列元素,得到转置矩阵B的第0行元素,第i遍扫描取出A的第i-1列元素,得到B的第i-1行元素,依此存入数组B中。此方法的时间复杂度为O(n*t)。t为非零元素的个数。 以上两种方法都比较费时,下面介绍被称为快速转置的方法三。 方法三:快速转置算法。 快速转置算法通过增加适量的存储空间,达到节省时间的目的。 快速转置算法使用n个指针k[n] (n是矩阵的列数),指向矩阵A中每一列的第一个非零元素在数组B中的存放位置。如k[2]为矩阵A的第2列第一个非零元素在数组B中的下标,这也就是转置矩阵B的第2行第一个非零元素在B中的下标,即为3,见图4-14(b)。 为了得到数组k,我们需要用另一个数组num保存矩阵A的各列的非零元素个数,例如,num[i]存放A的第i列的非零元素的个数,即转置矩阵B的第i行的非零元素个数。 数组num的值由下列语句求得: for (i=0; icols; i++) num[i]=0; /* 初始化数组num*/ for (i=0; inonzeros; i++) num[a.Elements[i].Col]++; 如果数组num的值已计算出,则数组k可以简单地由以下的递推公式计算: (1≤i<n) 其中,k[0]=0,代表B的第0行的第一个非零元素始终存放在下标为0的位置。很显然,B中第1行第一个非零元素在B中的位置等于k[0]+num[0]。 一般地,有k[i]=k[i-1]+num[i-1]。见下列语句: k[0]=0; for (i=1; icols; i++) k[i]=k[i-1]+num[i-1]; 对图4-12(b)的三元组表A,计算num和k的结果见图4-15。 图4-15 数组num和k (2) 若 p-Element.Expq-Element.Exp,则此时需复制*p得到新结点*r,并将其插在*q之前,令指针q1指向新结点,指针q不动,而指针p需后移一项。 (3) 若 p-Element.Expq-Element.Exp,则此时需将q指示的当前项保留在结果多项式中,所以令指针q1和q后移一项,指针p不动。 程序4-10为多项式相加函数PolyAdd的实现,该函数调用函数exp_comp实现两个项的指数间的比较。值得注意的是,算法在多项式A处理完成时结束,即当p-Element.Exp 0 成立时终止外层while循环,如果此时多项式*B中还有未处理的项,则自动保留在结果多项式*B中。 【程序4-10】 函数PolyAdd。 int exp_comp(T x, T y) { if (x.Exp==y.Exp) return 0; else if (x.Expy.Exp) return 1; else return -1; } void PolyAdd (Polynomial A, Polynomial *B) { Node* q, *q1, *q2, *p; T x; p=A.First-Link; q1=B-First; q=q1-Link; while (p-Element.Exp=0) { switch(exp_comp(p-Element, q-Element)){ case -1: q1=q; q=q-Link; break; case 0: q-Elem
文档评论(0)