一次定位快速转置法

优点:使用一次循环就将三元组A转置到B

为啥能够减少一次循环,是由于当扫描元素的时候可以直接通过两个辅助的数组找到对应的元素,符合时间换空间。我开时侯的错误在在于三元数组并非是三维的,它是以二维形式存储的,再以以为的方式串起来;

起始面对稀疏矩阵有个很大的问题就是他的结构是要让他不变的,目的就是为了减少数据量的移动,同时我看代码的能力要加强。数据结构真的是思维完全不同的东西。任然要多练习。

1.A的没一列非零的个数和三元组B的每一行非零个数

2 待转置矩阵每一列的第一个非零元素在b中的正确位置

#define MAXSIZE 1000
#include <stdio.h>
#include <stdio.h>
typedef struct
{
	int row,col;
	int data;
}Triple;


typedef struct
{
	Triple data[MAXSIZE + 1];//多申请一个空间,让长度和下标一致。data[0]是空的
	int m, n, len;//矩阵的行数和列数,len是矩阵中非零元素的个数。
} TSMatrix;

 void FastTransposeTSMatrix(TSMatrix A, TSMatrix *B)
{
	int col, t, p, q;
	int num[MAXSIZE], position[ MAXSIZE ];
	B->len = A.len; B->n = A.m; B->m = A.n;
	if(B->len)
	{
		for (col = 2; col <= A.n; col++)
			num[col] = 0;//初始化num数组
		for (t = 1; t < A.len; t++)

			num[A.data[t].col]++;//num数组里面下标为col的位置加一

		position[1] = 1;
		for (col = 2; col <= A.n; col++)//计入a第n列的首个非零位置(n是a一共有n列)
			position[col] = position[col - 1] + num[col - 1];
		for (p = 1; p < A.n; col++)
		{
			col = A.data[p].col; q = position[col];
			B->data[q].row = A.data[p].col;
			B->data[q].col = A.data[p].row;
			B->data[q].row = A.data[p].e;
			position[col++];
		}
	}
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值