8. 稀疏矩阵的乘法运算

8. 稀疏矩阵的乘法运算

成绩 10 开启时间 2014年11月1日 Saturday 08:00
折扣 0.8 折扣时间 2014年11月20日 Thursday 23:55
允许迟交 关闭时间 2014年11月23日 Sunday 23:55

数据压缩是提高传输、存储效率一种技术。教材第5章介绍了两种简单的压缩存储方法。

本实验要求实现两个稀疏矩阵相乘积的算法。其中稀疏矩阵非零元素数量小于100.

输入

第1个稀疏矩阵的行数
          列数
          非零元个数(三个数都大于0)
          三元组

第2个稀疏矩阵的行数
          列数
          非零元个数(三个数都大于0)
          三元组
   

以行为主序输入稀疏矩阵三元组表

输出

       乘积矩阵的行数
          列数
          非零元个数(三个数都大于0)
          三元组

  测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1 以文本方式显示
  1. 3↵
  2. 4↵
  3. 4↵
  4. 1 1 3↵
  5. 1 4 5↵
  6. 2 2 -1↵
  7. 3 1 2↵
  8. 4↵
  9. 2↵
  10. 4↵
  11. 1 2 2↵
  12. 2 1 1↵
  13. 3 1 -2↵
  14. 3 2 4↵
以文本方式显示
  1. 3↵
  2. 2↵
  3. 3↵
  4. 1,2,6↵
  5. 2,1,-1↵
  6. 3,2,4↵
1秒 256KB 0
#include
#include
typedef struct{
	int i, j;
	int e;
}Trip;
typedef struct{
	Trip data[1000];
	int rpos[1000];
	int mu, nu, tu;
}Matrix;
int main()
{
	int i;
	int arow;
	int tp;
	int p;
	int brow;
	int t;
	int q;
	int ccol;
	int ctemp[1000];
	int num[1000];
	int col;
	Matrix A, B, Q;
	scanf("%d%d%d", &A.mu, &A.nu, &A.tu);
	for (i = 1; i <= A.tu; i++)
		scanf("%d%d%d", &A.data[i].i, &A.data[i].j, &A.data[i].e);
	scanf("%d%d%d", &B.mu, &B.nu, &B.tu);
	for (i = 1; i <= B.tu; i++)
		scanf("%d%d%d", &B.data[i].i, &B.data[i].j, &B.data[i].e);
	for (col = 1; col <= A.mu; col++)
		num[col] = 0;
	for (i = 1; i <= A.tu; i++)
		num[A.data[i].i]++;
	A.rpos[1] = 1;
	for (col = 2; col <= A.mu; col++)
		A.rpos[col] = A.rpos[col - 1] + num[col - 1];
	for (col = 1; col <= B.mu; col++)
		num[col] = 0;
	for (i = 1; i <= B.tu; i++)
		num[B.data[i].i]++;
	B.rpos[1] = 1;
	for (col = 2; col <= B.mu; col++)
		B.rpos[col] = B.rpos[col - 1] + num[col - 1];
	Q.mu = A.mu;
	Q.nu = B.nu;
	Q.tu = 0;
	if (A.tu*B.tu != 0){
		for (arow = 1; arow <= A.mu; arow++){
			memset(ctemp, 0, sizeof(ctemp));
			Q.rpos[arow] = Q.tu + 1;
			if (arow < A.mu)
				tp = A.rpos[arow + 1];
			else
			{
				tp = A.tu + 1;
			}
			for (p = A.rpos[arow]; p < tp; p++){
				brow = A.data[p].j;
				if (brow < B.mu)
					t = B.rpos[brow + 1];
				else
				{
					t = B.tu + 1;
				}
				for (q = B.rpos[brow]; q < t; q++){
					ccol = B.data[q].j;
					ctemp[ccol] += A.data[p].e*B.data[q].e;
				}
			}
			for (ccol = 1; ccol <= Q.nu;ccol++)
			if (ctemp[ccol]){
				Q.tu++;
				Q.data[Q.tu].i = arow;
				Q.data[Q.tu].j = ccol;
				Q.data[Q.tu].e = ctemp[ccol];
			}
		}
	}
	printf("%d\n", Q.mu);
	printf("%d\n", Q.nu);
	printf("%d\n", Q.tu);
	for (i = 1; i <= Q.tu; i++)
		printf("%d,%d,%d\n", Q.data[i].i, Q.data[i].j, Q.data[i].e);
	return 0;
}

你可能感兴趣的:(BIT数据结构习题)