首页 > 代码库 > 稀疏矩阵三元存储下的计算器
稀疏矩阵三元存储下的计算器
又是一个实验题:三元数组存储稀疏矩阵,同时实现基本的加法,减法,乘法,求逆
思路:
首先规范好输入情况
明确三元数组的数据结构和输入特征( 行优先输入
)
将稀疏矩阵建立成三元数组和三元数组转化输出
数组的加法,减法(
根据输入的行与列来判断是否可以进行
最后的运算结果仍是稀疏矩阵
输出结果为矩阵
)
思路实现
明确三元数组的数据结构和输入特征( 行优先输入
)
typedef struct { int row; int col; ElementType value;}Triple;typedef struct { Triple data[MAXSIZE]; int rows,cols,nums;//非零起}TSMatrix;
将稀疏矩阵建立成三元数组和三元数组转化输出
PtrTSMatrix CreatMatrix( void ){ int count = 0; PtrTSMatrix Matrix; Matrix = ( PtrTSMatrix )malloc( sizeof( TSMatrix ) ); if( Matrix == NULL ) { printf("Not Space\n "); exit( 0 ); } printf("输入行与列\n"); scanf("%d%d",&Matrix->rows,&Matrix->cols); printf("输入矩阵的元素的行,列,值( -1 结束 ,行优先)\n"); scanf("%d%d%d",&Matrix->data[count].row,&Matrix->data[count].col,&Matrix->data[count].value); while( Matrix->data[count].row != -1 ) { count++; scanf("%d%d%d",&Matrix->data[count].row,&Matrix->data[count].col,&Matrix->data[count].value); if( Matrix->data[count].row < Matrix->data[count-1].row && Matrix->data[count].row!=-1 ) { printf("未按行输出:\n"); getchar(); exit(0); }//if }//while Matrix->nums = count; return Matrix;}/* CreatMatrix *//* print the matrix Matrix by using matrix */void PrintMatrix( PtrTSMatrix Matrix ){ int i,j; int count = 0; for( i=0; i<Matrix->rows; i++ ) { for( j=0; j<Matrix->cols; j++ ) { if( count<Matrix->nums && i==Matrix->data[count].row-1 && j==Matrix->data[count].col-1 ) { printf("%2d",Matrix->data[count].value); count++; } else { printf("%2d",0); }//if-else }//for printf("\n"); }//for}/* PrintMatrix */PtrTSMatrix CreatMatrix( void ){ int count = 0; PtrTSMatrix Matrix; Matrix = ( PtrTSMatrix )malloc( sizeof( TSMatrix ) ); if( Matrix == NULL ) { printf("Not Space\n "); exit( 0 ); } printf("输入行与列\n"); scanf("%d%d",&Matrix->rows,&Matrix->cols); printf("输入矩阵的元素的行,列,值( -1 结束 ,行优先)\n"); scanf("%d%d%d",&Matrix->data[count].row,&Matrix->data[count].col,&Matrix->data[count].value); while( Matrix->data[count].row != -1 ) { count++; scanf("%d%d%d",&Matrix->data[count].row,&Matrix->data[count].col,&Matrix->data[count].value); if( Matrix->data[count].row < Matrix->data[count-1].row && Matrix->data[count].row!=-1 ) { printf("未按行输出:\n"); getchar(); exit(0); }//if }//while Matrix->nums = count; return Matrix;}/* CreatMatrix */
数组的加法,减法(
根据输入的行与列来判断是否可以进行
最后的运算结果仍是稀疏矩阵
)
一般人最先想到的是两个for循环吧,那么算法的效率为 O( M *N ),我将算法稍稍改进了一下,优化到了 O(M+N ),具体思路如下
1 | 1 | 1 |
2 | 2 | 2 |
3 | 3 | 3 |
x | y | vaule |
类似上面那个三元组,在一个矩阵中想要确认位置需要x,y两个数据,实际上我可以把它回归到它在内存中存储得形式,即是线性存储,每一元素有唯一得一个对应值(假设矩阵为3×3),这样在就可以在一次循环中比较了
1 | 1 |
5 | 2 |
9 | 3 |
flag | vaule |
while( 没有一个三元组被遍历完 )
{
if(俩个三元组位置相同)
{
将两个三元组得位置信息和和传递给新的三元组
两个三元组都向后移一位
}
elseif( 其中一个三元组的元素在另一个之前 )
{
将位于前面得元素的位置信息和值传给新得三元组
向后移一位
}
}
/* Plus A and B ,return C */PtrTSMatrix AddMatrix( PtrTSMatrix A, PtrTSMatrix B ){ int i=0,j=0;//标记追逐 A B PtrTSMatrix C;//存放和 if( A->rows!=B->rows || A->cols!=B->cols ) { return NULL; } C = ( PtrTSMatrix )malloc(sizeof( TSMatrix )); C->rows = A->rows; C->cols = A->cols; C->nums = -1; //初始化 while( i<A->nums && j<B->nums ) { if( A->data[i].row*A->cols+A->data[i].col == B->data[j].row*B->cols+B->data[j].col ) { if( A->data[i].value+B->data[j].value != 0 ) { C->nums++; C->data[C->nums].col = A->data[i].col; C->data[C->nums].row = A->data[i].row; C->data[C->nums].value = http://www.mamicode.com/A->data[i].value+B->data[j].value; } i++; j++;//标记后移 } else if( A->data[i].row*A->cols+A->data[i].col < B->data[j].row*B->cols+B->data[j].col ) { C->nums++; C->data[C->nums].col = A->data[i].col; C->data[C->nums].row = A->data[i].row; C->data[C->nums].value = http://www.mamicode.com/A->data[i].value; i++; } else { C->nums++; C->data[C->nums].col = B->data[j].col; C->data[C->nums].row = B->data[j].row; C->data[C->nums].value = http://www.mamicode.com/B->data[j].value; j++; }//if-else }//while, if( i == A->nums ) { while( j < B->nums ) { C->nums++; C->data[C->nums].col = B->data[j].col; C->data[C->nums].row = B->data[j].row; C->data[C->nums].value = http://www.mamicode.com/B->data[j].value; j++; } } else { while( i < A->nums ) { C->nums++; C->data[C->nums].col = A->data[i].col; C->data[C->nums].row = A->data[i].row; C->data[C->nums].value = http://www.mamicode.com/A->data[i].value; i++; } }//if-else C->nums++; return C;}//AddMatrix
稀疏矩阵三元存储下的计算器