矩阵压缩章节

来源:互联网 发布:tessanne chin 知乎 编辑:程序博客网 时间:2024/04/28 23:29

/* 书上98页的5.1算法  2009-10-30  14:28*/

/*
 稀疏矩阵的转置 一般方法时间复杂在n.tu*m.tu
 三元组存储矩阵。
*/

/*
测试数据:
6 7
0 12 9 0 0 0 0
0 0 0 0 0 0 0
-3 0 0 0 0 14 0
0 0 24 0 0 0 0
0 18 0 0 0 0 0
15 0 0 -7 0 0 0

正确的话应该输出:
1 3 -3
1 6 15
2 1 12
2 5 18
3 1 9
3 4 24
4 6 -7
6 3 14
*/
#include<stdio.h>
#define SIZE 100

typedef struct three
{
 int i,j;
 int key;
}data;


int input(data *list,int r,int c)
{
 int i,j,x,t=0;
 for(i=1;i<=r;i++)
  for(j=1;j<=c;j++)
  {
   scanf("%d",&x);
   if(x!=0)
   {
    list[t].i=i;
    list[t].j=j;
    list[t++].key=x;
   }

  }
 return t;
}

void zz_matria(data *zlist,data *list,int t,int r,int c)
{
 int i,j,q=0;
 if(t)
 {
  for(i=1;i<=c;i++)
   for(j=0;j<t;j++)
   {
    if(list[j].j==i)
    {
     zlist[q].i=list[j].j;zlist[q].j=list[j].i;zlist[q++].key=list[j].key;
    }
   }
  
 }
 
 
}


int main()
{

 int r,c,t,i;
 data list[SIZE],zlist[SIZE];

 while(scanf("%d%d",&r,&c)!=EOF)
 {
  t=input(list,r,c);//t为非0元素个数
 
  zz_matria(zlist,list,t,r,c);
  // printf("%d/n",t);
  for(i=0;i<t;i++)
  {
   printf("%d %d %d/n",zlist[i].i,zlist[i].j,zlist[i].key);
  }
  
 }
 return 0;
}

 

--------------------

/*
稀疏矩阵的转置 m+n时间复杂  改进
三元组存储矩阵。
*/

/*
测试数据:
6 7
0 12 9 0 0 0 0
0 0 0 0 0 0 0
-3 0 0 0 0 14 0
0 0 24 0 0 0 0
0 18 0 0 0 0 0
15 0 0 -7 0 0 0

  正确的话应该输出:
  1 3 -3
  1 6 15
  2 1 12
  2 5 18
  3 1 9
  3 4 24
  4 6 -7
  6 3 14
*/
#include<stdio.h>
#include<string.h>
#define SIZE 100

typedef struct three
{
 int i,j;
 int key;
}data;


int input(data *list,int r,int c)
{
 int i,j,x,t=0;
 for(i=1;i<=r;i++)
  for(j=1;j<=c;j++)
  {
   scanf("%d",&x);
   if(x!=0)
   {
    list[t].i=i;
    list[t].j=j;
    list[t++].key=x;
   }
   
  }
  return t;
}

void zhuan(data *zlist,data *list,int t,int c)
{
 int i,p,q,j;
 int num[SIZE],cpot[SIZE];
 memset(num,0,sizeof(num));
 
  for(j=0;j<t;j++)
  {
  
    num[list[j].j]++;
  }
  
  
 
 
 cpot[1]=1;
 for(i=2;i<=c;i++)
 {
  cpot[i]=cpot[i-1]+num[i-1];
  //printf("%d ",cpot[i]);
 }
 //for(i=1;i<=c;i++)
 // printf("%d ",cpot[i]);
 //////////处理了num与copt////////////
 
 for(p=0;p<t;p++)
 {
  q=list[p].j;

  zlist[cpot[q]].i=list[p].j;
  zlist[cpot[q]].j=list[p].i;
  zlist[cpot[q]].key=list[p].key;
  cpot[q]++;
 }
 
}

int main()
{
 
 int r,c,t,i;
 data list[SIZE],zlist[SIZE];
 
 while(scanf("%d%d",&r,&c)!=EOF)
 {
  t=input(list,r,c);//t为非0元素个数
  
  zhuan(zlist,list,t,c);
  // printf("%d/n",t);
  for(i=1;i<=t;i++)
  {
   printf("%d %d %d/n",zlist[i].i,zlist[i].j,zlist[i].key);
  }
  
 }
 return 0;
}

 

原创粉丝点击