稀疏矩阵-----三元组顺序表

三元组顺序表

它是稀疏矩阵的一种压缩存储方式。

稀疏矩阵的三元组顺序表的存储表示

    typedef struct
    {
        int  i,j;       //该非零元的行列表示
        ElemType e;     //该非零元的值
    }Triple;
    typedef struct
    {
        Triple data[MAXSIZE];
        int mu,nu,tu;    //对应行,列,非零元的个数
    }TSMatrix;   

方法有两种:
普通

    void TransposeSMatrix(TSMatrix *M,TSMatrix *T)
    //T为转置后的三元组顺序表,M为转置前的三元组顺序表
    //这里不对data[0]作考虑,认为数组从1开始
    {
        int q;
        T->mu=M->nu;
        T->nu=M->mu;
        T->tu=M->tu;
        if(T->tu)   
        //确认矩阵中是否存在非零元
        {
            q=1;
            for(int col=1;col <= M->nu;++col)
                for(int p=1;p <= M->tu;++p)
                    if(M->data[p].j == col)
                    //从第一列开始,循环找到每一列中所有的元进行转置
                    {
                        T->data[q].i = M->data[p].j;
                        T->data[q].j = M->data[p].i;
                        T->data[q].e = M->data[p].e;
                        ++q;
                    }//if
        }//if
    }//TransposeSMatrix    

算法的时间复杂度:O(nu*tu);
如果tu==mu*nu,则时间复杂度为O(nu*nu*mu);
由此该算法适用于tu*<<*nu*mu的情况;

改进后

    void FastTransposeSMatrix(TSMatrix *M,TSMatrix *T)
    //T为转置后的三元组顺序表,M为转置前的三元组顺序表
    //这里不对data[0]作考虑,认为数组从1开始
    {
        int q,col;
        int *cpot=(int *)malloc(sizeof(int)*(M->nu+1));
        //cpot[col]表示M中第col列中第一个非零元在矩阵中的恰当位置
        int *num=(int *)malloc(sizeof(int)*(M->nu+1));
        //num[col]表示矩阵M中第col列种非零元的个数
        T->mu=M->nu;
        T->nu=M->mu;
        T->tu=M->tu;
        if(T->tu)   
        //确认矩阵中是否存在非零元
        {
            for(col=1;col <= M->nu;++col)
            //清零
                num[col]=0;
            for(int t=1;t <= M->tu;++t)
            //赋值
                ++num[M->data[t].j];
            cpot[1]=1;
            for(col=2;col <= M->nu;++col)
            //对每一列中第一个非零元的位置赋值
                cpot[col] = cpot[col-1]+num[col-1];
            for(int p=1;p <= M->tu; ++p)
            //转置
            {
                col=M->data[p].j;
                q=cpot[col];
                //对非零元的位置赋值
                T->data[q].i=M->data[p].j;
                T->data[q].j=M->data[p].i;
                T->data[q].e=M->data[p].e;
                ++cpot[col];
                //表示该列中不是第一个非零元的序号
            }//for
        }//if
    }//FastTransposeSMatrix

算法时间复杂度:O(nu+tu)
当tu=nu*mu时,时间复杂度为O(nu*mu)
增加了两个辅助变量

### 回答1: 稀疏矩阵加法是指对两个稀疏矩阵进行加法运算。其中,稀疏矩阵是指矩阵中大部分元素为的矩阵三元组顺序表是一种常用的稀疏矩阵存储方式。在三元组顺序表中,每个非零元素都用一个三元组示,包括该元素所在的行、列和元素值。 对于两个稀疏矩阵A和B,它们的三元组顺序表分别为tripletA和tripletB。稀疏矩阵加法的过程如下: 1. 首先,将tripletA和tripletB中的行、列信息进行比较,找出它们的交集,即两个矩阵中都存在的非零元素。 2. 对于交集中的每个元素,将它们的值相加,得到新的元素值。 3. 将新的元素值和行、列信息组成一个新的三元组,存储到结果矩阵三元组顺序表中。 4. 对于只存在于A或B中的非零元素,直接将它们添加到结果矩阵三元组顺序表中。 5. 最后,将结果矩阵三元组顺序表按行、列顺序排序,得到最终的结果矩阵。 以上就是三元组顺序表示的稀疏矩阵加法的过程。 ### 回答2: 稀疏矩阵加法指的是将两个稀疏矩阵进行相加的过程。在计算机的科学领域中,稀疏矩阵通常用三元组顺序表示。三元组顺序表是一种将非零元素按行优先次序存储的方式,通常包括三个属性:行、列和数值。行和列分别示非零元素在矩阵中的位置,数值则示该元素的值。 稀疏矩阵的加法与普通矩阵的加法不同,因为稀疏矩阵中大部分元素都是零,只有极少数为非零。因此在进行稀疏矩阵的加法时,我们只需对每个非零元素进行加和,并将结果存储在新的三元组顺序表中即可。 具体的算法步骤如下: 1. 定义两个稀疏矩阵 A 和 B,分别用三元组顺序表示; 2. 定义一个新的三元组顺序表 C,用于存储 A 和 B 的和; 3. 分别遍历 A 和 B,将它们的对应位置上的非零元素相加,并将结果存储在 C 中; 4. 将 C 输出即可。 需要注意的是,在对 A 和 B 的非零元素进行相加时,首先需要检查它们的行和列是否相同,只有相同的元素才能进行相加。同时,如果某个矩阵中存在没有对应的元素,也需要特殊处理。 总之,稀疏矩阵加法是一种简单但有效的方法,可以大幅度减少存储空间和计算复杂度,特别适用于处理大型稀疏矩阵。 ### 回答3: 在稀疏矩阵加法中,我们可以使用三元组顺序表的方式稀疏矩阵三元组顺序表是由三个一维数组构成,分别存储非零元素的行、列和数值。其中,行和列都按照行优先的顺序存储,即从左到右、从上到下。 在进行稀疏矩阵的加法时,我们需要先将两个矩阵转换为三元组顺序表的形式,并按照行列坐标的大小顺序进行合并。具体操作如下: 1. 遍历两个矩阵三元组顺序表,以行列坐标的大小顺序合并。 2. 如果两个三元组的行列坐标相同,则将它们的数值相加作为合并后的三元组的数值。 3. 如果两个三元组的行列坐标不同,则将行列坐标较小的三元组先存储。然后,向行列坐标较大的三元组方向移动,直到行列坐标相同,此时将数值相加,作为合并后的三元组的数值。 4. 合并后的三元组即为稀疏矩阵加法的结果矩阵三元组顺序表。 需要注意的是,合并后的结果三元组顺序表中可能存在相同的行列坐标的三元组,这时我们需要将它们的数值相加。另外,为了方便示,合并后的结果矩阵应当去除值为零的元素,即只保留非零元素。 总之,三元组顺序表示的稀疏矩阵加法需要先转换为三元组顺序表形式,然后按照行列坐标的大小顺序进行合并,并对合并后的结果进行去零处理,得到最终的结果三元组顺序表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值