前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[数据结构] 稀疏矩阵的存储

[数据结构] 稀疏矩阵的存储

作者头像
泰坦HW
发布2020-07-22 16:22:43
1.1K0
发布2020-07-22 16:22:43
举报
文章被收录于专栏:Titan笔记Titan笔记

【问题描述】

稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。

【基本要求】

以三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减的运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。

稀疏矩阵加减法例子

【Talk is cheap, show you the code】

代码语言:javascript
复制
#include<iostream>
// By Titan 2020-03-30
using namespace std;
typedef struct TupNode TUP;
typedef struct Matrix *TSM;

struct TupNode {
	int col;
	int row;
	int data;
};
struct Matrix {
	int cols;
	int rows;
	int nums;
	TUP data[100];
};

TSM inputData(int rows,int cols) {
	int a[rows][cols];
	for(int i=0; i<rows; i++) {
		for(int j=0; j<cols; j++) {
			cin>>a[i][j];
		}
	}
	TSM T=new Matrix;
	T->rows=rows;
	T->cols=cols;
	T->nums=0;
	for(int i=0; i<rows; i++) {
		for(int j=0; j<cols; j++) {
			if(a[i][j]!=0) {
				T->data[T->nums].data=a[i][j];
				T->data[T->nums].row=i;
				T->data[T->nums].col=j;
				T->nums++;
			}
		}
	}
	return T;
}

void printTSM(TSM T) {
	if(!T) {
		cout<<"Invalid TSMatrix!"<<endl;
		return;
	} else if(T->nums<=0) {
		cout<<"Invalid TSMatrix!"<<endl;
		return;
	}
	cout<< "Total Rows:" << T->rows << endl<<"Total Columns: " << T->cols << endl;
	cout<< "Non-Zero Elements Count: "<<T->nums<<endl;
	cout<<"--------------------------------------------------------"<<endl;
	cout<<"Row\tColumn\tData"<<endl;
	for(int i=0; i<T->nums; i++) {
		cout<<T->data[i].row
		    <<"\t"<<T->data[i].col
		    <<"\t"<<T->data[i].data
		    <<endl;
	}
}
void printAsArray(TSM T){
	if(!T){
		cout<<"Invalid TSMatrix!"<<endl;
		return;
	}
	int a,b,col,row,data;
	a=T->cols;
	b=T->rows;
	int arr[a][b];
	for(int i=0;i<a;i++){
		for(int j=0;j<b;j++){
			arr[i][j]=0;
		}
	}
	for(int i=0;i<T->nums;i++){
		col=T->data[i].col;
		row=T->data[i].row;
		data=T->data[i].data;
		arr[row][col]=data;
	}
	for(int i=0;i<b;i++){
		for(int j=0;j<a;j++){
			cout<<arr[i][j]<<"\t";
		}
		cout<<endl;
	}
}
void insertTSM(TSM T,int data,int row,int col){
	if(!T){
		return;
	}
	bool flag=true;
	for(int i=0;i<T->nums;i++){
		if(T->data[i].col==col && T->data[i].row == row){
			T->data[i].data+=data;
			if(T->data[i].data==0){
				for(int j=T->nums-1;j>i;j--){
					T->data[j-1]=T->data[j];
				}
				T->nums--;
			}
			flag=false;
			break;
		}
	}
	if(flag){
		T->data[T->nums].col=col;
		T->data[T->nums].row=row;
		T->data[T->nums].data=data;
		T->nums++;
	}

}
TSM addTSM(TSM T1,TSM T2){
	if(T1->cols!=T2->cols || T1->rows!=T2->rows){
		return NULL;
	}
	TSM NT=new Matrix();
	NT->cols=T1->cols;
	NT->rows=T1->rows;
	NT->nums=0;
	for(int i=0;i<T1->nums;i++){
		insertTSM(NT,T1->data[i].data,T1->data[i].row,T1->data[i].col);
	}
	for(int i=0;i<T2->nums;i++){
		insertTSM(NT,T2->data[i].data,T2->data[i].row,T2->data[i].col);
	}
	return NT;
}

TSM subTSM(TSM T1,TSM T2){
	for(int i=0;i<T2->nums;i++){
		T2->data[i].data=-T2->data[i].data;
	}
	return addTSM(T1,T2);
}

int main() {
	int a,b,choice=-1;
	cout<<"Please input the total rows and columns:"<<endl;
	cin>>a>>b;
	TSM T1=inputData(a,b);
	printTSM(T1);
	cout<<"Please input the total rows and columns:"<<endl;
	cin>>a>>b;
	TSM T2=inputData(a,b);
	printTSM(T2);
	TSM NewT;
	cout<<"Please select the action(0=Addition,1=Subtraction:)"<<endl;
	while(choice !=0 && choice!=1){
		cin>>choice;
		if(choice==0){
			NewT=addTSM(T1,T2);
		}else if(choice==1){
			NewT=subTSM(T1,T2);
		}else{
			cout<<"Invilid Choice!"<<endl;
		}
	}
	cout<<"The New TSMatrix is:"<<endl; 
	printTSM(NewT);
	cout<<"------------------------------------"<<endl;
	cout<<"The New Matrix is:"<<endl; 
	printAsArray(NewT);
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020年04月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【问题描述】
  • 【基本要求】
  • 【Talk is cheap, show you the code】
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档