相关定义
- 当矩阵中非零元素占所有元素之比小于等于0.05时,称为稀疏矩阵。其中,非零元占总元素的比例称为矩阵的稀疏因子
- 按照压缩储存概念,我们只需要储存非零元。而储存非零元除了要记录他的值外,还需要记录所在行列位置(i,j)。因此,一个三元组(i,j,a)即可表示一个非零元。
- 由上,一个稀疏矩阵可由一系列三元组,加上一个两元组(表示矩阵的行列数)表示
三元组顺序表的表示
- 此数据结构由顺序结构储存
- 三元组顺序表的表示
#define MAXSIZE 12500//定义了非零元的最大个数
typedef struct{
int i,j;
ElemType e;
}Triple;
typedef struct{
Triple data[MAXSIZE+1];//data[0]不使用
//data域中非零元三元组以行序为主序排列(有利于进行某些矩阵运算)
int mu,nu,tu;
}TSMatrix;
- 经典矩阵转置算法
矩阵转置分为三步:(1)将矩阵的行列值进行交换(2)把每个三元组中的i、j进行调换(3)重排三元组的次序。其中第三步是最难实现的
Status TransPose(TSMatrix T,TSMatrix *S){
S->mu=T.nu;
S->nu=T.mu;
S->tu=T.tu;
if(T.tu){
int s=1;
for(int col=1;col<=T.nu;col++){
for(int t=1;t<=T.tu;t++){
if(T.data[t].j==col){
S->data[s].e=T.data[t].e;
S->data[s].i=T.data[t].j;
S->data[s].j=T.data[t].i;
s++;
}
}
}
}
return OK;
}
经典算法是按照T的列序进行转置,从第一行开始,遍查T中元素,将元素列值符合要求的提取出来。此算法劣势在于时间复杂度为nu乘tu,当tu与mu乘nu一个数量级时,变为nu乘mu乘nu,时间复杂度会提高,因此仅适用于tu<<mu*nu
- 快速转置算法
此算法引入了两个数组num【】和cpot【】,num【col】表示T某列非零元素的个数,cpot【col】表示T某列第一个元素在S.base中的位置
Status FastTransPose(TSMatrix T,TSMatrix *S){
S->mu=T.nu;
S->nu=T.mu;
S->tu=T.tu;
if(T.tu){
int col,num[T.nu],cpot[T.nu];
for(col=1;col<=T.nu;col++){
num[col]=0;
}
for(int i=1;i<=T.tu;i++){
num[T.data[i].j]++;
}
cpot[1]=1;
for(col=2;col<=T.nu;col++){
cpot[col]=cpot[col-1]+num[col-1];
}
for(int t=1;t<=T.tu;t++){
col=T.data[t].j;
int s=cpot[col];
S->data[s].e=T.data[t].e;
S->data[s].i=T.data[t].j;
S->data[s].j=T.data[t].i;
cpot[col]++;
}
}
return OK;
}
此算法时间复杂度为nu+tu,就算tu与mu乘nu在一个数量级上,也仅仅为mu乘nu,与经典算法复杂度相同
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。