当前位置:文档之家› 数据结构与算法 特殊矩阵和稀疏矩阵

数据结构与算法 特殊矩阵和稀疏矩阵

常熟理工学院《数据结构与算法》实验指导与报告书_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-12、什么是稀疏矩阵?稀疏矩阵的三元组表表示。

假设在m×n的矩阵中,有t个元素不为零,且t<<m×n,则称此矩阵为稀疏矩阵。

稀疏矩阵的三元组成表示: 矩阵的行数、列数和非零元个数【实验内容和要求】1、编写程序exp5_1.c,将对称矩阵进行压缩存储。

(1)对称矩阵数组元素A[i][j]转换成为以行为主的一维数组sa[k],请描述k与ij 的关系。

(注意C程序中,i,j,k均从0开始)(2)调试程序与运行。

对称矩阵存储下三角部分即i>=j。

对称矩阵为3,9,1,4,79,5,2,5,81,2,5,2,44,5,2,1,77,8,4,7,9参考程序如下:#include<stdio.h>#define N 5int 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、完成程序exp5_2.c,实现稀疏矩阵的三元组表存储及稀疏矩阵的转置。

调试并给出结果:•补充完整程序,运行稀疏矩阵的一般转置算法;•完成稀疏矩阵的快速转置算法,并修改主函数的转置调用算法,验证快速转置算法的正确性。

exp5_2.c部分代码如下:#include<stdio.h>#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;M.mu=6;M.nu=7;M.tu=0;k=1;for (i=0;i< M.mu;i++) /*转换为稀疏矩阵的三元组表示*/ {for (j=0;j< M.nu;j++){if (temp[i][j]!=0){M.data[k].i=i+1;M.data[k].j=j+1;M.data[k].e=temp[i][j];k++;}}}M.tu=k-1;FastTransposeSMatrix(&M,&T); /*调用转置算法进行转置*//*输出转置结果*/printf("稀疏矩阵:\n");for (i=0;i< M.mu;i++) /*转换为稀疏矩阵的三元组表示*/ {for (j=0;j< M.nu;j++){printf("%3d",temp[i][j]);}printf("\n");}printf("转置前M三元组表:\nmu\tnu\ttu\n");printf("%d\t%d\t%d\n",M.mu,M.nu,M.tu);printf("\ni\tj\te\n");for (i=1;i<=M.tu;i++)printf("%d\t%d\t%d\n",M.data[i].i,M.data[i].j,M.data[i].e); printf("转置后T三元组表:\nmu\tnu\ttu\n");printf("%d\t%d\t%d\n",T.mu,T.nu,T.tu);printf("\ni\tj\te\n");for (i=1;i<=T.tu;i++)printf("%d\t%d\t%d\n",T.data[i].i,T.data[i].j,T.data[i].e); }/*稀疏矩阵的转置*/void TransposeSMatrix(TSMatrix *M,TSMatrix *T){int q,col,p;T->mu=M->nu;T->nu=M->mu;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;T->tu=M->tu;if (T->tu){/*快速转置过程的实现,请补充代码*/for(col=1;col<=M->mu;++col)num[col]=0; //num数组的初始化for(t=1;t<=M->tu;++t)++num[M->data[t].j]; //求M中每一列的非零元素的个数 cpot[1]=1; //求col列中第一个非零元素在T中序号for( col=2;col<=M->nu;++col) //求cpot数组的值cpot[col]=cpot[col-1]+num[col-1];for( p=1;p<=M->tu;++p) //进行转置{col=M->data[p].j;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];}}}【实验小结】本实验掌握了对称矩阵的压缩存储表示,稀疏矩阵的压缩存储-三元组表表示,以及稀疏矩阵的转置算法。

明白了可以改变矩阵的储存方式来节省内存空间,今后可以利用这一思想来节省内存。

. .。

相关主题