关于稀疏矩阵的快速转置法,首先得明白其是通过对三元表进行转置。如果误以为是对矩阵进行转置,毫无疑问就算你想破脑袋也想不出个所以然,别陷入死胡同了!

对于一个三元表,行为i,列为j,值为v。需将其i与j的值对调才能得到新的三元表,但是如果直接进行转换,得到的新的三元表的顺序是混乱的,不符合三元表的规则。所以,课本首先介绍了一个用扫描来转置的算法(这个算法比较容易,在这里我就不说了),但是这个转置算法的时间复杂度太高,于是就有了接下来的快速转置算法。

要你对一个三元表进行步骤最少的转置,你可能会想,如果知道三元表中每一项在转置后的新的三元表中的位置,然后直接放进去,岂不是极大的缩小了时间复杂度?没错!快速转置法正是基于这种思想而设计的。

那么如何知道三元表中某一项的位置呢?在课本98页的a.data这个三元表可以看到,j为列号,在转置后即为新的三元表的行号,三元表正是按照行序进行排列的,而j=1有2个、j=2有2个、j=3有2个、j=4有1个、j=6有1个。根据这些数据按照从小到大排列,j=1的项在新的三元表中应占据第1、2位,j=2的项在新的三元表中应占据第3、4位,j=3的项在新的三元表中应占据第5、6位,j=4应占据第7位,j=6应占据第8位。

接下来就轻松多了,转置的时候直接从第一项读起,读取其j值,比如课本中a.data这个三元表的第一项的j值为2,因为j=2占据第3、4位,所以应该从第三位开始放,接下来如果读取的某一项的j值也是2,就放在第4位。因为j=2的项只有两个,所以第5位绝对不会被j=2的项占据,第5、6项本来就是留给j=3的。再比如当读到j=6的那项时,第8位是留给它的,就可以直接放进第8位了。这样,读取每一项,都能在三元表中找到相应的位置,这就是稀疏矩阵快速转置的原理。

当然,上面只是快速转置的原理,要实现它,就要设计算法来实现了。首先,我们需要两个变量。第一个num[col]用于记录原三元表中列数为col的项的数目,例如col=3时,num[col]=2;第二个cpot[col]用于记录原三元表中列数为col的项在新三元表中的首位置,例如col=3时,cpot[col]=5。你可以打开书本第99页,我想你现在应该是能看懂表5.1了吧。

接下来说一说快速转置算法的具体事项,在课本的100页代码如下:

逐句解释:

①  此函数名为FastTransposeSMatrix,形参有原三元表TSMatrix M,作用是传入三元表;三元表TSMatrix &T,采用引用以返回一个三元表。

②  三元表T可能没有初始化,这句的意思是将矩阵M的行数,列数,以及非零元个数传给矩阵T,使其初始化。

③  T.tu为真时,即矩阵M中至少存在一个非零元。

④  初始化数组num

⑤  书中的注释是求M中每一列含非零元的个数。具体来说,当原三元表M中某两项或多项的j值相同时,M.data[t].j的值是相等的,因此这个循环完成后,比如说num[3]的值就是原三元表M列数为3的个数。

⑥  书中的注释标错位置了,应该是第一个for循环的后面。Cpot[1]=1的用处是第一列的在新三元表T的第一个插入位置为1。Cpot[0]是留给储存三元表行列数和非零元个数的。

⑦  这句话是用来求除第一列外其它每一列的第一个非零元在新三元表T中的位置。第col列第一个非零元的位置为第col-1列第一个非零元的位置加上第col-1列非零元的个数,这是个非常简单的数学问题,没必要多说了。

⑧  M.tu的值是原三元表M的非零元个数,这个循环是用来遍历原三元表M的每一项。

⑨  Col=M.data[p].j的作用是得到循环当前项p的列数值j,赋给col,cpot[col]的值即为第col列的第一个插入位置,如果你问为什么,请看第七句。q=cpot[col]作用是用q来记录当前第col列的插入位置(当然你也可以不用这个赋值,只需把接下来出现的q都改为cpot[col]就行)。

⑩  将原三元表M的当前第p项的i,j值进行交换后给新三元表T的第q项,这样第p项就转置后正确的插入到新三元表的正确位置。

⑪   将当前原三元表的第 p 项的非零元的值给新三元表的第 p 项。后一句 ++cpot[col] 这个自增语句是使列数位 col 的项在新三元表的插入位置移动一位,下次再碰到列数位 col 的列时,插入位置即为此次插入位置的下一个。

如果有说错的地方麻烦指正
如果有转载的想法,不甚荣幸,但请注明出处,打字好累的T T ,尊重下吧。

【LB】稀疏矩阵的快速转置原理及其算法相关推荐

  1. java三元组的快速转置_稀疏矩阵三元组快速转置(转poklau123写的很清楚)

    关于稀疏矩阵的快速转置法,首先得明白其是通过对三元表进行转置.如果误以为是对矩阵进行转置,毫无疑问就算你想破脑袋也想不出个所以然,别陷入死胡同了! 对于一个三元表,行为i,列为j,值为v.需将其i与j ...

  2. 用三元组存储稀疏矩阵及其快速转置

    用三元组存储稀疏矩阵及其快速转置 稀疏矩阵的三元组存储方式 快速转置算法 代码 稀疏矩阵的三元组存储方式 稀疏矩阵可以用一个三元组数组表示,数组每个元素是一个三元组,三元组形式为 (矩阵行号,矩阵列号 ...

  3. 稀疏矩阵转置 java代码_三元组稀疏矩阵的快速转置

    小问题却整了这么久,能力有待加强,要强烈区分三元组的列数与元素总数, 不能将他俩写混了 #include #define MAXSIZE 1250 #define OK 1 #define ERROR ...

  4. 稀疏矩阵的快速转置(C语言版)

    #include <stdio.h> #include <stdlib.h> #define MAX 100 typedef struct node{     int i,j, ...

  5. 十四、矩阵的快速转置算法

    十四.矩阵的快速转置算法 文章目录 十四.矩阵的快速转置算法 题目描述 解题思路 上机代码 题目描述 数据压缩是提高传输.存储效率一种技术.教材第5章介绍了两种简单的压缩存储方法.本实验要求实现三元组 ...

  6. 13.矩阵的快速转置算法

    问题 描述 数据压缩是提高传输.存储效率一种技术.教材第5章介绍了两种简单的压缩存储方法.本实验要求实现三元组顺序表表示下的矩阵快速转置算法. 输入 稀疏矩阵的行数.列数.非零元个数(三个数都大于0) ...

  7. 5.3矩阵的压缩存储(稀疏矩阵转置和快速转置)

    在矩阵中有许多值相同的元素或者是零元素.有时为了节省存储空间,可以对这类矩阵进行压缩存储.所谓的压缩存储是指:为多个值相同的元值分配一个存储空间:对零元不分配空间. 5.32稀疏矩阵 在m*n的矩阵中 ...

  8. c语言三元组稀疏矩阵的转置实验报告,稀疏矩阵快速转置 数据结构实验报告

    南昌航空大学实验报告 课程名称: 数据结构 实验名称: 实验五 稀疏矩阵的存储和快速转置 班 级: 学生姓名: 学号: 指导教师评定: 签 名: 题目:假设稀疏矩阵A采用三元组表表示,编写程序实现该矩 ...

  9. 稀疏矩阵的转置(矩阵转置和快速转置)

    实现矩阵的转置: 1.将矩阵的行列值相互转换. 2.将每个三元组中的i和j交换. 3.重排三元组之间的次序便可实现矩阵的转置. void TransposeSMatrix(TSMatrix M, TS ...

最新文章

  1. 使用Composer安装Laravel步骤
  2. 算法—详细讲解双向链表的实现(python)
  3. 内存泄露、内存溢出以及解决方法
  4. rfm模型分析与客户细分_如何使用基于RFM的细分来确定最佳客户
  5. 论文浅尝 | 通过多原型实体指称向量关联文本和实体
  6. CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14
  7. 怎么访问原生php类,关于如何利用php的原生类进行XSS
  8. python基本代码教程-python基础教程第三版源代码
  9. 《Linux就该这么学》修正已知全部勘误,免费下载啦!
  10. windows虚拟显示器开发(三)USB显示器
  11. android p 小米6,小米6还能再战几年!将升级Android P
  12. Docker配置远程访问
  13. 入门推荐系统,这25篇综述文章足够了
  14. nginx新增conf文件
  15. 不是买一台电脑就能敲代码!学习java必须了解的计算机知识以及准备工作
  16. 如何蒸出白白胖胖的馒头
  17. 如何一秒将 iPhone 屏幕变成 S8
  18. webpack-dev-server代理请求配置
  19. android studio创建md,如何在Android Studio中设置*md文件打开方式
  20. 钢琴入门教程:钢琴的基础知识

热门文章

  1. UML类图java代码实现
  2. C#获取系统空闲时间
  3. MAC删除多余的声音驱动文件
  4. MIPS、CPI、MFLOPS
  5. 地理坐标(经纬度)转换成投影坐标(XY坐标)
  6. 方差、标准差、均方误差和均方根误差
  7. 失业找不到工作,很焦虑怎么办?
  8. Eigen零零散散的一些总结
  9. CUDA——Python基础与实现
  10. 解决ChatGPT网络总是掉线问题