1

相关定义

  • 当矩阵中非零元素所有元素之比小于等于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,与经典算法复杂度相同

关注公众号,让我们携手共进

0.5.jpg


无欲则刚
76 声望15 粉丝