算法:两种矩阵转置算法(用三元组表示)

change的时间复杂度约为O(mu*nu),fastChange的时间复杂度约为O(mu+nu)

#include<iostream>
using namespace std;
typedef struct {
    int i, j, e;//行,列,元素值
}triple;

typedef struct {
    triple data[100];
    int mu, nu, tu;//行数,列数,非零元素数
}TSmatrix;

void change(TSmatrix m, TSmatrix &t)
{
    if (m.tu)
    {
        t.mu = m.nu, t.nu = m.mu, t.tu = m.tu;
        int q = 1;
        for (int col = 1; col <= m.nu; col++)
        {
            for(int p=1;p<=m.tu;p++)
            if(m.data[p].j==col)
            {
                //cout << q << endl;
                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;
            }
        }
    }
}

void fastChange(TSmatrix m, TSmatrix& t)
{
    t.mu = m.nu, t.nu = m.mu, t.tu = m.tu;
    if (!t.tu) return;
    int num[100], cpot[101];
    for (int i = 1; i <= m.nu; i++) num[i] = 0;
    for (int p = 1; p <= m.tu; p++) ++num[m.data[p].j];
    cpot[1] = 1;
    for (int p = 2; p <= m.nu; p++) cpot[p] = cpot[p - 1] + num[p - 1];
    for (int p = 1; p <= m.tu; p++)
    {
        int col = m.data[p].j;
        int 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];
    }
}
int main()
{
    TSmatrix m,t;
    m.mu = 6, m.nu = 6, m.tu = 8;
    m.data[1].i = 1, m.data[1].j = 2, m.data[1].e = 12;
    m.data[2].i = 1, m.data[2].j = 3, m.data[2].e = 9;
    m.data[3].i = 3, m.data[3].j = 1, m.data[3].e = -3;
    m.data[4].i = 3, m.data[4].j = 6, m.data[4].e = 14;
    m.data[5].i = 4, m.data[5].j = 3, m.data[5].e = 24;
    m.data[6].i = 5, m.data[6].j = 2, m.data[6].e = 18;
    m.data[7].i = 6, m.data[7].j = 1, m.data[7].e = 15;
    m.data[8].i = 6, m.data[8].j = 4, m.data[8].e = -7;
//change(m, t); fastChange(m, t); cout
<< t.data[8].i << " " << t.data[8].j << " " << t.data[8].e << endl; }

 

posted @ 2020-10-22 16:15  北陌南旬  阅读(201)  评论(0)    收藏  举报