当前位置: 首页 > news >正文

稀疏矩阵的压缩存储

目录

稀疏矩阵的定义

稀疏矩阵的转置

代码实现 

运行结果


 

稀疏矩阵的定义

假设在 m * n 的矩阵中,有 t 个元素不为零,且 t<<m*n,则称此矩阵为稀疏矩阵。按照常规的存储方法,稀疏矩阵很浪费内存空间,所以采取只存储非零元素的方式。但对于这类矩阵,通常零元素分布没有规律,为了能找到相应的元素,仅存储非零元素的值是不够的,还要记下它所在的行和列。对于稀疏矩阵,压缩存储的方式有很多种,如三元组顺序表,十字链表等。

稀疏矩阵的转置

【问题描述】

实现稀疏矩阵的三元组表存储和转置运算。

【输入形式】

输入一个整型的6阶稀疏矩阵。

【输出形式】

输出稀疏矩阵的三元组表形式,输出转置后的三元组表形式。

【样例输入】

10 0 0 0 0 0

0 -20 0 0 40 0

0 0 30 0 0 0

0 0 0 0 0 0

0 0 0 50 0 0

0 0 -60 0 0 70

【样例输出】

M

6 6 7

0 0 10

1 1 -20

1 4 40

2 2 30

4 3 50

5 2 -60

5 5 70

T

6 6 7

0 0 10

1 1 -20

2 2 30

2 5 -60

3 4 50

4 1 40

5 5 70

【样例说明】

M表示转置前矩阵,T表示转置后矩阵。6 6 7表示稀疏矩阵的mu,nu,tu,后面若干行为非零元素。(同行数据之间以空格分隔)

【评分标准】

采用三元组表结构存储矩阵。转置算法使用一般转置或快速转置算法均可。

代码实现 

算法实现基本步骤如下:

(1)M的行、列转换为T的列、行。

(2)按照M的列序来转置,找到M的每一列的非零元素,行列交换后顺序存储到T的三元组种。 

#include<stdio.h>
#define MAXSIZE 12500
typedef int ElemType;
typedef struct
{
	int i,j;
	ElemType e;	
}Triple;
typedef struct
{
	Triple data[MAXSIZE+1];
	int mu,nu,tu;
	
}TSMatrix;
void InitSMatrix(TSMatrix *t)
{
	t->mu = 6;
	t->nu = 6;
	t->tu = 0;
}
void CreatSMatrix(TSMatrix *t)
{
	int x,q=1;
	int a = 0 , b = -1;
	while(a < 6)
	{
		scanf("%d",&x);
		b ++ ;
		if(x != 0)     
		{
			t->tu ++;
			t->data[q].i = a;
			t->data[q].j = b;
			t->data[q].e = x;
			q ++ ;
		}
		if(b == 5)
		{
			printf("\n");
			a ++;
			b = -1;		
		}
	}
}
void TransposeSMatrix(TSMatrix *M, TSMatrix *T)
{
	int p,q,col;	
	T->mu = M->nu;
	T->nu = M->mu;
	T->tu = M->tu;	
	if(T->tu)
	{
		q=1;
		for(col=0;col<=M->nu-1;++col)
		{		
		  for(p=1;p<=M->tu;++p)		  
		    if(M->data[p].j==col)
		   {
		   	 T->data[q].i = M->data[p].j;
		   	 T->data[q].j = M->data[p].i;
		   	 T->data[q].e = M->data[p].e;
		   	 ++q;
		   }
	    }
	}
}
void Print(TSMatrix *t)
{
	printf("%d %d %d\n",t->mu,t->nu,t->tu);
	int q;
	for(q=1 ; q <= t->tu ; q++)
	{
		printf("%d %d %d\n",t->data[q].i,t->data[q].j,t->data[q].e);
	}
}


int main()
{
	TSMatrix M,T;
	InitSMatrix(&M);
	CreatSMatrix(&M);
	TransposeSMatrix(&M,&T);	
	printf("M\n");
	Print(&M);
	printf("T\n");
	Print(&T);
	return 0;
}

运行结果

428bf91a4b4c4c88bb767c2af5a419f7.png

 

相关文章:

  • 动手学习深度学习 08:机器视觉
  • CNN(卷积网络)如何处理Size(Shape)大小可变的输入图像数据
  • 小鱼的一键安装系列
  • Spring Cloud Alibaba-Ribbon的源码分析
  • MASA MAUI Plugin IOS蓝牙低功耗(三)蓝牙扫描
  • 30岁以上的程序员还死磕技术,别说拿高薪,可能连饭碗都会保不住
  • numpy快速处理数据学习笔记
  • C++多态详解
  • sqlserver sa 密码忘记 处理
  • 自定义流程,匹配业务需求,还得是专业流程引擎
  • 【Redis】八股文必背
  • 从0开始学c语言-总结04-一维、二维数组简单汇总
  • C/C++的类型转换
  • java基础10题
  • SpringBoot开发之Spring Boot入门
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • angular学习第一篇-----环境搭建
  • CODING 缺陷管理功能正式开始公测
  • create-react-app做的留言板
  • es的写入过程
  • JavaScript 奇技淫巧
  • LintCode 31. partitionArray 数组划分
  • Shell编程
  • springboot_database项目介绍
  • 半理解系列--Promise的进化史
  • 初探 Vue 生命周期和钩子函数
  • 服务器从安装到部署全过程(二)
  • 基于 Babel 的 npm 包最小化设置
  • 离散点最小(凸)包围边界查找
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 设计模式(12)迭代器模式(讲解+应用)
  • 深度解析利用ES6进行Promise封装总结
  • 使用Gradle第一次构建Java程序
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 探索 JS 中的模块化
  • 《天龙八部3D》Unity技术方案揭秘
  • ​2020 年大前端技术趋势解读
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (13):Silverlight 2 数据与通信之WebRequest
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (python)数据结构---字典
  • (Python第六天)文件处理
  • .aanva
  • .axf 转化 .bin文件 的方法
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET NPOI导出Excel详解
  • .NET 解决重复提交问题
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .net下的富文本编辑器FCKeditor的配置方法
  • .Net语言中的StringBuilder:入门到精通
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @Query中countQuery的介绍
  • @Valid和@NotNull字段校验使用
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限