内容:编写程序用三元组实现稀疏矩阵的按列转置操作
步骤:
算法分析:
首先了解稀疏矩阵的概念:设m*n矩阵中有t个非零元素且t<<m*n,这样的矩阵称为稀疏矩阵。由此可以看出,稀疏矩阵中会有大量的零元素,如果依旧按照常规方法顺序分配那将会很浪费内存,尤其是在一些许多科学管理与工程计算中,常常会遇到阶数很高的大型稀疏矩阵。为此提出一种新的存储方法——仅仅存放非零元素。将非零元素所在的行、列以及他的值构成一个三元组(i,j,v),然后按某种规律存储三元组。
所谓矩阵转置,是指变换元素的位置上,把位于(row,col)位置上的元素转换到(col,row)位置上,也就是说,把元素的行、列互换。
程序中设计了三个函数:
①函数InitSPNode()用来建立一个稀疏矩阵的三元组表。
首先输入行数、列数和非零元的值,输入(-1,-1,-1)结束输入。
②函数showMatrix()用来输出稀疏矩阵。
算法中按矩阵a的列进行循环处理,对a的每一列扫描三元组,找出相应的元素,若找到,则交换其行号和列号,并存储到矩阵b的三元组中。
③函数TransposeSMatrix()用来完成稀疏矩阵的转置算法。
算法主要的工作是在p和col的两重循环中完成,时间复杂度为O(n*t)。如果非零元素个数t和m*n同数量级,则算法的时间复杂度变为O(m*n^2)。
概要设计:
InitSPNode()函数 | 建立一个稀疏矩阵的三元组表 |
showMatrix()函数 | 输出稀疏矩阵 |
TransposeSMatrix()函数 | 完成稀疏矩阵的转置算法 |
程序流程图:
代码如下:
#include <stdio.h>
#include <string.h>
#define OK 1
#define Maxsize 10
typedef struct//定义三元组表
{
int i,j;//非零元素的行、列
int v;//非零元素的值
} SPNode;
typedef struct
{
SPNode data[Maxsize];
int m,n,t;//矩阵的行、列、非零元素的个数
}SPMatrix;
void InitSPNode(SPMatrix *a)//输入
{
int i,j,val,row,col;//行、列、值、当前最大行、最大列
int k;
row=0;col=0;
i=j=0;
k=0;
while(i!=-1&&j!=-1)
{
printf(" 输入(行、列、值)");
scanf("%d %d %d",&i,&j,&val);
a->data[k].i=i;
a->data[k].j=j;
a->data[k].v=val;
if(row<i) row=i;
if(col<j) col=j;
k++;
}
a->m=row;
a->n=col;
a->t=k-1;
}
void showMatrix(SPMatrix *a)//输出
{
int p,q;
int t=0;
for(p=0;p<=a->m;p++)
{
for(q=0;q<=a->n;q++)
{
if(a->data[t].i==p&&a->data[t].j==q)
{
printf("%d ",a->data[t].v);
t++;
}
else
printf("0 ");
}
printf("\n");
}
}
void TransposeSMatrix(SPMatrix *a,SPMatrix *b)//转置
{
int q,col,p;
b->m=a->n;
b->n=a->m;
b->t=a->t;
if(b->t)
{
q=0;
for(col=0;col<=a->n;++col)
for(p=0;p<a->t;++p)
if(a->data[p].j==col)
{
b->data[q].i=a->data[p].j;
b->data[q].j=a->data[p].i;
b->data[q].v=a->data[p].v;
++q;
}
}
}
void main()
{
SPMatrix a,b;
printf("\n 结束请输入(-1 -1 -1)\n");
InitSPNode(&a);
printf(" 输入矩阵为:\n");
showMatrix(&a);//转置前
TransposeSMatrix(&a,&b);
printf(" 输出矩阵为:\n");
showMatrix(&b);//转置后
}
运行结果: