演算法:兩種矩陣轉置演算法(用三元組表示)
阿新 • • 發佈:2020-10-22
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; }