稀疏矩阵采用三元组存储,设计算法求两个矩阵的和。
2016-10-16 22:00
197 查看
稀疏矩阵采用三元组存储,设计算法求两个矩阵的和。
看着提交时间快结束了,写一篇博客。
我感觉我代码的亮点是求和的时候,判断一下上一个三元表是否有,没有的话在新开辟一个,最后加完,用c++库函数排序一下,这样就可以输出了。
时间复杂度没仔细算(求大神点评),空间复杂度降低了。欢迎一起研究思路。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define MAX 100
typedef struct {
int i,j;
int e;
}Triple;
typedef struct {
Triple data[MAX+1];
int mu,nu,tu;//矩阵的行数、列数、和非零元个数
}TSMatrix;
bool cmp(Triple a,Triple b)
{//降序排一下
if(a.i==b.i)//如果他们横坐标相同,按纵坐标排一下
{
return a.j<b.j;
}
else
{
return a.i<b.i;
}
}
void Input(TSMatrix &T)
{//输入
int tmp;
for(int i=1;i<=T.mu;i++)
{
for(int j=1;j<=T.nu;j++)
{
scanf("%d",&tmp);
if(tmp!=0)//非0元素就保存
{
T.data[T.tu].i=i;
T.data[T.tu].j=j;
T.data[T.tu].e=tmp;
T.tu++;
}
}
}
}
void Output(TSMatrix T)
{//输出
int i,j,k=0;
for(i=1;i<=T.mu;i++)
{
for(j=1;j<=T.nu;j++)
{
if(T.data[k].i==i&&T.data[k].j==j)
{
printf("%d ",T.data[k++].e);
}
else
printf("0 ");
}
putchar('\n');
}
}
int jdg(Triple q,TSMatrix T1,int &tmp_k)
{//判断此位置是否有非0元素
int flag=0;
for(int i=0;i<T1.tu;i++)
{
if(T1.data[i].i==q.i&&T1.data[i].j==q.j)
{
tmp_k=i;
flag=1;
break;
}
}
if(flag)
return 1;
return 0;
}
void sum(TSMatrix &T1,TSMatrix T2)
{
int k=0,tmp_k;
for(int i=0;i<T2.tu;i++)
{
if(jdg(T2.data[i],T1,tmp_k))//判断这个位置T1有没有
{
T1.data[tmp_k].e+=T2.data[i].e;//这个位置有,直接加上
}
else//这个位置没有开辟一下
{
T1.data[T1.tu].i=T2.data[i].i;
T1.data[T1.tu].j=T2.data[i].j;
T1.data[T1.tu++].e=T2.data[i].e;
}
}
sort(T1.data,T1.data+T1.tu,cmp
4000
);//进行排序一下,方便输出
}
int main()
{
TSMatrix T1,T2;
int tmp,q=0;
printf("请输入矩阵的行数和列数\n");
scanf("%d%d",&T1.mu,&T1.nu);
T2.mu=T1.mu;
T2.nu=T1.nu;
T1.tu=0;
printf("请输入矩阵T1\n");
Input(T1);
//Output(T1);
T2.tu=0;
printf("请输入矩阵T2\n");
Input(T2);
//Output(T2);
sum(T1,T2);
Output(T1);
return 0;
}
看着提交时间快结束了,写一篇博客。
我感觉我代码的亮点是求和的时候,判断一下上一个三元表是否有,没有的话在新开辟一个,最后加完,用c++库函数排序一下,这样就可以输出了。
时间复杂度没仔细算(求大神点评),空间复杂度降低了。欢迎一起研究思路。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define MAX 100
typedef struct {
int i,j;
int e;
}Triple;
typedef struct {
Triple data[MAX+1];
int mu,nu,tu;//矩阵的行数、列数、和非零元个数
}TSMatrix;
bool cmp(Triple a,Triple b)
{//降序排一下
if(a.i==b.i)//如果他们横坐标相同,按纵坐标排一下
{
return a.j<b.j;
}
else
{
return a.i<b.i;
}
}
void Input(TSMatrix &T)
{//输入
int tmp;
for(int i=1;i<=T.mu;i++)
{
for(int j=1;j<=T.nu;j++)
{
scanf("%d",&tmp);
if(tmp!=0)//非0元素就保存
{
T.data[T.tu].i=i;
T.data[T.tu].j=j;
T.data[T.tu].e=tmp;
T.tu++;
}
}
}
}
void Output(TSMatrix T)
{//输出
int i,j,k=0;
for(i=1;i<=T.mu;i++)
{
for(j=1;j<=T.nu;j++)
{
if(T.data[k].i==i&&T.data[k].j==j)
{
printf("%d ",T.data[k++].e);
}
else
printf("0 ");
}
putchar('\n');
}
}
int jdg(Triple q,TSMatrix T1,int &tmp_k)
{//判断此位置是否有非0元素
int flag=0;
for(int i=0;i<T1.tu;i++)
{
if(T1.data[i].i==q.i&&T1.data[i].j==q.j)
{
tmp_k=i;
flag=1;
break;
}
}
if(flag)
return 1;
return 0;
}
void sum(TSMatrix &T1,TSMatrix T2)
{
int k=0,tmp_k;
for(int i=0;i<T2.tu;i++)
{
if(jdg(T2.data[i],T1,tmp_k))//判断这个位置T1有没有
{
T1.data[tmp_k].e+=T2.data[i].e;//这个位置有,直接加上
}
else//这个位置没有开辟一下
{
T1.data[T1.tu].i=T2.data[i].i;
T1.data[T1.tu].j=T2.data[i].j;
T1.data[T1.tu++].e=T2.data[i].e;
}
}
sort(T1.data,T1.data+T1.tu,cmp
4000
);//进行排序一下,方便输出
}
int main()
{
TSMatrix T1,T2;
int tmp,q=0;
printf("请输入矩阵的行数和列数\n");
scanf("%d%d",&T1.mu,&T1.nu);
T2.mu=T1.mu;
T2.nu=T1.nu;
T1.tu=0;
printf("请输入矩阵T1\n");
Input(T1);
//Output(T1);
T2.tu=0;
printf("请输入矩阵T2\n");
Input(T2);
//Output(T2);
sum(T1,T2);
Output(T1);
return 0;
}
相关文章推荐
- 稀疏矩阵的三元组表示的实现及应用(2)——采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法
- 数据结构 数组操作 稀疏矩阵采用三元组存储,设计算法求两个矩阵的和。
- 假设nn的稀疏矩阵A采用三元组表示,设计一个程序exp6-4.cpp实现如下功能:
- 稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结
- 稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结
- 稀疏矩阵的三元组存储算法
- 稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结
- 利用稀疏矩阵的“三元组表”存储结构,实现两个矩阵的相加。
- 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)
- 数组与广义表_稀疏矩阵的压缩存储_三元组做存储结构_矩阵相乘
- 稀疏矩阵的三元组存储
- 稀疏矩阵的三元组存储结构
- 稀疏矩阵的三元组存储和逆置
- 稀疏线性系统求解算法 之 存储结构(MCRF) 强于二维数组、三元组、行压缩、修正行压缩等
- 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)
- 第九周--建立稀疏矩阵三元组表示算法库
- 稀疏矩阵的三元组顺序表存储
- 用三元组存储稀疏矩阵并实现转置
- 稀疏矩阵--三元组表来压缩存储及转置
- 第九周项目3 建立稀疏矩阵三元组算法库