常熟理工学院
《数据结构与算法》实验指导与报告书
_2017-2018_____学年第__1__ 学期
专业:物联网工程
实验名称:特殊矩阵和稀疏矩阵
实验地点: N6-210 指导教师:聂盼红
计算机科学与工程学院
2017
实验五特殊矩阵和稀疏矩阵
【实验目的】
1、掌握数组的结构类型(静态的内存空间配置);通过数组的引用下标转换成该数据在内存中的地址;
2、掌握对称矩阵的压缩存储表示;
3、掌握稀疏矩阵的压缩存储-三元组表表示,以及稀疏矩阵的转置算法。
【实验学时】
2学时
【实验预习】
回答以下问题:
1、什么是对称矩阵?写出对称矩阵压缩存储sa[k]与aij之间的对应关系。
若n阶矩阵A中的元素满足下述性质:a ij=a ji,则称为n阶对称矩阵。
sa[k]与矩阵元素a ij之间存在着一一对应的关系:
若i>=j,k=i*(i+1)/2+j;
若i<j,k=j*(j+1)/2+i。
0<=i, j<=n-1 0<=k<=n*(n+1)/2-1
2、什么是稀疏矩阵?稀疏矩阵的三元组表表示。
假设在m×n的矩阵中,有t个元素不为零,且t<<m×n,则称此矩阵为稀疏矩阵。
稀疏矩阵的三元组成表示: 矩阵的行数、列数和非零元个数
【实验内容和要求】
1、编写程序,将对称矩阵进行压缩存储。
(1)对称矩阵数组元素A[i][j]转换成为以行为主的一维数组sa[k],请描述k与ij
的关系。
(注意C程序中,i,j,k均从0开始)
(2)调试程序与运行。
对称矩阵存储下三角部分即i>=j。
对称矩阵为3,9,1,4,7
9,5,2,5,8
1,2,5,2,4
4,5,2,1,7
7,8,4,7,9
参考程序如下:
#include<>
#define N 5
int main()
{
int upper[N][N]= {{3,9,1,4,7},
{9,5,2,5,8},
{1,2,5,2,4},
{4,5,2,1,7},
{7,8,4,7,9}
}; /*对称矩阵*/
int rowMajor[15]; /*存储转换数据后以行为主的数组*/
int Index; /*数组的索引值*/
int i,j;
printf("Two dimensional upper triangular array:\n");
for (i=0; i<N; i++) /*输出对称矩阵*/
{
for(j=0; j<N; j++)
printf("%3d",upper[i][j]);
printf("\n");
}
for(i=0; i<N; i++) /*进行压缩存储*/
for(j=0; j<N; j++)
if(i>=j) /*下三角元素进行存储*/
{
Index=i*(i+1)/2+j; /*ij与index的转换*/
rowMajor[Index]=upper[i][j];
}
printf("\nRow Major one dimensional array:\n");
for(i=0; i<15; i++) /*输出转换后的一维数组*/
printf("%3d", rowMajor[i]);
printf("\n");
return 1;
}
2、完成程序,实现稀疏矩阵的三元组表存储及稀疏矩阵的转置。
调试并给出结果:
补充完整程序,运行稀疏矩阵的一般转置算法;
完成稀疏矩阵的快速转置算法,并修改主函数的转置调用算法,验证快速转置算
法的正确性。
部分代码如下:
#include<>
#define MAXSIZE 20 /*非零元素个数最大值*/
typedef int ElemType;
typedef struct
{
int i,j;
ElemType e;
}Triple;
typedef struct
{
Triple data[MAXSIZE+1]; /*三元组表,data[0]不用*/
int mu,nu,tu; /*矩阵的行数、列数、非零元个数*/
}TSMatrix;
void TransposeSMatrix(TSMatrix *T,TSMatrix *M); /*一般转置算法*/ void FastTransposeSMatrix(TSMatrix *M,TSMatrix *T); /*快速转置算法*/
int main()
{
int i,j,k,q,col,p;
int temp[6][7]={{0,12,9,0,0,0,0}, /*稀疏矩阵*/
{0,0,0,0,0,0,0,},
{-3,0,0,0,0,14,0},
{0,0,24,0,0,0,0},
{0,18,0,0,0,0,0},
{15,0,0,-7,0,0,0},
};
TSMatrix T,M;
=6;
=7;
=0;
k=1;
for (i=0;i< ;i++) /*转换为稀疏矩阵的三元组表示*/ {
for (j=0;j< ;j++)
{
if (temp[i][j]!=0)
{
[k].i=i+1;
[k].j=j+1;
[k].e=temp[i][j];
k++;
}
}
}
=k-1;
FastTransposeSMatrix(&M,&T); /*调用转置算法进行转置*/
/*输出转置结果*/
printf("稀疏矩阵:\n");
for (i=0;i< ;i++) /*转换为稀疏矩阵的三元组表示*/ {
for (j=0;j< ;j++)
{
printf("%3d",temp[i][j]);
}
printf("\n");
}
printf("转置前M三元组表:\nmu\tnu\ttu\n"); printf("%d\t%d\t%d\n",,,;
printf("\ni\tj\te\n");
for (i=1;i<=;i++)
printf("%d\t%d\t%d\n",[i].i,[i].j,[i].e); printf("转置后T三元组表:\nmu\tnu\ttu\n"); printf("%d\t%d\t%d\n",,,;
printf("\ni\tj\te\n");
for (i=1;i<=;i++)
printf("%d\t%d\t%d\n",[i].i,[i].j,[i].e); }
/*稀疏矩阵的转置*/
void TransposeSMatrix(TSMatrix *M,TSMatrix *T)
{
int q,col,p;
T->mu=M->nu;
T->tu=M->tu;
if (T->tu)
{
q=1;
for (col=1;col<=M->nu;++col)
for (p=1;p<=M->tu;++p)
if (M->data[p].j==col)
{
T->data[q].i=M->data[p].j;
T->data[q].j=M->data[p].i;
T->data[q].e=M->data[p].e;
++q;
}
}
}
/*稀疏矩阵的快速转置算法*/
void FastTransposeSMatrix(TSMatrix *M,TSMatrix *T) {
int t,q,col,p,num[MAXSIZE],cpot[MAXSIZE];
T->mu=M->nu;
T->nu=M->mu;
if (T->tu)
{
/*快速转置过程的实现,请补充代码*/
for(col=1;col<=M->mu;++col)
num[col]=0; ]; ;
q=cpot[col];
T->data[q].i=M->data[p].j;
T->data[q].j=M->data[p].i;
T->data[q].e=M->data[p].e;
++cpot[col];
}
}
}
【实验小结】
本实验掌握了对称矩阵的压缩存储表示,稀疏矩阵的压缩存储-三元组表表示,以及稀疏矩阵的转置算法。
明白了可以改变矩阵的储存方式来节省内存空间,今后可以利用这一思想来节省内存。