您的位置:首页 > 编程语言 > C语言/C++

稀疏矩阵的压缩存储及转置,快速转置法,C++代码实现

2010-10-20 23:57 761 查看
/*稀疏矩阵的压缩存储及转置*/
 
#include <iostream>
using namespace std;
 
/*三元组顺序表的类型定义*/
#define itemSize 100
 
typedef struct
{
       int row,col;
       int item;
}thNode;
 
typedef struct
{
       thNode * data;//data[0]不用
       int m,n,t;//分别表示行数、列数和非零元素个数
}thMatrix;
 
 
/*初始化三元组表*/
void initMatrix_Th(thMatrix &M)
{
       M.data=new thNode[itemSize+1];
       M.m=0;
       M.n=0;
       M.t=0;
}
 
/*转置三元组表*/
 
//一般方法,算法时间复杂度较高
void  transMatrix_1(thMatrix M,thMatrix &T)
{
       initMatrix_Th(T);
       T.m=M.n;
       T.n=M.m;
       T.t=M.t;
 
       if(T.t)
       {
              int p=1;//用来指M中的元素
              int q=1;//用来指T中的元素
              int col;//用来遍历列中的元素
 
              for(col=1;col<=M.n;col++)
              {
                     for(p;p<=M.t;p++)
                     {
                            if(M.data[p].col==col)
                            {
                                   T.data[q].row=M.data[p].col;
                                   T.data[q].col=M.data[p].row;
                                   T.data[q].item=M.data[p].item;
                                   q++;
                            }
                     }
              }
       }
}
 
//改进的方法——快速转置
void transMatrix_2(thMatrix M,thMatrix &T)
{
       initMatrix_Th(T);
       T.m=M.n;
       T.n=M.m;
       T.t=M.t;
      
       int i,j,p,q;
       int num[100];
       int cpot[100];
       if(T.t)
       {
              for(i=1;i<=M.n;i++)
                     num[i]=0;//M中每一列的非零元素个数初始化为0
              for(i=1;i<=M.t;i++)
                     ++num[M.data[i].col];//M中每一列的非零元素个数存储到一个数组中
              cpot[1]=1;
              for(i=2;i<=M.n;i++)
                     cpot[i]=cpot[i-1]+num[i-1];//每一列第一个非零元素的位置
              for(p=1;p<=M.t;p++)
              {
                     j=M.data[p].col;
                     q=cpot[j];//确定第j列第一个非零元素的位置
 
                     T.data[q].row=M.data[p].col;
                     T.data[q].col=M.data[p].row;
                     T.data[q].item=M.data[p].item;
                     ++cpot[j];//指向下一个位置
              }
                    
       }
}
 
/*创建一个三元组表*/
 
//按行优先存储
void creatMatrix(thMatrix &M,int n)
{
       initMatrix_Th(M);
 
       int i;
       cin>>M.m>>M.n;
       for(i=1;i<=n;i++)
       {
              cin>>M.data[i].row>>M.data[i].col>>M.data[i].item;
       }
       M.t=n;
}
 
/*输出一个三元组表*/
 
void outputMatrix(thMatrix M)
{
       int i;
       cout<<M.m<<" "<<M.n<<endl;
       cout<<M.t<<endl;
       for(i=1;i<=M.t;i++)
       {
              cout<<M.data[i].row<<" "<<M.data[i].col<<" "<<M.data[i].item<<endl;
       }
 
 
 
}
void main()
{
       thMatrix M;
       thMatrix T;
 
       creatMatrix(M,8);
       //outputMatrix(M);
       transMatrix_2(M,T);
       outputMatrix(T);
}

高兴啊,花了近三个小时的时间,最后终于写出来,编译过去了,虽然累,但是还是很高兴的啊,又掌握了一个好的算法!努力,加油!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  存储 c++ struct 算法