14. 稀疏矩阵的乘法运算

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

数据压缩是提高传输、存储效率一种技术。教材第5章介绍了两种简单的压缩存储方法。

本实验要求实现两个稀疏矩阵相乘积的算法。其中稀疏矩阵非零元素数量小于100.

输入

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

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

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

输出

       乘积矩阵的行数
          列数
          非零元个数(三个数都大于0)
          三元组

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

代码

#include<stdio.h>  
#include<string.h>  
typedef struct{  
    int i, j;  
    int e;  
}Trip;  
typedef struct{  
    Trip data[1000];  
    int rpos[1000];  
    int mu, nu, tu;  
}Matrix;  
int main()  
{  
    int i;  
    int arow;  
    int tp;  
    int p;  
    int brow;  
    int t;  
    int q;  
    int ccol;  
    int ctemp[1000];  
    int num[1000];  
    int col;  
    Matrix A, B, Q;  
    scanf("%d%d%d", &A.mu, &A.nu, &A.tu);  
    for (i = 1; i <= A.tu; i++)  
        scanf("%d%d%d", &A.data[i].i, &A.data[i].j, &A.data[i].e);  
    scanf("%d%d%d", &B.mu, &B.nu, &B.tu);  
    for (i = 1; i <= B.tu; i++)  
        scanf("%d%d%d", &B.data[i].i, &B.data[i].j, &B.data[i].e);  
    for (col = 1; col <= A.mu; col++)  
        num[col] = 0;  
    for (i = 1; i <= A.tu; i++)  
        num[A.data[i].i]++;  
    A.rpos[1] = 1;  
    for (col = 2; col <= A.mu; col++)  
        A.rpos[col] = A.rpos[col - 1] + num[col - 1];  
    for (col = 1; col <= B.mu; col++)  
        num[col] = 0;  
    for (i = 1; i <= B.tu; i++)  
        num[B.data[i].i]++;  
    B.rpos[1] = 1;  
    for (col = 2; col <= B.mu; col++)  
        B.rpos[col] = B.rpos[col - 1] + num[col - 1];  
    Q.mu = A.mu;  
    Q.nu = B.nu;  
    Q.tu = 0;  
    if (A.tu*B.tu != 0){  
        for (arow = 1; arow <= A.mu; arow++){  
            memset(ctemp, 0, sizeof(ctemp));  
            Q.rpos[arow] = Q.tu + 1;  
            if (arow < A.mu)  
                tp = A.rpos[arow + 1];  
            else  
            {  
                tp = A.tu + 1;  
            }  
            for (p = A.rpos[arow]; p < tp; p++){  
                brow = A.data[p].j;  
                if (brow < B.mu)  
                    t = B.rpos[brow + 1];  
                else  
                {  
                    t = B.tu + 1;  
                }  
                for (q = B.rpos[brow]; q < t; q++){  
                    ccol = B.data[q].j;  
                    ctemp[ccol] += A.data[p].e*B.data[q].e;  
                }  
            }  
            for (ccol = 1; ccol <= Q.nu;ccol++)  
            if (ctemp[ccol]){  
                Q.tu++;  
                Q.data[Q.tu].i = arow;  
                Q.data[Q.tu].j = ccol;  
                Q.data[Q.tu].e = ctemp[ccol];  
            }  
        }  
    }  
    printf("%d\n", Q.mu);  
    printf("%d\n", Q.nu);  
    printf("%d\n", Q.tu);  
    for (i = 1; i <= Q.tu; i++)  
        printf("%d,%d,%d\n", Q.data[i].i, Q.data[i].j, Q.data[i].e);  
    return 0;  
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值