如果一个矩阵中,0元素占据了矩阵的大部分,那么这个矩阵称为“稀疏矩阵”。对于稀疏矩阵,传统的二维数组存储方式,会使用大量的内存来存储0,从而浪费大量内存。为此,可以用三元组的方式来存放一个稀疏矩阵。
对于一个给定的稀疏矩阵,设第r行、第c列值为v,且v不等于0,则这个值可以表示为 <。这个表示方法就称为三元组。那么,对于一个包含N个非零元素的稀疏矩阵,就可以用一个由N个三元组组成的表来存储了。
如:{<1, 1, 9>, <2, 3, 5>, <10, 20, 3>}就表示这样一个矩阵A:A[1,1]=9,A[2,3]=5,A[10,20]=3。其余元素为0。
要求查找某个非零数据是否在稀疏矩阵中,如果存在则输出其所在的行列号,不存在则输出ERROR。
(这道题其实简单,但我拿出来写的原因是在写这道题的时候我用了老师讲的解题的正确的思路步骤,感觉真的很清晰)
先写了主函数(定义一个矩阵,输入数据,比较,输出结果)具体怎么操作我先不考虑,先建立大的笼统地框架,接着一个个解决各种问题
矩阵的定义
方法:用一个结构体存放m, n, N(N<=500),分别表示稀疏矩阵的行数、列数和矩阵中非零元素的个数,其中每个元素又有自己的坐标与数值,所以我们在矩阵结构体中加入元素结构体(三元组数组)
typedef struct { //定义一个三元组 int i,j,value; }node; typedef struct { //定义一个稀疏矩阵 int m,n,num; node a[600]; //三元组数组 }matrix;
输入数据
方法:输入矩阵地行数列数与非零元素地个数,然后用for逐个元素输入对应地坐标与数值
void getdata(matrix &p) { //输入稀疏矩阵的行数列数及非零元素的个数 cin>>p.m>>p.n>>p.num; for(int i=0;i<p.num;i++) { cin>>p.a[i].i>>p.a[i].j>>p.a[i].value; } }
比较
方法:直接逐一比较所有的非零元素,如果匹配就把对应的坐标给x,y(引用类型)并退出整个循环(已经有结果就不用继续比较了)用个flag标记,最后判断flag的值来确定是否有相等的元素
bool compare(matrix p,int s,int &x,int &y) { //比较矩阵非零元素与S,若匹配则引用带回行标列标 int flag=0,i=0; while(p.num--) { //逐一比较非零元素 if(s==p.a[i].value) { //若相等则赋值并退出循环 x=p.a[i].i; y=p.a[i].j; flag=1; break; } else ++i; //不匹配则继续比较下一个 } if(flag) return true; else return false; }
输出结果
方法:接收并根据比较的结果来选择输出坐标还是error
总的过程如下:
#include <iostream> using namespace std; typedef struct { //定义一个三元组 int i,j,value; }node; typedef struct { //定义一个稀疏矩阵 int m,n,num; node a[600]; //三元组数组 }matrix; void getdata(matrix &p) { //输入稀疏矩阵的行数列数及非零元素的个数 cin>>p.m>>p.n>>p.num; for(int i=0;i<p.num;i++) { cin>>p.a[i].i>>p.a[i].j>>p.a[i].value; } } bool compare(matrix p,int s,int &x,int &y) { //比较矩阵非零元素与S,若匹配则引用带回行标列标 int flag=0,i=0; while(p.num--) { //逐一比较非零元素 if(s==p.a[i].value) { //若相等则赋值并退出循环 x=p.a[i].i; y=p.a[i].j; flag=1; break; } else ++i; //不匹配则继续比较下一个 } if(flag) return true; else return false; } int main() { int s,x,y; matrix p; //定义一个稀疏矩阵 getdata(p); //输入矩阵的数据 cin>>s; //输入查找的值 if(compare(p,s,x,y)) //返回比较结果 cout<<x<<" "<<y; else cout<<"ERROR"; return 0; }