三元组顺序表

三元组顺序表

假设以顺序存储结构存放三元组的线性表,则可得稀疏矩阵的一种存储压缩表示法-称之为三元组顺序表

实现矩阵转置的算法:


         
         
         
         
         

1.“按需点菜”。由于T.data[ ]中的元素是一矩阵T的行序为主序的顺序排列的,即以矩阵M的列序为主序排列,则可以按照M的列号顺序依次从M.data[ ]中“找出”元素进行"行列转化”,之后插入T.data[ ]中。由于对M的每一列都要对M的三元组扫描一遍,因此如此处理的算法的时间复杂度为O(n*t),其中n为M的列数,t为M中非零元的数目

2.“按位就座”。只对M.datap[ ]进行依次扫描,就使所有非零元的三元组在T中“一次到位”。为实现之,首先应分析每个非零元在T.data[ ]中的位置的规律。如非零元(1,2,12)经转换后变成(2,1,12),应直接安置在T.data[ ]中第三位非零元的位置,因为对矩阵T而言,第一行中只有两个非零元,二(2,1,12)是第二行中第一个非零元。由此,如果能预先计算出T矩阵中每一行的第一个非零元所应该在的位置,就可以实现非零元在T.data[ ]中的一次到位。为此,只要首先计算出矩阵T中每一行的非零元的数目(及原矩阵M中每一列的非零元数目)就可以通过累计进而求得转置矩阵T中国每一行的非零元在T.data[ ]中的其实位置。假设Num[col](col=1,2,....,M.nu)表示矩阵M中第col列中非零元的数目,rpos[col]表示转置矩阵T中第col行的非零元在T.data[ ]中的起始位置

      则有

    rpos[col]=1,                                  col=1

                    rpos[col-1]+num[col-1], 2<=col<=M.nu+1

#include
#include
#include
#include
#include
#include
#include
using namespace std;
//----稀疏矩阵的三元组顺序存储表示
const int MAXSIZE=1000;
const int MAXMN=100;   //矩阵行或列的最大值maxmn+1
int num[MAXSIZE],rpos[MAXSIZE];
typedef int ElemType;
typedef struct{
    int i,j;
    ElemType e;
}Triple;
typedef struct{
    Triple data[MAXSIZE]; //非零三元组表,data[0]未用
    int mu,nu,tu;
}TSMatrix;
void Show_Matrix(TSMatrix M);
void CreateRpos(TSMatrix M);
void FastTransposeSMatrix(TSMatrix M,TSMatrix &T);
int main()
{
    TSMatrix M;
    TSMatrix T;
    int m,n,sum;
    cin>>m>>n>>sum;                             //输入矩阵行数,列数,非零元素个数
    int i,j,a;                                   //输入矩阵元素——行下标,列下标,非零元素的元素值
    M.mu=m;
    M.nu=n;
    M.tu=sum;
    for(int k=1;k<=sum;k++)
    {
        cout<<"input x,k,a[x][y]:";
        cin>>i>>j>>a;
        M.data[k].i=i;
        M.data[k].j=j;
        M.data[k].e=a;
        cout<


你可能感兴趣的:(数据结构及算法应用教程课后习题)