三元组顺序表表示的稀疏矩阵的初始化和快速转置

//三元组顺序表表示的稀疏矩阵的初始化

#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)小,大大节省了执行效率。

猜你喜欢

转载自blog.csdn.net/wangjingyihhh/article/details/84501359