压缩比的计算公式为:
【输入形式】依次输入4行4列的元素值,每个值用空格分开
【输出形式】假设有n个非零元,则每行输出一个三元组(每个值占4个字符,右对齐),再输出压缩比(保留两位小数)
【样例输入】
12 0 0 0
0 3 0 0
0 0 0 0
1 0 0 -20
【样例输出】
0 0 12
1 1 3
3 0 1
3 3 -20
1.33
代码实现:
#include <stdio.h>
#include<malloc.h>
#define OK 1
#define TRUE 1
#define FALSE 0
#define ROWS 4
#define COLMUNS 4
typedef int Status;
typedef int ElemType;
//三元组顺序表的类型定义
#define MAXSIZE 1000
#define MAXRC 1000
//定义三元组存储的结构体类型
typedef struct
{
int i,j;
ElemType e;
}Triple;
typedef struct
{
Triple data[MAXSIZE];
int mu,nu,tu;
}TSMatrix;
//实现稀疏矩阵的三元组存储
//建立三元表
Status CreateM(TSMatrix *M,int a[],int row,int col)
{
int i;
int k=0; //保存非零元素个数
for(i = 0;i < row*col;i++)
if(a[i] != 0)
{
M->data[k].i=i/col;
M->data[k].j=i%col;
M->data[k].e=a[i];k++;
}
if(k)
{
M->mu =row;
M->nu=col;
M->tu=k;
return TRUE;
}
else
return FALSE;
}
//输出三元组表
void PrintM(TSMatrix* M)
{
int k;
for(k = 0;k < M->tu;k++)
printf("%4d%4d%4d\n",M->data[k].i,M->data[k].j,M->data[k].e);
}
//求压缩比
float compressionRatio(TSMatrix *M)
{
float i;
i=((M->mu)*(M->nu)*1.0f*sizeof(ElemType)/((M->tu)*sizeof(Triple)));
return i;
}
//然后在在主函数中调用该方法,求压缩存储的压缩比,并输出结果
int main(int argn,char *argv[])
{
int a[ROWS][COLMUNS];
int i,j;
TSMatrix *H=(TSMatrix *)malloc(sizeof(TSMatrix));
for(i=0;i< ROWS;i++) //输入二维数组的元素值
{
for(j=0;j< COLMUNS;j++)
{
scanf("%d",&a[i][j]);
}
}
CreateM(H,*a, ROWS, COLMUNS);
PrintM(H);
printf("%.2lf",compressionRatio(H));
return 0;
}