zoukankan      html  css  js  c++  java
  • 矩阵转置的两种算法

    #include <cstdio>
    #include <cstdlib>
    //#define _OJ_
    typedef struct Triple1
    {
        int i1;
        int j1;
        int data;            //用三元组表来存储稀疏矩阵
    } Triple1, *Triple;
    
    typedef struct Matrix1
    {
        Triple1 elem[100];
        int row;
        int colum;
        int cnt;            //压缩矩阵行数列数及非零数的个数
    } Matrix1, *Matrix;
    
    void
    TansposeMatrix(Matrix M, Matrix T)
    {
        int i, j, q;
        T->cnt = M->cnt;  T->row = M->colum;  T->colum = M->row;
    
        if(M->cnt > 0) {
         q = 1;
         for(i = 1;i <= T->row; i++) {      //0号位不用T中的行从小到大去寻找M中的列配对
            for(j = 1;j <= T->cnt; j++) {   //和elem中的数每一个j1配对
                  if(i == M->elem[j].j1) {
                 T->elem[q].i1   = M->elem[j].j1;
                 T->elem[q].data = M->elem[j].data;
                 T->elem[q].j1 = M->elem[j].i1;               q++;
                 }
             }
          }
       }
    
    }
    // 当非零个数和row * colum 相同时候 复杂度为row * colum  * colum;仅仅适于cnt<<row * colum时
    
    void
    transposematrix1(Matrix M, Matrix T)
    {
        int i, j, col, p;
        int num[100], cpot[100];
        T->row = M->colum;    T->colum = M->row;  T->cnt = M->cnt;
    
        if(T->cnt > 0) {               
         for(i = 1;i <= M->colum; i++)
         num[i] = 0;
         for(i = 1;i <= M->cnt; i++)
         ++num[M->elem[i].j1];      //计算M中每一列的非零元素个数
    
         cpot[0] = 1;
         for(j = 1;j <= M->colum; j++)
         cpot[j] = cpot[j - 1] + num[j - 1];   //计算每一列的第一个非零元素在elem的下标
    
         for(i = 1;i <= M->cnt; i++) {
         col = M->elem[i].j1;    p = cpot[col];
         T->elem[p].i1 = M->elem[i].j1;
         T->elem[p].j1 = M->elem[i].i1;
         T->elem[p].data = M->elem[i].data;    ++cpot[col];
         //计算完第一个后下标加一以便第n个非零元素计算
          }
       }
    
    }
    //复杂度为cnt + colum 当cnt = row * colum 和经典算法一样为row * colum;
    
    
    int main(int argc, char const *argv[]) {
    #ifndef _OJ_  //ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
        // freopen("output.txt", "w", stdout);
    #endif
    
        int i;
        Matrix M, T;
        M = (Matrix) malloc (sizeof(Matrix1));
        T = (Matrix) malloc (sizeof(Matrix1));
        scanf("%d %d %d", &M->row, &M->colum, &M->cnt);
    
        printf("原矩阵如下:
    ");
        for(i = 1;i <= M->cnt; i++) {
        scanf("%d  %d  %d", &M->elem[i].i1,  &M->elem[i].j1, &M->elem[i].data);
        printf("%d %d %d
    ", M->elem[i].i1, M->elem[i].j1, M->elem[i].data);
        }
    
        TansposeMatrix(M, T);
        printf("稀疏矩阵的转置算法一如下所示:
    ");
        for(i = 1;i <= T->cnt; i++)
        printf("%d %d %d
    ", T->elem[i].i1, T->elem[i].j1, T->elem[i].data);
    
        transposematrix1(M, T);
        printf("稀疏矩阵的转置算法二如下所示:
    ");
        for(i = 1;i <= T->cnt; i++)
        printf("%d %d %d
    ", T->elem[i].i1, T->elem[i].j1, T->elem[i].data);
    
        return 0;
    }
      
    

      

  • 相关阅读:
    BZOJ3473: 字符串
    BZOJ1088: [SCOI2005]扫雷Mine
    跪啃SAM
    BZOJ3932: [CQOI2015]任务查询系统
    BZOJ3545: [ONTAK2010]Peaks
    06.约束
    05.数据表的创建与简单操作
    04.数据库的创建
    安卓6.0后运行时权限封装
    OkGo使用缓存
  • 原文地址:https://www.cnblogs.com/airfand/p/5021679.html
Copyright © 2011-2022 走看看