13. 矩阵的快速转置算法

成绩10开启时间2021年10月12日 星期二 18:00
折扣0.8折扣时间2021年10月26日 星期二 23:55
允许迟交关闭时间2021年10月26日 星期二 23:55

矩阵的快速转置算法

     数据压缩是提高传输、存储效率一种技术。教材第5章介绍了两种简单的压缩存储方法。本实验要求实现三元组顺序表表示下的矩阵快速转置算法

输入:

稀疏矩阵的行数、列数、非零元个数(三个数都大于0)

以行为主序输入稀疏矩阵三元组表

输出:

辅助数组num[ ]

辅助数组cpot[ ]

以行为主序输出对应的转置矩阵三元组表

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 6 7 8↵
  2. 1 2 12↵
  3. 1 3 9↵
  4. 3 1 -3↵
  5. 3 6 14↵
  6. 4 3 24↵
  7. 5 2 18↵
  8. 6 1 15↵
  9. 6 4 -7↵
以文本方式显示
  1. num:2,2,2,1,0,1,0,↵
  2. cpot:1,3,5,7,8,8,9,↵
  3. 1,3,-3↵
  4. 1,6,15↵
  5. 2,1,12↵
  6. 2,5,18↵
  7. 3,1,9↵
  8. 3,4,24↵
  9. 4,6,-7↵
  10. 6,3,14↵
1秒256KB0
测试用例 2以文本方式显示
  1. 5 4 6↵
  2. 2 1 1↵
  3. 2 2 2↵
  4. 4 2 2↵
  5. 4 3 3↵
  6. 5 3 3↵
  7. 5 4 4↵
以文本方式显示
  1. num:1,2,2,1,↵
  2. cpot:1,2,4,6,↵
  3. 1,2,1↵
  4. 2,2,2↵
  5. 2,4,2↵
  6. 3,4,3↵
  7. 3,5,3↵
  8. 4,5,4↵
1秒64M0

代码

#include"iostream"  
  
using namespace std;  
  
//三元组表   
typedef struct{  
    int i,j,e;  
}SANYUAN;  
  
//稀疏矩阵   
typedef struct{  
    SANYUAN list[10001];  
    int row,col,nu; //行数,列数,非零元个数   
}JUZHEN;  
  
//辅助数组   
int num[1010]={0};  
int cpot[1010]={0};  
  
int main(){  
    //定义两个矩阵变量  
    JUZHEN A,B;  
      
    //输入三元组表  
    cin>>A.row>>A.col>>A.nu;  
    for(int i=1;i<=A.nu;i++){  
        cin>>A.list[i].i>>A.list[i].j>>A.list[i].e;  
    }  
    //转置  
    B.row=A.col;  
    B.col=A.row;  
    B.nu=A.nu;  
      
    if(B.nu){  
        //初始化num  
        for(int i=1;i<=A.col;++i){  
            num[i]=0;  
        }   
        //非零元++  
        for(int i=1;i<=B.nu;++i){  
            ++num[A.list[i].j];  
        }  
        //cpot  
        cpot[0]=1;  
        cpot[1]=1;  
          
        for(int col=2;col<=A.col;++col){  
            cpot[col]=cpot[col-1]+num[col-1];  
        }  
        //转置   
        for(int p=1;p<=A.nu;++p){  
            int col=A.list[p].j;  
            int q=cpot[col];  
            B.list[q].i=A.list[p].j;  
            B.list[q].j=A.list[p].i;  
            B.list[q].e=A.list[p].e;  
              
            ++cpot[col];   
        }  
          
    }   
    //输出辅助数组  
    cout<<"num:";  
    for(int i=1;i<=A.col;++i){  
        cout<<num[i]<<",";  
    }  
    cout<<endl<<"cpot:";  
    for(int i=0;i<A.col;++i){  
        cout<<cpot[i]<<",";  
    }  
    cout<<endl;  
      
    //输出转置后三元组表   
    for(int i=1;i<=B.nu;++i){  
        cout<<B.list[i].i<<","<<B.list[i].j<<","<<B.list[i].e<<endl;   
    }  
    return 0;  
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值