[数据结构] 稀疏矩阵的存储
时间:2022-07-22
本文章向大家介绍[数据结构] 稀疏矩阵的存储,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
【问题描述】
稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。
【基本要求】
以三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减的运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。
稀疏矩阵加减法例子
【Talk is cheap, show you the code】
#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<<"RowtColumntData"<<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);
}
- android之listview缓存图片(缓存优化)
- 使用ASP.NET实现Model View Presenter(MVP)
- android性能优化1
- 百度地图之收索视野内的建筑物
- Line Counter - Writing a Visual Studio 2005 Add-In
- 百度地图之标注聚会
- How to Add an API to your Web Service
- 「微信小程序」剖析(四):原生的实时DOM转Virtual DOM
- 让你的「微信小程序」运行在Chrome浏览器上,让我们使用WebStorm
- android上拉下拉加载更多数据
- 「微信小程序」剖析(二):框架原理 | 在桌面浏览器上运行的尝试
- Working with Windows Workflow Foundation in ASP.NET
- 微信小程序剖析【下】:运行机制
- android多屏幕分辨率适配
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 找找规律——LeetCode题目6:Z字形变换
- 给你点信心——LeetCode题目7:整数反转
- Python -二叉树 创建与遍历算法(很详细,转自国外教程)
- APP流量来源追踪方式——Android篇
- 从浏览器输入网址回车到看到页面过程到底经历了什么?
- Flutter Bloc 官方文档(BlocBuilder翻译)
- OpenGL ES 3.0 | 统一变量和属性的概念与(在程序中的)获取流程、统一变量缓冲区对象详解、std140块规范、用 命名统一变量块 建立 统一变量缓冲区对象 的流程 和 相关API 和...
- 深入浅出SVM(PART III)
- 高频原题——LeetCode题目8:字符串转换整数 (atoi)
- 不转字符串判断——LeetCode题目9:回文数
- 关于双指针的简单理解
- 面试题噩梦之一——LeetCode题目10:正则表达式匹配
- 什么时候触发GC
- 找找数学上的规律——LeetCode题目11:盛最多水的容器
- Java学习笔记, 不断更新