三元组 行向量 快速转置

已知三元组表求出行向量,根据行向量实现矩阵的快速转置用转置后的三元组表输出。

mu表示行数,nu表示列数,ln表示非零元数量;

定义num[]数组,记录矩阵中每列的非零元个数。

定义pos[] 记录行向量;

例题:

稀疏矩阵的存储不宜用二维数组存储每个元素,那样的话会浪费很多的存储空间。所以可以使用一个一维数组存储其中的非零元素。这个一维数组的元素类型是一个三元组,由非零元素在该稀疏矩阵中的位置(行号和列号对)以及该元组的值构成。

而矩阵转置就是将矩阵行和列上的元素对换。参考算法5.1中的具体做法,令mu和nu分别代表稀疏矩阵的行数和列数,不难发现其时间复杂度为O(mu×nu)。而当非零元的个数tu与mu×nu同数量级时,算法5.1的时间复杂度将上升至O(mu×nu2)。因此,需要采用快速的稀疏矩阵转置算法。

输入格式:

输入的第一行是两个整数r和c(r<300, c<300, r*c <= 12500),分别表示一个包含很多0的稀疏矩阵的行数和列数。接下来有r行,每行有c个整数,用空格隔开,表示这个稀疏矩阵的各个元素。

输出格式:

输出为读入的稀疏矩阵的转置矩阵。输出共有c行,每行有r个整数,每个整数后输出一个空格。请注意行尾输出换行。

输入样例:

6 7
0 12 9 0 0 0 0
0 0 0 0 0 0 0
-3 0 0 0 0 14 0
0 0 24 0 0 0 0
0 18 0 0 0 0 0
15 0 0 -7 0 0 0

输出样例 :

0 0 -3 0 0 15 
12 0 0 0 18 0 
9 0 0 24 0 0 
0 0 0 0 0 -7 
0 0 0 0 0 0 
0 0 14 0 0 0 
0 0 0 0 0 0 

struct zhu{
    int i;
    int j;
    int data;
}m[1000],p[1000]; //m为原三元组表,p为转置后的三元组表
int main(){
    int n,k,a,h=0;
    cin>>n>>k;
    for(int i=0;i<n;i++){
        for(int j=0;j<k;j++){
            cin>>a;
            if(a!=0){
                m[h].i=i;
                m[h].j=j;
                m[h].data=a[i][j];
                h++;
            }
    int num[100]={0};
    for(int i=0;i<h;i++)  //h记录非零元的个数
        num[m[i].j]++;
    int pos[100]={0}; 
    for(int i=1;i<h;i++)
        pos[i]=pos[i-1]+num[i-1];
    for(int i=0;i<h;i++){ //遍历一遍原三元组表
        int s=pos[m[i].j]-1;
        n[s].i=m[i].j;
        n[s].j=m[i].i;
        n[s].data=m[i].data;
    int o[100][100]={0};//构建转置后的矩阵
    for(int i=0;i<h;i++)
        o[n[i].i][n[i].j]=n[i].data;  //遍历三元组表,找出所有非零元
    for(int i=0;i<k;i++){
        for(int j=0;j<n;j++)
           cout<<n[i][j]<<" ":
        cout<<endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_61756086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值