美文网首页
[数据结构]稀疏矩阵的乘法运算 解题报告

[数据结构]稀疏矩阵的乘法运算 解题报告

作者: vouv | 来源:发表于2017-03-26 14:28 被阅读0次

    Problem Description

    数据压缩是提高传输、存储效率一种技术。教材第5章介绍了两种简单的压缩存储方法。
    本实验要求实现两个稀疏矩阵相乘积的算法。其中稀疏矩阵非零元素数量小于100.

    输入:

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

    第2个稀疏矩阵的行数
    列数
    非零元个数(三个数都大于0)
    三元组
    以行为主序输入稀疏矩阵三元组表

    输出:

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


    测试输入

    3
    4
    4
    1 1 3
    1 4 5
    2 2 -1
    3 1 2
    4
    2
    4
    1 2 2
    2 1 1
    3 1 -2
    3 2 4
    

    测试输出

    3
    2
    3
    1,2,6
    2,1,-1
    3,2,4
    

    AcCode

    //
    //  main.cpp
    //  稀疏矩阵的乘法运算
    //
    //  Created by jetviper on 2017/3/26.
    //  Copyright © 2017年 jetviper. All rights reserved.
    //
    
    #pragma warning(disable:4996)
    #include<stdio.h>
    #define MAX 100
    typedef struct {
        int i, j, e;
    }TR;
    typedef struct {
        TR data[MAX];
        int mu,nu,tu;
    }TS;
    int main()
    {
        TS M, N, Q;
        int arow,ccol, ctemp[10000],k=1;
        for (int i = 0; i < MAX; i++) {
            M.data[i].e = 0;
            N.data[i].e = 0;
            Q.data[i].e = 0;
        }
        for (int i = 0; i < 10000; i++)ctemp[i] = 0;
        //input
        scanf("%d%d%d", &M.mu,&M.nu, &M.tu);
        for (int i = 1; i <= M.tu; i++) {
            scanf("%d%d%d", &M.data[i].i, &M.data[i].j, &M.data[i].e);
        }
        scanf("%d%d%d",&N.mu, &N.nu, &N.tu);
        for (int i = 1; i <= N.tu; i++) {
            scanf("%d%d%d", &N.data[i].i, &N.data[i].j, &N.data[i].e);
        }
        
        //cal
        arow = 0;
        
        for (int p = 1; p <= M.tu; p++) {
            
            if (arow!= M.data[p].i) {
                for (int q = 1; q <= N.nu; q++) {
                    if (ctemp[q] != 0) {
                        Q.data[k].i = arow;
                        Q.data[k].j = q;
                        Q.data[k].e = ctemp[q];
                        k++;
                    }
                }
                arow = M.data[p].i;
                for (int i = 0; i < 10000; i++)ctemp[i] = 0;
            }
            
            for (int q = 1; q <= N.tu; q++) {
                if (N.data[q].i == M.data[p].j) {
                    ccol = N.data[q].j;
                    ctemp[ccol] += M.data[p].e * N.data[q].e;
                }
            }
            
        }
        for (int q = 1; q <= N.nu; q++) {
            if (ctemp[q] != 0) {
                Q.data[k].i = arow;
                Q.data[k].j = q;
                Q.data[k].e = ctemp[q];
                k++;
            }
        }
        //print
        Q.mu = M.mu;
        Q.nu = N.nu;
        Q.tu = k - 1;
        printf("%d\n%d\n%d\n", Q.mu, Q.nu,Q.tu);
        for (int p = 1; p <= Q.tu; p++)printf("%d,%d,%d\n", Q.data[p].i, Q.data[p].j, Q.data[p].e);
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:[数据结构]稀疏矩阵的乘法运算 解题报告

          本文链接:https://www.haomeiwen.com/subject/buqkottx.html