1. 程式人生 > >三元組順序表表示的稀疏矩陣的初始化和快速轉置

三元組順序表表示的稀疏矩陣的初始化和快速轉置

//三元組順序表表示的稀疏矩陣的初始化

#include <stdio.h>
#include<stdlib.h>
#include"constant.h"
#define MAXSIZE 12500//假設非零元最大個數為12500

typedef int ElemType;

typedef struct{
	int i,j;//非零元行下標和列下標
	ElemType e;//資料域
}Triple;

typedef struct{
	Triple data[MAXSIZE+1];//data[0]未使用
	int mu,nu,tu;//三元組矩陣的行數,列數和非零元個數
}TSMatrix;//三元組的儲存表示

//三元組初始化
Status Init_tsmatrix(TSMatrix *M)
{
	int m,n,t;
	printf("Inpnt the row of the TSMatrix:");
	scanf("%d",&m);
	printf("Input the clown of the TSMatrix:");
	scanf("%d",&n);
	printf("Input the number of the TSMatrix:");
	scanf("%d",&t);
	printf("Input the data in row order\n ");
	if(m>0&&n>0){
		if(t<=MAXSIZE)
	    {
		    for(int k=1;k<=t;k++)
		    {
			    scanf("%d%d%d",&M->data[k].i,&M->data[k].j,&M->data[k].e);
			    if(M->data[k].i>m||M->data[k].j>n) 
		        return ERROR;
		    }
	    }else return ERROR;
	}else{
		M->mu=0;M->nu=0;M->tu=0;
	}
	
	M->mu=m;M->nu=n;M->tu=t;
	return OK;
}

//三元組矩陣的快速轉置

其中,為防止在M中多次遍歷以尋找T中每一行的元素,用num陣列記錄M每一列非零元出現的次數,並由此算出每一列的第一個非零元在T中的下標位置,用cpot陣列記錄

Status FastTransposeSMatrix(TSMatrix M,TSMatrix *T)//M轉置後放在T中
{
        T->mu=M.nu;//行列互換
	T->nu=M.mu;
	T->tu=0;
    int num[M.nu+1],cpot[M.nu+1];num[0],cpot[0]均不使用
    int col,t,p,q;
    if(M.tu)//三元組不為空 
	{
    	for(col=1;col<=M.nu;col++)  num[col]=0;
    	for(t=1;t<=M.tu;t++) ++num[M.data[t].j];//記錄M中每一列的元素個數 
    	cpot[1]=1;//第一行元素起始下標為1
    	for(col=2;col<=M.nu;col++) cpot[col]=cpot[col-1]+num[col-1];//cpot陣列記錄T中每一行起始元素下標
		for(p=1;p<=M.tu;p++)//逐個移入T陣中 //遍歷一遍M矩陣即可得到T矩陣
		{
			col=M.data[p].j; 
			q=cpot[col];
			T->data[q].j=M.data[p].i;
			T->data[q].i=M.data[p].j;
			T->data[q].e=M.data[p].e;
			cpot[col]++;//此時要把該行起始元素對應的下標後移一位 
		}
		T->tu=M.tu;//非零元個數不變
    }
    return OK;
}

該演算法時間複雜度為O(mu*nu),比轉置的一般演算法(每求一列迴圈一次)的複雜度O(n*tu)小,大大節省了執行效率。