基于三元组表表示的稀疏矩阵的快速转置算法及其改进

基于三元组表表示的稀疏矩阵的快速转置算法及其改进

摘 要:介绍基于三元组表表示的稀疏矩阵的快速转置算法,此算法在转置前需要先确定原矩阵中各列第一个非零元在转置矩阵中的位置,在此使用2个数组作为辅助空间,为了减少算法所需的辅助空间,通过引入2个简单变量提出一种改进算法。该改进算法在时间复杂度保持不变的情况下,空间复杂度比原算法节省一半。

需求分析: 矩阵作为许多科学与工程计算的数据对象,必然是计算机处理的数据对象之

一。在实际应用中,常会遇到一些阶数很高,同时又有许多值相同的元素或零元素的矩阵,在这类矩阵中,如果值相同的元素或零元素在矩阵中的分配没有规律,则称之为稀疏矩阵。为了节省存储空间,常对稀疏矩阵进行压缩存储。压缩存储的基本思想就是:对多个值相同的元素只分配1个存储空间,对零元素不分配存储空间。换句话说,就是只存储稀疏矩阵中的非零元素。 稀疏矩阵可以采取不同的压缩存储方法,对于不同的压缩存储方法,矩阵运算的实现也就不同。

1.稀疏矩阵的三元组表表示法

根据压缩存储的基本思想,这里只存储稀疏矩阵中的非零元素,因此,除了存储非零元的值以外,还必须同时记下它所在行和列的位置(i,j),即矩阵中的1个非零元aij由1个三元组(i,j,aij)惟一确定。由此可知,稀疏矩阵可由表示非零元的三元组表及其行列数惟一确定。对于稀疏矩阵的三元组表采取不同的组织方法即可得到稀疏矩阵的不同压缩存储方法,用三元组数组 (三元组顺序表)来表示稀疏矩阵即为稀疏矩阵的三元组表表示法。三元组数组中的元素按照三元组对应的矩阵元素在原矩阵中的位置,以行优先的顺序依次存放。

三元组表的类型说明如下:

# define MAXSIZE 1000 /*非零元素的个数最多为

1000*/

typedef struct

{

int row,col; /*该非零元素的行下标和列下标*/

ElementType e; /*该非零元素的值*/

}Triple;

typedef struct

{

Triple data[MAXSIZE+1]; /*非零元素的三元组表,

data[0]未用*/

int m,n,len; /*矩阵的行数、列数和非零元素的个数*/

}TSMatrix;

2. 稀疏矩阵的快速转置算法

待转置矩阵source和转置后矩阵dest分别用三元组表A和B表示,依次按三元组表A中三元组的次序进行转置,转置后直接放到三元组表B的正确位置上。这种转置算法称为快速转置算法。为了能将待转置三元组表A中元素一次定位到三元组表B的正确位置上,需要预先计算以下数据:

1) 待转置矩阵source每一列中非零元素的个数(即转置后矩阵dest每一行中非零元素的个

数)。

2) 待转置矩阵source每一列中第一个非零元素在三元组表B中的正确位置(即转置后矩阵

dest每一行中第一个非零元素在三元组表B中的正确位置)。

为此,需要设2个数组num[]和position[],其中num[col]用来存放矩阵source中第col列中非零元素个数(转置后矩阵dest中第col行非零元素的个数);position[col]用来存放转置矩阵source中第col列(转置后矩阵dest中第col行)中第一个非零元素在三元组表B中的正确位置。

num[col]的计算方法:将三元组表A扫描一遍,对于其中列号为k的元素,给相应的num[k]加1。

position[col]的计算方法:

position[1]=1

position[col]=position[col-1]+num[col-1]

(其中2[col[A.n)

将三元组表A中所有的非零元素直接放到三元组表B中正确位置上的方法是:position[col]的初值为三元组表A中列号为col(三元组表B的行号为col)的第1个非零元素的正确位置,当三元组表A中列号为col的1个元素加入到三元组表B时,则position[col]=position[col]+1,即:使position[col]始终指向三元组表A中列号为col的下一个非零元素在三元组表B 中的正确位置。

稀疏矩阵的快速转置算法如下:

(1)初始化num[ ]数组;

(2)求num[ ]数组各元素的值;

(3)求position[ ]数组各元素的值;

(4)将三元组表A中所有的非零元素直接放到三元组表B中正确位置上。

快速转置算法的时间主要耗费在4个并列的单循环上,这4个并列的单循环分别执行了

于经典算法的时间复杂度O(A.m*A.n)。

快速转置算法在空间耗费上除三元组表所占用的空间外,还需2个辅助向量空间,即num[1..A.n],position[1..A.n]。可见,算法在时间上的节省,是以更多的存储空间为代价的。 可见,稀疏矩阵的三元组表表示法虽然节约了存储空间,但比起矩阵的正常存储方式来讲,其实现相同操作要耗费较多的时间,同时也增加了算法的难度,即以

耗费更多时间为代价来换取空间的节省。

3. 稀疏矩阵的快速转置算法的改进

在稀疏矩阵的快速转置算法中引入2个辅助向量空间num[]和position[],在下面的改进算法中只保留num[],另外引入2个变量k1和k2。num[col]起初用来存放矩阵source中第col列中非零元素个数(转置后矩阵dest中第col行非零元素的个数),然后通过修改num[col]中各元素的值,用num[col]存放转置矩阵source中第col列(转置后矩阵dest中第col行)中第一个非零元素在三元组表B中的正确位置。修改num[col]中各元素的值的操作实现如下:

(1)令k1=num[1];num[1]=1;

(2)对于col=2,A.n依次做:

k2= num[col]

num[col]=k1+num[col-1];

k1=k2;

在转置过程中,当三元组表A中列号为col的1个元素加入到三元组表B时,则num[col]=num[col]+1,即:使num[col]始终指向三元组表A中列号为col的下一个非零元素在

三元组表B中的正确位置。

改进的快速转置算法如下:初始化num[ ]数组;求num[ ]数组各元素的值;修改num[ ]数组各元素的值;将三元组表A中所有的非零元素直接放到三元组表B中正确位置上。

显然,上述改进算法的时间复杂度与原算法相同,在空间复杂度上除了三元组表所占用的空间外,只需要1个辅助向量空间num[1..A.n]和2个简单变量,而算法的空间复杂度仅考虑算法所需的辅助空间,因此,改进算法的空间复杂度比原算法节约一半。

基于三元组表表示的稀疏矩阵的快速转置算法及其改进

摘 要:介绍基于三元组表表示的稀疏矩阵的快速转置算法,此算法在转置前需要先确定原矩阵中各列第一个非零元在转置矩阵中的位置,在此使用2个数组作为辅助空间,为了减少算法所需的辅助空间,通过引入2个简单变量提出一种改进算法。该改进算法在时间复杂度保持不变的情况下,空间复杂度比原算法节省一半。

需求分析: 矩阵作为许多科学与工程计算的数据对象,必然是计算机处理的数据对象之

一。在实际应用中,常会遇到一些阶数很高,同时又有许多值相同的元素或零元素的矩阵,在这类矩阵中,如果值相同的元素或零元素在矩阵中的分配没有规律,则称之为稀疏矩阵。为了节省存储空间,常对稀疏矩阵进行压缩存储。压缩存储的基本思想就是:对多个值相同的元素只分配1个存储空间,对零元素不分配存储空间。换句话说,就是只存储稀疏矩阵中的非零元素。 稀疏矩阵可以采取不同的压缩存储方法,对于不同的压缩存储方法,矩阵运算的实现也就不同。

1.稀疏矩阵的三元组表表示法

根据压缩存储的基本思想,这里只存储稀疏矩阵中的非零元素,因此,除了存储非零元的值以外,还必须同时记下它所在行和列的位置(i,j),即矩阵中的1个非零元aij由1个三元组(i,j,aij)惟一确定。由此可知,稀疏矩阵可由表示非零元的三元组表及其行列数惟一确定。对于稀疏矩阵的三元组表采取不同的组织方法即可得到稀疏矩阵的不同压缩存储方法,用三元组数组 (三元组顺序表)来表示稀疏矩阵即为稀疏矩阵的三元组表表示法。三元组数组中的元素按照三元组对应的矩阵元素在原矩阵中的位置,以行优先的顺序依次存放。

三元组表的类型说明如下:

# define MAXSIZE 1000 /*非零元素的个数最多为

1000*/

typedef struct

{

int row,col; /*该非零元素的行下标和列下标*/

ElementType e; /*该非零元素的值*/

}Triple;

typedef struct

{

Triple data[MAXSIZE+1]; /*非零元素的三元组表,

data[0]未用*/

int m,n,len; /*矩阵的行数、列数和非零元素的个数*/

}TSMatrix;

2. 稀疏矩阵的快速转置算法

待转置矩阵source和转置后矩阵dest分别用三元组表A和B表示,依次按三元组表A中三元组的次序进行转置,转置后直接放到三元组表B的正确位置上。这种转置算法称为快速转置算法。为了能将待转置三元组表A中元素一次定位到三元组表B的正确位置上,需要预先计算以下数据:

1) 待转置矩阵source每一列中非零元素的个数(即转置后矩阵dest每一行中非零元素的个

数)。

2) 待转置矩阵source每一列中第一个非零元素在三元组表B中的正确位置(即转置后矩阵

dest每一行中第一个非零元素在三元组表B中的正确位置)。

为此,需要设2个数组num[]和position[],其中num[col]用来存放矩阵source中第col列中非零元素个数(转置后矩阵dest中第col行非零元素的个数);position[col]用来存放转置矩阵source中第col列(转置后矩阵dest中第col行)中第一个非零元素在三元组表B中的正确位置。

num[col]的计算方法:将三元组表A扫描一遍,对于其中列号为k的元素,给相应的num[k]加1。

position[col]的计算方法:

position[1]=1

position[col]=position[col-1]+num[col-1]

(其中2[col[A.n)

将三元组表A中所有的非零元素直接放到三元组表B中正确位置上的方法是:position[col]的初值为三元组表A中列号为col(三元组表B的行号为col)的第1个非零元素的正确位置,当三元组表A中列号为col的1个元素加入到三元组表B时,则position[col]=position[col]+1,即:使position[col]始终指向三元组表A中列号为col的下一个非零元素在三元组表B 中的正确位置。

稀疏矩阵的快速转置算法如下:

(1)初始化num[ ]数组;

(2)求num[ ]数组各元素的值;

(3)求position[ ]数组各元素的值;

(4)将三元组表A中所有的非零元素直接放到三元组表B中正确位置上。

快速转置算法的时间主要耗费在4个并列的单循环上,这4个并列的单循环分别执行了

于经典算法的时间复杂度O(A.m*A.n)。

快速转置算法在空间耗费上除三元组表所占用的空间外,还需2个辅助向量空间,即num[1..A.n],position[1..A.n]。可见,算法在时间上的节省,是以更多的存储空间为代价的。 可见,稀疏矩阵的三元组表表示法虽然节约了存储空间,但比起矩阵的正常存储方式来讲,其实现相同操作要耗费较多的时间,同时也增加了算法的难度,即以

耗费更多时间为代价来换取空间的节省。

3. 稀疏矩阵的快速转置算法的改进

在稀疏矩阵的快速转置算法中引入2个辅助向量空间num[]和position[],在下面的改进算法中只保留num[],另外引入2个变量k1和k2。num[col]起初用来存放矩阵source中第col列中非零元素个数(转置后矩阵dest中第col行非零元素的个数),然后通过修改num[col]中各元素的值,用num[col]存放转置矩阵source中第col列(转置后矩阵dest中第col行)中第一个非零元素在三元组表B中的正确位置。修改num[col]中各元素的值的操作实现如下:

(1)令k1=num[1];num[1]=1;

(2)对于col=2,A.n依次做:

k2= num[col]

num[col]=k1+num[col-1];

k1=k2;

在转置过程中,当三元组表A中列号为col的1个元素加入到三元组表B时,则num[col]=num[col]+1,即:使num[col]始终指向三元组表A中列号为col的下一个非零元素在

三元组表B中的正确位置。

改进的快速转置算法如下:初始化num[ ]数组;求num[ ]数组各元素的值;修改num[ ]数组各元素的值;将三元组表A中所有的非零元素直接放到三元组表B中正确位置上。

显然,上述改进算法的时间复杂度与原算法相同,在空间复杂度上除了三元组表所占用的空间外,只需要1个辅助向量空间num[1..A.n]和2个简单变量,而算法的空间复杂度仅考虑算法所需的辅助空间,因此,改进算法的空间复杂度比原算法节约一半。


相关内容

  • 稀疏矩阵三元组实现矩阵转置算法实验报告
  • 实验三 稀疏矩阵的三元组表示实现矩阵转置算法 学院 专业 班 学号 姓名 一.实习目的 1. 掌握稀疏矩阵的三元组顺序表存储表示: 2. 掌握稀疏矩阵三元组表示的传统转置算法的实现: 3. 掌握稀疏矩阵三元组表示的快速转置算法的实现: 二.实习内容 1. 稀疏矩阵的按三元组形式输入,即按行序输入非零 ...

  • 稀疏矩阵快速转置
  • 题目:假设稀疏矩阵A采用三元组表表示,编写程序实现该矩阵的快速转置 要求:输入一个稀疏矩阵A,由程序将其转换成三元组表存储:转置后的三元组 表,由程序将其转换成矩阵形式后输出. 二.概要设计 ⒈ 为实现上述算法,需要线性表的抽象数据类型: ADT SparseMatrix { 数据对象:D={aij ...

  • 信息论与编码课程论文
  • <信息论与编码>课程论文 压缩感知技术综述 学院(系): 专 业: 班 级: 学生姓名: 学 号: 教 师: 2016年 5月 1日 压缩感知技术综述 摘要:信号采样是模拟的物理世界通向数字的信息世界之必备手段.多年来,指导信号采样的理论基础一直是著名的Nyquist采样定理,但其产生的 ...

  • 基于改进子空间追踪算法的稀疏信道估计_郭莹
  • 第31卷第4期2011年4月 文章编号:1001-9081(2011)04-0907-03 计算机应用 JournalofComputerApplicationsVol.31No.4Apr.2011 doi:10.3724/SP.J.1087.2011.00907 基于改进子空间追踪算法的稀疏信道估 ...

  • [数据结构]教学大纲
  • <数据结构>教学大纲 Data Structure 课程编号:J6110G0003 课程性质:学科基础课程 适用专业:计算机科学与技术.网络工程.数字媒体技术 先行课:计算机科学导论.离散数学.高级语言程序设计: 后续课:无 . 学分数:5 主讲教师:任燕.王命延.冯豫华.周石林.王玮立 ...

  • [数据结构课程设计]课程设计方案
  • <算法与数据结构课程设计>方案 Course Design of Data Structure 适用专业:计算机科学与技术专业 本科 课程代码:B08233004 一.课程设计的性质和目的 软件设计能力培养对学生是很重要.通过数据结构的学习,使学生对软件编程能力有一定的提高.数据结构学习 ...

  • 压缩感知理论及其研究进展
  • 第5期2009年5月 电 子 学 报 ACTAELECTRONICASINICAVol.37 No.5 May 2009 压缩感知理论及其研究进展 石光明1,刘丹华1,高大化1,2,刘 哲3,林 杰1,王良君1 (11西安电子科技大学智能感知与图像理解教育部重点实验室,陕西西安710071;21空军 ...

  • 大规模知识图谱的构建.推理及应用
  • 随着大数据的应用越来越广泛,人工智能也终于在几番沉浮后再次焕发出了活力.除了理论基础层面的发展以外,本轮发展最为瞩目的是大数据基础设施.存储和计算能力增长所带来的前所未有的数据红利. 人工智能的进展突出体现在以知识图谱为代表的知识工程以及以深度学习为代表的机器学习等相关领域. 未来伴随着深度学习对于 ...

  • 稀疏矩阵的运算
  • 数 据 结 构 课 程 设 计 稀疏矩阵的运算 学 生 姓 名: 学 号: 指 导 教 师: 完 成 日 期: 目录: 1.分析问题和确定解决方案 „„„„„„„„„„ 3 1.1问题描述 „„„„„„„„„„„ 3 1.2 输入的形式和输入值的范围 „„„„„„„„ 3 1.3 输出的形式 „„„ ...