问答题 设稀疏矩阵M m 中有f个非零元素,用三元组顺序表的方式存储。请设计一个算法,计算矩阵M的转置矩阵N,要求转置算法的时间复杂度为O(n+t)。【苏州大学2005四(20分)】【中南大学2004三、4(10分)】【兰州大学2002八(10分)】
【正确答案】正确答案:转置可按转置矩阵的三元组表中的元素顺序进行,即按稀疏矩阵的列序。这种方法时间复杂度是O(n*t),当t和m*n同量级时,时间复杂度为O(n 2 )。另一种转置方法称作快速转置,使时间复杂度降为O(m*n)。需要求出每列非零元素个数和每列第一个非零元素在转置矩阵三元组表中的位置,因此设置了两个附加向量。快速转置的核心语句段如下: N.m=M.n; N.n=M.m; N.len=M.1en; if(M.len) (for(j:1 ; j<=M.n;j++)numb[j]=0; //矩阵M每一列非零元素初始化为零 for(t=1;t<=M.len;t++)numb[M.data[t].col]++; //求矩阵M每一列的非零元素个数pos[1]=1; //第1列第一个非零元素在转置后的三元组中下标是1 for(j=2;J<=M.n;j++) //求M.data第J列第一个非零元素在N.data中的序号 pos[c01]=pos[col一1]+numb[col一1]; for(p=1;p<=M.1en;p++) //求转置矩阵N的三元组表 {J=M.data[p].col;q=pos[j]; N.data[q].row=M.data[p].col;N.data[q].col=M.data[p].row; N.data[q].e=M.data[p].e;pos[j]++; //同列下一非零元素位置 } }
【答案解析】