1. 三元组矩阵的快速转置主要借助了两个外部数组,Num[]和Copt[],Num[]存放了转置之前的矩阵每一列中元素的个数。Copt[]矩阵存放了转置之后的三元组举证项应该存放的数据结构中的位置。
2. 由于转置前第n列第一个元素位置在转置之后的位置是转置之前第n列之前所有元素之和,所以通过Num[]和Copt[]数组就可以记录转置之后三元组矩阵每一项应该存放的位置。
代码:
status FasterTransposesMatrix(TSMatrix M, TSMatrix &T){
T.mu = M.nu;
T.nu = M.mu;
T.tu = M.tu;//将数据结构中M三元组的表头转置的复制到T的三元组表头中
int Num[] = 0;
if(T.tu){
//初始化Num数组
for(int col = 1; col <= M.nu; ++col){
Num[col] = 0;
}
for(int t = 1; t <= M.tu; ++t){
++Num[M.data[t].j];//计算原数组中每一列的元素个数
}
int copt[1] = 1;
//初始化copt数组,该数组存放转置后元素应该存放的三元组位置
for (int col = 2; col <= M.nu; ++col){
copt[col] = copt[col-1] + Num[col-1];
}
for (int p = 1; p<=M.tu; ++p){
//找到转换之前M三元组对应数据结构位置
col = M.data[p].j;
//找到copt中存放的当前转置之前的三元组应该存放的转置之后的位置
q = copt[col];
T.data[q].i = M.data[p].j;
T.data[q].j = M.data[p].i;
T.data[q].v = M.data[p].v;
//不要忘记在后移一项下一个元素需要移动的位置
++copt[col];
}
}
}