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

本文介绍了一种使用三元组顺序表表示稀疏矩阵的方法,并详细阐述了如何通过初始化过程和快速转置算法进行操作。快速转置算法利用num和cpot数组,避免了在原矩阵中多次遍历寻找转置矩阵每一行的元素,显著提高了执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值