1. 程式人生 > 實用技巧 >演算法:兩種矩陣轉置演算法(用三元組表示)

演算法:兩種矩陣轉置演算法(用三元組表示)

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; }