一、特殊矩阵的存储—稀疏矩阵
1.采用矩阵的常规存储方式实现矩阵转置
//稀疏矩阵转置 二维数组
void TransMatrix(int source[m][n],int dest[n][m]){
//source表示被转置的矩阵 dest表示转置后的矩阵
int i,j;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
dest[j][i]=source[i][j]; //行列对换
}
}
}
2.采用三元组表方式实现矩阵转置
重新排序会大量移动元素,从而影响算法的效率,为了避免行列互换后重新排序引起的数据移动。
1、列序递增转置法
2、一次定位快速转置法
2.1 列序递增转置法
//列序递增转置法 三元组
void TransposeTSMatrix(TSMatrix A,TSMatrix *B){
int i,j,k;
B->m=A->n;
B->n=A->m;
B->len=A->len;
if(B->len>0){
j=1; //辅助计数器
for(k=1;k<=A->n;k++){
for(i=1;i<=A->len;i++){
if(A->data[i]->col==k){
B->data[j]->row=A->data[i]->col;
B->data[j]->col=A->data[i]->row;
B->data[j]->e=A->data[i]->e;
j++;
}
}
}
}
}
存储空间减少,但时间复杂度并未降低。原因是要多次扫描稀疏矩阵三元组。
所以可否降低时间复杂度?
降低扫描三元组的次数(去掉双重循环)。
能否扫描一遍就找到位置?----一次定位快速转置法
2.2 一次定位快速转置法
num[]数组计算方式?
position[]数组计算方式?
那么一次定位快速转置的具体做法??
……
……
//一次定位快速转置法 三元组
void FastTransposeTSMatrix(TSMatrix A,TSMatrix *B){
int col,t,q,p;
int num[MAXSIZE],position[MAXSIZE];
B->m=A->n;
B->n=A->m;
B->len=A->len;
if(B->len>0){
for(col=1;col<=A->n;col++){
num[col]=0;
}
for(t=1;t<A.len;t++){
num[A->data[t]->col]++;
}
position[1]=1;
for(col=2;col<=A.n;col++){
position[col]=num[col-1]+position[col-1];
}
for(p=1;p<A.len;p++){
col=A->data[p]->col;
q=position[col];
B->data[q]->row=A->data[p]->col;
B->data[q]->col=A->data[p]->row;
B->data[q]->e=A->data[p]->e;
position[col]++;
}
}
}
算法的时间耗费主要是4个并列的单循环上
在时间性能上优于递增转置法,但在空间耗费上增加了两个辅助向量空间