1. 程式人生 > >資料結構——稀疏矩陣的轉置演算法

資料結構——稀疏矩陣的轉置演算法

本篇文章的程式碼基於【資料結構】【嚴蔚敏】【清華大學】

不是很想分函式來一遍解釋
資訊基本上都在註解裡
直接上完整程式碼好了

#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); //輸出轉置後的矩陣 }