已知三元组表求出行向量,根据行向量实现矩阵的快速转置用转置后的三元组表输出。
mu表示行数,nu表示列数,ln表示非零元数量;
定义num[]数组,记录矩阵中每列的非零元个数。
定义pos[] 记录行向量;
例题:
稀疏矩阵的存储不宜用二维数组存储每个元素,那样的话会浪费很多的存储空间。所以可以使用一个一维数组存储其中的非零元素。这个一维数组的元素类型是一个三元组,由非零元素在该稀疏矩阵中的位置(行号和列号对)以及该元组的值构成。
而矩阵转置就是将矩阵行和列上的元素对换。参考算法5.1中的具体做法,令mu和nu分别代表稀疏矩阵的行数和列数,不难发现其时间复杂度为O(mu×nu)。而当非零元的个数tu与mu×nu同数量级时,算法5.1的时间复杂度将上升至O(mu×nu2)。因此,需要采用快速的稀疏矩阵转置算法。
输入格式:
输入的第一行是两个整数r和c(r<300, c<300, r*c <= 12500),分别表示一个包含很多0的稀疏矩阵的行数和列数。接下来有r行,每行有c个整数,用空格隔开,表示这个稀疏矩阵的各个元素。
输出格式:
输出为读入的稀疏矩阵的转置矩阵。输出共有c行,每行有r个整数,每个整数后输出一个空格。请注意行尾输出换行。
输入样例:
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
输出样例 :
0 0 -3 0 0 15
12 0 0 0 18 0
9 0 0 24 0 0
0 0 0 0 0 -7
0 0 0 0 0 0
0 0 14 0 0 0
0 0 0 0 0 0
struct zhu{
int i;
int j;
int data;
}m[1000],p[1000]; //m为原三元组表,p为转置后的三元组表
int main(){
int n,k,a,h=0;
cin>>n>>k;
for(int i=0;i<n;i++){
for(int j=0;j<k;j++){
cin>>a;
if(a!=0){
m[h].i=i;
m[h].j=j;
m[h].data=a[i][j];
h++;
}
int num[100]={0};
for(int i=0;i<h;i++) //h记录非零元的个数
num[m[i].j]++;
int pos[100]={0};
for(int i=1;i<h;i++)
pos[i]=pos[i-1]+num[i-1];
for(int i=0;i<h;i++){ //遍历一遍原三元组表
int s=pos[m[i].j]-1;
n[s].i=m[i].j;
n[s].j=m[i].i;
n[s].data=m[i].data;
int o[100][100]={0};//构建转置后的矩阵
for(int i=0;i<h;i++)
o[n[i].i][n[i].j]=n[i].data; //遍历三元组表,找出所有非零元
for(int i=0;i<k;i++){
for(int j=0;j<n;j++)
cout<<n[i][j]<<" ":
cout<<endl;
return 0;
}