稀疏矩阵,矩阵中非零元素的个数远小于矩阵元素总数,且非零元素的分布没有规律,可以称该矩阵为稀疏矩阵。如果还用一个row*col的矩阵去表示这些信息,浪费空间,可以对矩阵换一种存储结构,只需要记录矩阵中非零元素的位置和值。也就是通过三元表来完成一个稀疏矩阵的表示,此外还有通过链表,这里讲一下三元表的稀疏矩阵以及稀疏矩阵的打印,转置。 三元表的结构就是下图,注意它是按照先行后列升序的顺序存放的,之所以按照这个顺序存放,涉及打印的时候只需要一遍遍历稀疏矩阵判断就可以达到打印的目的,如果三元表中的每一项是乱序的还要达到打印的效果,每打印稀疏矩阵一个元素就要判断这个元素是否存在三元表,大大增加了时间复杂度。
typedef struct TRIPLE{
int row;
int col;
int value;
}TRIPLE;
typedef struct TSMATRIX {
TRIPLE *triple;
int matrix_row;
int matrix_col;
int num_count; //这个相当于triple数组的长度
}TSMATRIX;
1、三元表的初始化
初始化工作内容有:确定稀疏矩阵中元素个数以及确定稀疏矩阵的行列大小,然后给三元表申请好空间等待数据的录入。
void initSparseMatrix(TSMATRIX **tsMatrix, int matrix_row, int matrix_col, int num_count) {
TSMATRIX *tp;
if(NULL != (*tsMatrix) || (matrix_row*matrix_col < num_count)
|| matrix_col <= 0 || matrix_row <= 0) {
printf("ERROR INPUT DATA\n");
return;
}
tp = (TSMATRIX *)malloc(sizeof(TSMATRIX));
if(tp != NULL) { //有没有分配到空间怎么说
tp->triple = (TRIPLE *)calloc(sizeof(TRIPLE), num_count);
tp->matrix_row = matrix_row;
tp->matrix_col = matrix_col;
tp->num_count = num_count;
*tsMatrix = tp;
}
}
2、数据的录入
按照先行后列升序的顺序录入数据到三元表中, (row, col, value)为一组数据;
void insertDataToMatrix(TSMATRIX *tsMatrix) {
int i;
int row;
int col;
int value;
printf("Insert data by row and then col ascending(row, col, value)\n");
for(i = 0; i < tsMatrix->num_count; i++) {
printf("[%d/%d] data: ", i+1, tsMatrix->num_count);
scanf("%d%d%d", &row, &col, &value);
tsMatrix->triple[i].row = row;
tsMatrix->triple[i].col = col;
tsMatrix->triple[i].value = value;
}
}
3、打印稀疏矩阵
稀疏矩阵的信息是从三元表中得到的,三元表从第一个开始判断,然后逐个判断稀疏矩阵的位置在三元表中是否存在,存在的话就打印三元表的元素,同时三元表到下一个三元,不存在的话就打印0元素。