矩阵的快速转置算法
数据压缩是提高传输、存储效率一种技术。教材第5章介绍了两种简单的压缩存储方法。本实验要求实现三元组顺序表表示下的矩阵快速转置算法。
输入:
稀疏矩阵的行数、列数、非零元个数(三个数都大于0)
以行为主序输入稀疏矩阵三元组表
输出:
辅助数组num[ ]
辅助数组cpot[ ]
以行为主序输出对应的转置矩阵三元组表
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 256KB | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
#include<stdio.h>
#define MAXSIZE 9999
typedef struct{
int i,j; //该非零元行下标、列下标
int e; //值
}Triple;
typedef struct{
Triple data[MAXSIZE+1]; //非零元三元组表,不用data[0]
int mu,nu,tu; // 矩阵的行数、列数和非零元个数
}TSMatrix;
void FastTransposeSMatrix(TSMatrix a,TSMatrix &b){
b.mu=a.nu;
b.nu=b.mu;
b.tu=a.tu;
int count;
int col,t,p,q;
int num[a.nu+1],cpot[a.nu+1];
if(b.tu)
{
for(col=1;col<=a.nu;++col) num[col]=0;
for(t=1;t<=a.tu;++t) ++num[a.data[t].j];
cpot[1]=1;
for(col=2;col<=a.nu;++col) cpot[col]=cpot[col-1]+num[col-1];
printf("num:");
for(count=1;count<=a.nu;++count)
{
printf("%d,",num[count]);
}
printf("\n");
printf("cpot:");
for(count=1;count<=a.nu;++count)
{
printf("%d,",cpot[count]);
}
printf("\n");
for(p=1;p<=a.tu;++p){
col=a.data[p].j;
q=cpot[col];
b.data[q].i=a.data[p].j;
b.data[q].j=a.data[p].i;
b.data[q].e=a.data[p].e;
++cpot[col];
}
}
}
int main(){
TSMatrix a,b;
scanf("%d%d%d",&a.mu,&a.nu,&a.tu);
int count;
for(count=1;count<=a.tu;count++)
{
scanf("%d%d%d",&a.data[count].i,&a.data[count].j,&a.data[count].e);
}
FastTransposeSMatrix(a,b);
for(count=1;count<=b.tu;count++)
{
printf("%d,%d,%d\n",b.data[count].i,b.data[count].j,b.data[count].e);
//printf("%d\n",b.tu);
}
}