【数据结构梳理03】数组的应用——三元组存储稀疏矩阵
一、稀疏矩阵的类定义(使用三元组储存)
struct MatrixTerm{
int row;
int col;
int value;
MatrixTerm(int r=-1,int c=-1,int val=-1):row(r),col(c),value(val) { }
};
class Matrix{
public:
Matrix();
~Matrix();
FastTranspose();
private:
int rows;
int cols;
int terms;
int capacity;
MatrixTerm* smArray;
};
二、稀疏矩阵的快速转置
用三元族存储的稀疏矩阵在转置时,如果仅仅使用普通的转置法,即多次遍历smArray[],将矩阵中各元素按照列号的大小排列(因为行号已经是有序的),那么时间复杂度可以达到O(cols*terms)。所以我们采用如下的快速转置法来对矩阵进行转置,可以将时间复杂度降至O(terms+cols)。
Matrix Matrix::FastTranspose ( ){
Matrix b(cols, rows, terms);
if (terms > 0){
int *rowSize = new int[cols];
int *rowStart = new int[cols];
fill(rowSize, rowSize + cols, 0);
for (int i=0; i<terms; i++ )
rowSize[smArray[i].col]++;
rowStart[0] = 0;
for (int i=1;i<cols;i++)
rowStart[i]=rowStart[i-1]+rowSize[i-1];
for (int i=0; i<terms; i++){
int j = rowStart[smArray[i].col];
b.smArray[j].row = smArray[i].col;
b.smArray[j].col = smArray[i].row;
b.smArray[j].value = smArray[i].value;
rowStart[smArray[i].col]++;
}
delete [ ] rowSize;
delete [ ] rowStart;
}
return b;
}
图解:


浙公网安备 33010602011771号