資料結構——稀疏矩陣的轉置演算法
阿新 • • 發佈:2018-12-03
本篇文章的程式碼基於【資料結構】【嚴蔚敏】【清華大學】
不是很想分函式來一遍解釋
資訊基本上都在註解裡
直接上完整程式碼好了
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 非零元個數的最大值
typedef int ElemType;
typedef int Status;
#define OK 1
#define N 4
struct Triple {
int i,j; // 行下標,列下標
ElemType e; // 非零元素值
};
struct TSMatrix {
Triple data[MAXSIZE+1]; // 非零元三元組表,data[0]未用
int mu,nu,tu; // 矩陣的行數、列數和非零元個數
};
// 帶行連線資訊的三元組表
typedef struct{
Triple data[MAXSIZE+1]; // 非零元三元組表,data[0]未用
int rpos[MAXSIZE+1]; // 各行的第一個非零元的位置表
int mu,nu,tu; // 矩陣的行數、列數和非零元個數
}RLSMatrix;
Status TransposeSMatrix(TSMatrix M,TSMatrix &T)
{
// 求稀疏矩陣M的轉置矩陣T。演算法5.1
// 時間複雜度為O(nu*tu)
// 當tu和mu*nu同一個數量級時,時間複雜度會變為O(mu*nu^2)
// 因此適用於tu<<mu*nu情況時
int p,q,col;
T.mu=M.nu;
T.nu=M.mu;
T.tu=M.tu;
if(T.tu) {
q=1;
for(col=1; col<=M.nu; ++col)
for(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;
}
}
return OK;
}
Status TransposeSMatrix(RLSMatrix M,RLSMatrix &T)
{
// 求稀疏矩陣M的轉置矩陣T. 演算法5.2 快速轉置
int p,q,t,col,*num;
num=(int *)malloc((M.nu+1)*sizeof(int));
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(t=1; t<=M.tu; ++t) // 求M中每一列非零元個數
++num[M.data[t].j];
T.rpos[1]=1;
for(col=2; col<=M.nu; ++col) // 求M中第col中第一個非零元在T.data中的序號
T.rpos[col]=T.rpos[col-1]+num[col-1];
for(col=1; col<=M.nu; ++col) // T.rpos[col]的值不方便改變(別的操作會用到),故把值給到臨時變數num[col]
num[col]=T.rpos[col];
for(p=1; p<=M.tu; ++p) {
col=M.data[p].j;
q=num[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;
++num[col];
}
}
free(num);
return OK;
}
void initmatrix(TSMatrix &a,ElemType a1[][N])
{
a.mu=N;
a.nu=N;
a.tu=0;
for(int i=1;i<=a.mu;i++)
for(int j=1;j<=a.nu;j++)
{
if(a1[i-1][j-1]!=0)
{
a.tu++;
a.data[a.tu].i=i;
a.data[a.tu].j=j;
a.data[a.tu].e=a1[i-1][j-1];
}
}
}
void printmatrix(TSMatrix a)
{
a.tu=1;
for(int i=1;i<=a.mu;i++)
{
for(int j=1;j<=a.nu;j++)
{
if(a.data[a.tu].i==i&&a.data[a.tu].j==j)
{
printf("%d ",a.data[a.tu++].e);
}
else
printf("0 ");
}
printf("\n");
}
}
int main()
{
ElemType a1[N][N]= {{1,0,3,0},{0,1,0,0},{0,0,1,0},{0,0,1,1}};
TSMatrix M1,T1; //這裡用的是第一個三元組表和第一個轉置函式,暫時沒用帶行連線資訊的三元組表
initmatrix(M1,a1); //初始化,把二維陣列轉換成非零三元組表
//printmatrix(M1); //看一看轉置前的樣子
TransposeSMatrix(M1,T1);
printmatrix(T1); //輸出轉置後的矩陣
}