您的位置:首页 > 理论基础 > 数据结构算法

数据结构_稀疏矩阵转置(trans_sparse_matrix)

2013-09-18 21:11 411 查看
经过几个小时的奋战,AC~~~ ^_^



下面是用M的列优先表示,

Description
/************************************/
/*求转置矩阵*/
/*问题描述:已知一个稀疏矩阵的三元组表,*/
/*求该矩阵转置矩阵的三元组表*/
/************************************/

Sample Output



code:

//author:essence_of_acmer;
//time:2011.8.7
//theme:trans_sparse_matrix
//用M的列优先表示

#include <iostream>
using namespace std;
#define M 20

typedef struct node
{
int i,j;
int v;
} JD ;

int trans_Sparse_matrix(JD ma[],JD mb[]) //way 1:按照M的列序存储
{
if(ma[0].v==0)
return (0);
int n=ma[0].j;
int t=ma[0].v;
mb[0].i=n;
mb[0].j=ma[0].i;
mb[0].v=t;
int k=1;
for(int col=1;col<=n;col++)
for(int p=1;p<=t;p++)
if (ma[p].j==col)
{
mb[k].i=ma[p].j;
mb[k].j=ma[p].i;
mb[k].v=ma[p].v;
k++;
}
return (1);
}

int fast_transpos(JD ma[],JD mb[]) //way 2:快速转置
{ int n,col,p,k,t;
int num[M],cpot[M];
n=ma[0].j;
t=ma[0].v;
mb[0].i=n; mb[0].j=ma[0].i; mb[0].v=t;
if(t<=0)
return(0);
for(col=0;col<=n;col++)
num[col]=0; //num[col]:表示矩阵M中第col列中非零元个数

for(p=1;p<=t;p++)//优秀
{ k=ma[p].j;
num[k]++;// 统计矩阵M中第col列中非零元个数
}

cpot[0]=0; cpot[1]=1;
for(col=2;col<=n;col++)
cpot[col]=cpot[col-1]+num[col-1];//统计M中第col列第一个非零元在mb中位置

for(p=1;p<=t;p++)
{ col=ma[p].j; //ma[]中第col列
k=cpot[col]; //第col列第一个非零元在mb中位置
mb[k].i=ma[p].j;
mb[k].j=ma[p].i;
mb[k].v=ma[p].v;
cpot[col]++; //优秀 //经典代码段
}
return(1);
}

int main()
{
int a[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};
JD ma[M],mb[M];
int k=1;

for(int i=0;i<6;i++) //初始化
for(int j=0;j<7;j++)
if(a[i][j]) {ma[k].i=i+1;ma[k].j=j+1;ma[k].v=a[i][j];k++;}
ma[0].i=6;ma[0].j=7;ma[0].v=k-1;

//trans_Sparse_matrix(ma,mb); //way 1;
fast_transpos(ma,mb); //way 2;

for(int i=0;i<k;i++) //打印原始
cout<<ma[i].i<<" ,"<<ma[i].j<<" ,"<<ma[i].v<<endl;

cout<<endl<<endl;

for(int i=0;i<k;i++) //打印改变后的
cout<<mb[i].i<<" ,"<<mb[i].j<<" ,"<<mb[i].v<<endl;
return (0);
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: