作者在 2008-04-15 10:32:18 发布以下内容
/*
-------------存储结构-三元组-----------------
#define MAXSIZE 10000 /*非0元素个数最大值10000*/
typedef struct{
int i,j; /*非0元素的行、列下标*/
int i,j; /*非0元素的行、列下标*/
ElemType e; /*非0元素值*/
}Triple;
typedef struct{ /*稀疏距阵存储结构*/
Triple data[MAXSIZE+1];/*三元组数组存储非0元*/
int mu,nu,tu; /*距阵的行列数目以及非0元个数*/
}TSMatrix;
传统算法:
按照列的从小到大顺序依次在三元组中寻找对应的元素(列标相同)为结果距阵的行元素。
*/
Status TransposeSMatrix(TSMatrix M,TSMatrix& T){
/*
将稀疏距阵的三元组M进行转置操作,转置结果保存到三元组T中,即得到稀疏距阵M的转置距阵。
*/
T.mu=M.nu;
T.nu=M.mu;
T.tu=M.tu;
if(T.tu){ /*如果非0元素个数不为0*/
q=1; /*结果三元组T的工作存储下标*/
for(col=1;col<=M.nu;col++) /*第col列等列标的元素作为结果距阵的第i行的元素*/
for(p=1;p<=M.tu;p++) /*依次在M中寻找等列的元素*/
if(M.data[p].j==col){ /*找到目标元素进行转置运算*/
T.data[q].i=M.data[p].j;
if(M.data[p].j==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;
q++;
}
}
return OK;
}
/*
快速转置:
未转置之前就确定了工作对象三元组M中的元素在结果三元组T中的位置。
增加了两个辅助数组:
num[i]:表示稀疏距阵中第i列非0元素的个数
cpot[i]:表示M中第i列在结果三元组T中第一个元素的位置
*/
Status FastTransposeSMatrix(TSMatrix M,TSMatix& T){
/* 对稀疏距阵M进行快速转置操作结果存储在T中*/
T.mu=M.nu;
T.nu=M.mu;
T.tu=M.tu;
if(T.tu){
for(col=1;col<=M.nu;col++) /*num数组初始化*/
num[col]=0;
for(i=1;i<=M.tu;i++) /*统计每列非0元的个数*/
num[M.data[i].j]++;
cpot[1]=1;
for(t=1;t<=M.nu;t++) /*计算每列开头元素在T中位置*/
cpot[t]=cpot[t-1]+num[t-1];
for(p=1;p<=M.tu;p++){ /*依次对每一个三元组M中进行转置*/
k=M.data[p].j;
q=cpot[k];
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[k]++; /*k列的起始位置加1*/
}
}
return OK;
}