数据结构——稀疏矩阵的转置

一.稀疏矩阵和其压缩存储

1.稀疏矩阵:
设m行n列的矩阵含t个非零元素,定义δ=t/(m*n)为稀疏因子,则稀疏因子小于等于0.05 的矩阵为稀疏矩阵。
2.稀疏矩阵的压缩存储:
稀疏矩阵中存在多个非零元素,且非零元素位置无规律,非零元的行下标,列下标,值以三元组( i,j,aij )形式来存储
稀疏矩阵由所有非0元的三元组所构成的线性表(三元组表)、矩阵的行数及列数唯一确定

二.稀疏矩阵的定义描述

typedef struct
 {
  int i,j;//该非零元的行列下标 
  ElemType e; 
 }Triple;
 
 typedef struct
 {
  Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用 
  int mu,nu,tu; //矩阵的行数,列数和非零元个数 
 }TSMatrix;

三.稀疏矩阵的普通转置

设M是三元组顺序表表示的稀疏矩阵,如何由M得到其转置T?

  • 将矩阵的行列值相互交换
  • 将每个三元组中的i和j对换
  • 重排三元组的次序

对M.data从头至尾扫描

  • 第一次扫描时,将M.data中列号为1的三元组赋值到T.data中
  • 第二次扫描时,将M.data中列号为2的三元组赋值到T.data中
  • 依此类推,直至将M.data所有三元组赋值到T.data中
Status TransposeSMatrix(TSMatrix M,TSMatrix &T)
 {
  T.mu=M.nu;
  T.nu=M.mu;
  T.tu=M.tu;
  if(T.tu)
      {   
    int q=1;
    for(int col=1;col<=M.nu;++col)
         {
    
    for(int p=1;p<=M.tu;++p)
             {  
     if(M.data[p].j==col)
        {
        T.data[q].i=M.data[p].j;
        T.data[q].j=M.data[p].i;
      T.data[q].e=M.data[p].e; 
         ++q;
     }
    }
   }
    }
    return OK;
 } 

四.稀疏矩阵的快速转置

按M中三元组次序转置,转置结果放入T中恰当位置。

转置的关键是要预先确定M中每一列第一个非零元在T中位置,并为确定这些位置,转置前应先求得M的每一列中非零元个数,所以定义两个辅助数组:

  • num[col]:存储M中第col列非零元个数
  • cpos[col]:存储M中第col列第一个非零元三元组在T.data中的位置
  • cpos[col]的计算方法:
    vcpos[1]=1
    vcpos[col]=cpos[col-1]+num[col-1](2<=col <=M.nu)
Status FastTransposeSMatrix(TSMatrix M,TSMatrix &T)
 {  
  T.mu=M.nu;
  T.nu=M.mu;
  T.tu=M.tu;
  int num[M.nu+1];
  int cpot[M.nu+1];
  int col;
     if(T.tu) 
     {  
   for(col=1;col<=M.nu;++col)
     num[col]=0;
         for(int t=1;t<=M.tu;++t) 
    ++num[M.data[t].j];
         cpot[1]=1;
         for(col=2;col<=M.nu;++col) 
               cpot[col]=cpot[col-1]+num[col-1];
         for(int p=1;p<=M.tu;++p) 
         {   
    col=M.data[p].j;
    int q=cpot[col];
             T.data[q].i=M.data[p].j; 
    T.data[q].j=M.data[p].i;
             T.data[q].e=M.data[p].e;
    ++cpot[col];    
     }
     }
     return OK;
 }

你可能感兴趣的:(数据结构)