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

数据结构实验之数组三:快速转置

2019-02-27 20:20 309 查看

Problem Description
转置运算是一种最简单的矩阵运算,对于一个mn的矩阵M( 1 = < m < = 10000,1 = < n < = 10000 ),它的转置矩阵T是一个nm的矩阵,且T( i , j )=M( j , i )。显然,一个稀疏矩阵的转置仍然是稀疏矩阵。你的任务是对给定一个m*n的稀疏矩阵( m , n < = 10000 ),求该矩阵的转置矩阵并输出。矩阵M和转置后的矩阵T如下图示例所示。

Input
连续输入多组数据,每组数据的第一行是三个整数mu, nu, tu(tu <= 50),分别表示稀疏矩阵的行数、列数和矩阵中非零元素的个数,随后tu行输入稀疏矩阵的非零元素所在的行、列值和非零元素的值,同一行数据之间用空格间隔。(矩阵以行序为主序)

Output
输出转置后的稀疏矩阵的三元组顺序表表示。

Sample Input
3 5 5
1 2 14
1 5 -5
2 2 -7
3 1 36
3 4 28
Sample Output
1 3 36
2 1 14
2 2 -7
4 3 28
5 1 -5
题解:
快速转置用三元组的方法,存储横纵坐标以及数值。矩阵转置实际上就是非零元素的横坐标和纵坐标交换位置,但是交换完了以后,题目要求矩阵以行序为主序输出,因为交换完了以后顺序是乱的,还需要按照行序从小到大排列一下顺序,我们可以不用排序的算法排序,而是用数组num统计旧矩阵每列有多少个元素(即新矩阵每行有多少个元素),然后用cpot数组找新矩阵每一行元素的起始位置,找到起始位置以后,对于旧矩阵中的每个元素都找到对应的位置进行横坐标和纵坐标的互换就可以完成转置了。

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#define maxsize 60
int num[11000],cpot[60];
using namespace std;
typedef struct
{
int i,j,e;

} Triple;//三元组
typedef struct
{
int nu,mu,tu;
Triple data[maxsize+1];
} TSMatrix;//稀疏矩阵
void FastTransposeSMatrix(TSMatrix m,TSMatrix &t)
{
t.tu=m.tu;
t.nu=m.mu;
t.mu=m.nu;//交换变量的值
if(t.tu)
{
int p,q,col,k;
for(col=1; col<=m.nu; col++)num[col]=0;//将num数组清零
for(k=1; k<=m.tu; k++)++num[m.data[k].j];//统计旧矩阵每列有多少元素
cpot[1]=1;//新矩阵第一行元素的起始位置是1
for(col=2; col<=m.nu; col++)//旧矩阵多少列,新矩阵就有多少行
{
cpot[col]=cpot[col-1]+num[col-1];//找到新矩阵每一行元素的起始位置(起始位置为上一行元素的起始位置加上上一行元素的个数)

}
for(p=1; p<=m.tu; p++)//转置矩阵元素,从旧矩阵的第一个元素开始,直到找完所有不为零的元素
{
col=m.data[p].j;//找到旧元素的列,即新元素的行
q=cpot[col];//找到该元素在新矩阵中的行的起始位置
t.data[q].i=m.data[p].j;
t.data[q].j=m.data[p].i;
t.data[q].e=m.data[p].e;//将这个元素转化为新矩阵中的元素
++cpot[col];//如果新矩阵这一行有多个元素(即旧矩阵有多个元素是同一列的),新矩阵同一行元素的col相同,即cpot[col]相同,依次向后加才导致q增加,避免元素的覆盖。

}
}

}
int main()
{
int k;
TSMatrix m,t;
while(scanf("%d %d %d",&m.mu,&m.nu,&m.tu)!=EOF)
{
for(k=1; k<=m.tu; k++)scanf("%d %d %d",&m.data[k].i,&m.data[k].j,&m.data[k].e);
FastTransposeSMatrix(m,t);
for(k=1; k<=t.tu; k++)
printf("%d %d %d\n",t.data[k].i,t.data[k].j,t.data[k].e);

}

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