問題描述
問題描述:稀疏矩陣轉置
設計思路
設計思路:稀疏矩陣中存在大量非零元素,直接轉置執行時間較高。因而採用三元組表示。按照壓縮的概念,只存儲稀疏矩陣中的非零元素,除了存儲非零元素的值之外,還必須同時記下它所在的行列位置。三元組表示法是用一個具有三個數據域的一維數組表示稀疏矩陣,每一行有三個字段,分別該元素的行下表、列下表和值。設A,B分別爲某稀疏矩陣轉置前後的三元組表,i爲行下標,j爲列下標,v味元素值。變量m爲稀疏矩陣行數,n爲稀疏矩陣列數,tu爲非零元素個數。本算法要求把A中行下標、列下標交換後送到B中,並且使B中行下表仍按遞增順序存放。
數據結構:
i:行下標
j:列下標
v:元素值
tu:非零元素個數
A:轉置前矩陣
B:轉置後矩陣
Ai:轉置前三元組
Bi:轉置後三元組
t[0]:工作數組
算法描述:
TRANSMAT ( A , B)
- If( tu!=0) then
- { q<-1 //q爲轉置以後B的行號//
- for col=1 to n
- For p=1 to tu //p爲轉置前A的行號//
- If A[p].j=col then
- {B[q].i<-a[p].j; B[q].j<A[p].i;
- B[q].v<-A[p].v; q<-q+1}
- End(p)
- End(col)}
- return
測試用例及結果說明
測試用例:稀疏矩陣元素爲
A[0][0]=3;
A[0][4]=7;
A[1][2]=-1;
A[2][0]=-1;
A[2][1]=-2;
A[4][3]=2;
測試結果:
轉置前矩陣A:
3 0 0 0 7
0 0 -1 0 0
-1 -2 0 0 0
0 0 0 0 0
0 0 0 2 0
工作三元組Ai:
1 1 3
1 5 7
2 3 -1
3 1 -1
3 2 -2
5 4 2
工作三元組Bi:
1 1 3
1 3 -1
2 3 -2
3 2 -1
4 5 2
5 1 7
轉置後矩陣:
3 0 -1 0 0
0 0 -2 0 0
0 -1 0 0 0
0 0 0 0 2
7 0 0 0 0
設計及測試過程
第一步:提出問題;
第二步:問題轉換;
第三步:算法構思;
第四步:僞碼描述;
第五步:代碼編寫;
第六步:代碼測試;
第七步:代碼修正;
參考書籍:
《計算機軟件技術基礎》 清華大學出版社 第三版
#include<iostream>
using namespace std;
#define N 5
struct node
{
int i;
int j;
int v;
}Ai[N*N],Bi[N*N],t[1];
int main()
{
int A[N][N],B[N][N],a,b,tu=0,i,j=0;
node *q;
for(a=0;a<N;a++)
for(b=0;b<N;b++)
{
A[a][b]=0;
B[a][b]=0;
}
A[0][0]=3;
A[0][4]=7;
A[1][2]=-1;
A[2][0]=-1;
A[2][1]=-2;
A[4][3]=2;
cout<<"轉置前矩陣爲"<<endl;
for(a=0;a<N;a++)
{
for(b=0;b<N;b++)
cout<<A[a][b]<<'\t';
cout<<endl;
}
for(a=0;a<N;a++)
for(b=0;b<N;b++)
if(A[a][b]!=0)
{
Ai[tu].i=a+1;
Ai[tu].j=b+1;
Ai[tu].v=A[a][b];
tu++;
}
cout<<"轉置前矩陣等效三元組爲"<<endl;
for(i=0;i<tu;i++)
cout<<Ai[i].i<<'\t'<<Ai[i].j<<'\t'<<Ai[i].v<<endl;
for(i=0;i<tu-1;i++)
{
int min=i;
for(j=i+1;j<tu;j++)
if(Ai[j].j<Ai[min].j)
min=j;
t[0].i=Ai[i].i;
t[0].j=Ai[i].j;
t[0].v=Ai[i].v;
Ai[i].i=Ai[min].i;
Ai[i].j=Ai[min].j;
Ai[i].v=Ai[min].v;
Ai[min].i=t[0].i;
Ai[min].j=t[0].j;
Ai[min].v=t[0].v;
}
for(i=0;i<tu;i++)
{
Bi[i].i=Ai[i].j;
Bi[i].j=Ai[i].i;
Bi[i].v=Ai[i].v;
}
cout<<"轉置後矩陣等效三元組爲"<<endl;
for(i=0;i<tu;i++)
cout<<Bi[i].i<<'\t'<<Bi[i].j<<'\t'<<Bi[i].v<<endl;
for(i=0;i<tu;i++)
{
a=Bi[i].i-1;
b=Bi[i].j-1;
B[a][b]=Bi[i].v;
}
cout<<"轉置後矩陣爲"<<endl;
for(a=0;a<N;a++)
{
for(b=0;b<N;b++)
cout<<B[a][b]<<'\t';
cout<<endl;
}
system("pause");
return 0;
}