數據結構——稀疏矩陣的轉置算法

本篇文章的代碼基於【數據結構】【嚴蔚敏】【清華大學】web

不是很想分函數來一遍解釋
信息基本上都在註解裏
直接上完整代碼好了算法

#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);	//輸出轉置後的矩陣 
}
相關文章
相關標籤/搜索