稀疏矩阵加法,实现C=A+B

Description

输入两个稀疏矩阵,输出它们相加的结果。

Input

第一行输入四个正整数,分别是两个矩阵的行m、列n、第一个矩阵的非零元素的个数t1和第二个矩阵的非零元素的个数t2。
接下来的t1+t2行是三元组,分别是第一个矩阵的数据和第二个矩阵的数据。三元组的第一个元素表示行号,第二个元素表示列号,第三个元素是该项的值。

Output

输出相加后的矩阵三元组。

  • Sample Input 
    3 4 3 2
    1 1 1
    1 3 1
    2 2 2
    1 2 1
    2 2 3
  • Sample Output
    1 1 1
    1 2 1
    1 3 1
    2 2 5
#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 100

typedef struct {
  int  i,j; 
  int  e; 
}Triple;

typedef struct  {
  Triple data[MAXSIZE+1]; 
  int mu,nu,tu; 
}TSMatrix;

TSMatrix AddTSM(TSMatrix A,TSMatrix B)
{
    TSMatrix C;
    int ai,bi,ci,aj,bj,cj,ap,bp,cp;
    ap = bp = cp = 1;
    C.mu = A.mu;
    C.nu = A.nu;
    while(ap <= A.tu && bp <= B.tu){
        ai = A.data[ap].i;
        bi = B.data[bp].i;
        if(ai > bi){
            ci = bi;
            while(ci == B.data[bp].i){
                C.data[cp].i = ci;
                C.data[cp].j = B.data[bp].j;
                C.data[cp].e = B.data[bp].e;
                ++bp;
                ++cp;
            }
        }
        else if(ai < bi){
           ci = ai;
           while(ci == A.data[ap].i){
                C.data[cp].i = ci;
                C.data[cp].j = A.data[ap].j;
                C.data[cp].e = A.data[ap].e;
                ++ap;
                ++cp;
            }
        }
        else if(ai == bi){
            ci = ai;
            aj = A.data[ap].j;
            bj = B.data[bp].j;
            if(aj > bj){
                C.data[cp].i = ci;
                C.data[cp].j = bj;
                C.data[cp].e = B.data[bp].e;
                ++cp;
                ++bp;
            }
            else if(aj < bj){
                C.data[cp].i = ci;
                C.data[cp].j = aj;
                C.data[cp].e = A.data[ap].e;
                ++cp;
                ++ap;
            }
            else if(aj == bj){
                if(A.data[ap].e + B.data[bp].e != 0){
                    C.data[cp].i = ci;
                    C.data[cp].j = aj;
                    C.data[cp].e = A.data[ap].e + B.data[bp].e;
                    ++cp;
                }
                ++ap;
                ++bp;
            }
        }
    }
    //以上为稀疏矩阵A或B中的元素完全加完的情况
    //以下为稀疏矩阵A或B中的元素部分剩余的情况
    while(ap <= A.tu){
        C.data[cp].i = A.data[ap].i;
        C.data[cp].j = A.data[ap].j;
        C.data[cp].e = A.data[ap].e;
        ++cp;
        ++ap;
    }
    while(bp <= B.tu){
        C.data[cp].i = B.data[bp].i;
        C.data[cp].j = B.data[bp].j;
        C.data[cp].e = B.data[bp].e;
        ++cp;
        ++bp;
    }
    C.tu = --cp;
    return C;
}

int main()
{
    TSMatrix A;
    TSMatrix B;
    int n,m,t1,t2,i;
    scanf("%d %d %d %d",&m,&n,&t1,&t2);
    A.tu=t1;
    A.mu=m;
    A.nu=n;
    B.tu=t2;
    B.mu=m;
    B.nu=n;
    for(i=1;i<=t1;i++)
    {
        scanf("%d %d %d",&A.data[i].i,&A.data[i].j,&A.data[i].e);
    }
    for(i=1;i<=t2;i++)
    {
        scanf("%d %d %d",&B.data[i].i,&B.data[i].j,&B.data[i].e);
    }
    TSMatrix C;
    C=AddTSM(A,B);
    for(i=1;i<=C.tu;i++)
    {
        printf("%d %d %d\n",C.data[i].i,C.data[i].j,C.data[i].e);
    }
    return 0;
}

题目:7-2 三元组顺序表表示的稀疏矩阵加法(10 分) 解析: 题目给定两个三元组顺序表表示的稀疏矩阵A和B,要求计算A+B的结果,并将结果存储在新的三元组顺序表中。 三元组顺序表是将每个非零元素用一个元组表示,元组的三个分量分别表示该非零元素在矩阵中的行下标、列下标和元素值。因此,稀疏矩阵可以用三元组顺序表的形式进行存储。 对于矩阵加法,需要同时遍历A和B的三元组顺序表,按照行列下标逐个比较,将相同位置的元素相加存入新的三元组表中。如果仅在A或B中出现的元素,则直接将其插入新的三元组表中。 具体实现时,可以按照行下标升序、列下标升序的顺序遍历两个三元组顺序表,依次比较每个元素的行下标和列下标大小关系,实现如下: ```cpp typedef struct { int row, col; ElemType value; } Triple; typedef struct { Triple data[MAXSIZE]; int mu, nu, tu; // 稀疏矩阵的行数、列数和非零元素个数 } TSMatrix; void AddMatrix(TSMatrix A, TSMatrix B, TSMatrix &C) { int pa = 0, pb = 0, pc = 0; // pa、pb、pc分别为A、B、C当前扫描到的三元组的下标 // 矩阵行数、列数、非零元素个数与A相等 C.mu = A.mu; C.nu = A.nu; C.tu = 0; // 按行优先顺序遍历A、B while (pa < A.tu || pb < B.tu) { if (A.data[pa].row < B.data[pb].row || (A.data[pa].row == B.data[pb].row && A.data[pa].col < B.data[pb].col)) { // 将A当前元素插入C中 C.data[pc].row = A.data[pa].row; C.data[pc].col = A.data[pa].col; C.data[pc].value = A.data[pa].value; pa++; } else if (A.data[pa].row > B.data[pb].row || (A.data[pa].row == B.data[pb].row && A.data[pa].col > B.data[pb].col)) { // 将B当前元素插入C中 C.data[pc].row = B.data[pb].row; C.data[pc].col = B.data[pb].col; C.data[pc].value = B.data[pb].value; pb++; } else { // 两元素行列下标相同,则将它们的值相加后插入C中 C.data[pc].row = A.data[pa].row; C.data[pc].col = A.data[pa].col; C.data[pc].value = A.data[pa].value + B.data[pb].value; pa++; pb++; } // 确定新插入元素在C中的下标 if (C.data[pc].value != 0) { // 如果插入元素的值为0,则不在C中插入该元素 pc++; C.tu++; } } } ``` 时间复杂度分析:该算法需要同时遍历A、B三元组表,时间复杂度为O(t1+t2),其中t1、t2为A、B的非零元素个数。在最坏的情况下,A、B可以同时包含所有非零元素,此时时间复杂度为O(mn),其中m、n为矩阵的行数和列数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值