稀疏矩阵转置--C语言


一、特殊矩阵的存储—稀疏矩阵

在这里插入图片描述

1.采用矩阵的常规存储方式实现矩阵转置

//稀疏矩阵转置  二维数组 
void TransMatrix(int source[m][n],int dest[n][m]){
	//source表示被转置的矩阵 dest表示转置后的矩阵
	int i,j;
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			dest[j][i]=source[i][j];   //行列对换 
		}
	} 
} 

2.采用三元组表方式实现矩阵转置

在这里插入图片描述
重新排序会大量移动元素,从而影响算法的效率,为了避免行列互换后重新排序引起的数据移动。
1、列序递增转置法
2、一次定位快速转置法

2.1 列序递增转置法

//列序递增转置法  三元组 
void TransposeTSMatrix(TSMatrix A,TSMatrix *B){
	int i,j,k;
	B->m=A->n;
	B->n=A->m; 
	B->len=A->len;
	if(B->len>0){
		j=1; //辅助计数器
		for(k=1;k<=A->n;k++){
			for(i=1;i<=A->len;i++){
				if(A->data[i]->col==k){
					B->data[j]->row=A->data[i]->col;
					B->data[j]->col=A->data[i]->row;
					B->data[j]->e=A->data[i]->e;
					j++;
				}
			}
		} 
	}
} 

在这里插入图片描述
存储空间减少,但时间复杂度并未降低。原因是要多次扫描稀疏矩阵三元组。
所以可否降低时间复杂度?
降低扫描三元组的次数(去掉双重循环)。
能否扫描一遍就找到位置?----一次定位快速转置法

2.2 一次定位快速转置法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
num[]数组计算方式?
在这里插入图片描述

position[]数组计算方式?
在这里插入图片描述

在这里插入图片描述
那么一次定位快速转置的具体做法??
在这里插入图片描述
在这里插入图片描述
……
……

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

//一次定位快速转置法 三元组
void FastTransposeTSMatrix(TSMatrix A,TSMatrix *B){
	int col,t,q,p;
	int num[MAXSIZE],position[MAXSIZE];
	B->m=A->n;
	B->n=A->m; 
	B->len=A->len;
	if(B->len>0){
		for(col=1;col<=A->n;col++){
			num[col]=0;
		}
		for(t=1;t<A.len;t++){
			num[A->data[t]->col]++;
		}
		position[1]=1;
		for(col=2;col<=A.n;col++){
			position[col]=num[col-1]+position[col-1];
		}
		for(p=1;p<A.len;p++){
			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]->e=A->data[p]->e;
			position[col]++;
		}
	}
} 

算法的时间耗费主要是4个并列的单循环上
在时间性能上优于递增转置法,但在空间耗费上增加了两个辅助向量空间


  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值