数据结构——思考稀疏矩阵转置

Posted by Snorlaxa on 2019-06-25

稀疏矩阵的快速转置算法

三元组表示法

有矩阵A

2 0 0
1 0 0
0 3 0

三元组表示为

Element row col value
Elem[0] 0 0 2
Elem[1] 1 0 1
Elem[2] 2 1 3

转置

在讨论转置之前,应注意到三元组Elem对元素的存储顺序有要求:按照行序存储,同一行按列序存储。

这也跟元素在内存中的存储顺序一致。

若忽略这个要求,求其转置只需要把Elem内的元素行列号交换就可以了。而为了达到对存储顺序的要求,有两种转置算法。

1. 简单转置算法

按照数学方法一列一列转换:在三元组中找出每列元素,交换行列号,按行顺序依次放入三元组。

查找每列元素需要扫描三元组cols遍,扫描三元组需要O(n),复杂度O(cols*n)。

是为保证转置后三元组元素的顺序,小心翼翼一列列转换的笨方法。

2. 快速转置算法

尝试直接计算出元素位置。

这个问题可以转变为有m列元素,每列有若干个非零元素,将其按顺序放入一维数组中,求每个元素的位置。

三列,第1列:3个,第2/3列:2个

一维数组

如图,只需求出每出各列第一个元素即可得到列内全部元素的位置。

而第一个元素可以累加前面各列元素的个数求得。

根据上述思想,可建立如下表,A_col表示原列号,num表示每列元素个数,B_idx表示每列第一个元素所在位置。

A_col 0 1 2
num 2 1 0
B_idx 0 0+2=2 1+2=3

时间复杂度O(n)。