稀疏矩阵的快速转置方法加详解

本次实验的题目如下,这是要求我们进行矩阵的转置,由于是稀疏矩阵,如果用普通的方法,将导致时间复杂度很高,所以我们采用快速转置的方法,降低复杂度。

此题有一个坑,这里的矩阵行列都是从0开始的。
在这里插入图片描述
话不多说,直接上代码,不懂得请私信我,我将为你解答。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef struct
{
	int row, col;//列数和行数
	int element;
}Triple;
typedef struct {
	Triple data[MaxSize];//定义三元组
	int m, n, length;//行数和列数
}TSMatrix;
void display(TSMatrix);//输出函数
TSMatrix transposeMatrix(TSMatrix);//转置函数

int main() {
	int x, y;//x表示行数,y表示列数
	scanf_s("%d%d", &x, &y);
	int i, j, e;//表示输入的行数,列数和数值
	TSMatrix A;//A为转置前的矩阵
	TSMatrix B;//B表示转置之后的矩阵
	int count = 0;//用来记录矩阵A的data这个数组的下标
	A.m = x, A.n = y, A.length = 0;//初始化
	for (int x=0; ; x++) {//死循环也可以,不可以在这里输入,然后再来判断输入不为0 0 0 时结束循环,因为这题是从0行0列开始的
		scanf_s("%d%d%d", &i, &j, &e);
		if (i == 0 && j == 0 && e == 0) break;//此题存在0行0列,所以必须是三个元素都为0时为结束条件,其实也可以改为for(scanf("%d%d%d",&i,&j,&e);e!=0;scanf("%d%d%d",&i,&j,&e))这个循环
		A.data[count].row = i, A.data[count].col = j, A.data[count].element = e;//将输入的元素
		A.length++, count++;
	}
	B=transposeMatrix(A);
	for (int i = 0; i < B.length; i++) {
		printf("%d %d %d\n", B.data[i].row, B.data[i].col, B.data[i].element);
	}
	return 0;
}

TSMatrix transposeMatrix(TSMatrix M) {//用N来返回转置之后的矩阵,所以
	int num[100], cpot[100];//num这个数组来存放每一列的非0元素的个数,cpot数组用来存放每一列的第一个非0元素的位置,以便转置之后,快速地找到其要存放的位置
	TSMatrix N;
	N.length = M.length, N.m = M.n, N.n = M.m;
	if (N.length != 0) {
		for (int col = 0; col <= M.n; col++) {//初始化数组num的值为0
			num[col] = 0;
		}
		cpot[0] = 0;//初始化cpot[0]=0,因为第一个数存放的位置一定时第0位或者说第一位
		for (int i = 0; i < M.length; i++) {//遍历三元组A,将每一列的非零元素的个数记录下来
			num[M.data[i].col]++;
		}
		for (int i = 1; i <= M.n; i++) {//此循环用来记录我们除输入的第一列以外的其他列的第一个非0元素的位置
			cpot[i] = cpot[i - 1] + num[i - 1];
		}
		int t, colnum;
		for (int i = 0; i < M.length; i++) {
			colnum = M.data[i].col;//用colnum来保存下M.data[i]这个元素的列数
			t = cpot[colnum];//用t记下这个元素在这列的第一个非零元素的位置,注意一点第一个非零元素在转置之后的话,就会成为对应行的第一个元素,所以可以这么直接转置
			N.data[t].row = M.data[i].col;
			N.data[t].col = M.data[i].row;
			N.data[t].element = M.data[i].element;
			cpot[colnum]++;//cpot数组在这一列的位置后移一位
		}
	}
	return N;
}

如果你有更好的解决方法,请留下你的方法,我们一起探讨。谢谢!!!

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小编程员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值