这是程序员考试的试题
在做这样一个比较复杂的填空题 什么思路来做这个题 从那里入手呢?
我需要做这种题快速明确的方法 思想 和过程 ,不需要答案
谢谢各位高手
若一个矩阵中的非零元素数目很少且分布没有规律,则称之为稀疏矩阵。对于m行
n列的稀疏矩阵M,进行转置运算后得到n行m列的矩阵MT,如图3-1所示。
0 -3 0 0 5
0 0 0 10 0
M 4×5= 12 0 0 0 0
0 14 0 0 -7
0 0 12 0
-3 0 0 14
MT 5×4= 0 0 0 0
0 10 0 0
5 0 0 -7
图3-1 稀疏矩阵M及其转置矩阵MT
为了压缩稀疏矩阵的存储空间,用三元组(即元素所在的行号、列号和元素值)表
示稀疏矩阵中的一个非零元素,再用一维数组逐行存储稀疏矩阵中的所有非零元素(也
称为三元组顺序表)。例如,图3-1所示的矩阵M相应的三元组顺序表如表3-1所示,
其转置矩阵MT的三元组顺序表如表3-2所示。
表3-1 表3-2
矩阵M M 的转置矩阵MT
行号 列号 元素值 行号 列号 元素值
0 1 -3 0 2 12
0 4 5 1 0 -3
1 3 10 1 3 14
2 0 12 3 1 10
3 1 14 4 0 5
3 4 -7 4 3 -7
函数TransposeMatrix(Matrix M)的功能是对用三元组顺序表表示的稀疏矩阵M进
行转置运算。
对M实施转置运算时,为了将M中的每个非零元素直接存入其转置矩阵MT三元组
顺序表的相应位置,需先计算M中每一列非零元素的数目(即MT中每一行非零元素的
数目),并记录在向量num中;然后根据以下关系,计算出矩阵M中每列的第一个非零
元素在转置矩阵MT三元组顺序表中的位置:
cpot[0] = 0
cpot[j] = cpot[j-1] + num[j-1] /* j为列号 */
类型ElemType、Triple和Matrix定义如下:
typedef int ElemType;
typedef struct { /* 三元组类型 */
int r,c; /* 矩阵元素的行号、列号 */
ElemType e; /* 矩阵元素的值*/
}Triple;
typedef struct { /* 矩阵的三元组顺序表存储结构 */
int rows,cols,elements; /* 矩阵的行数、列数和非零元素数目 */
Triple data[MAXSIZE];
}Matrix;
【C函数】
int TransposeMatrix(Matrix M)
{
int j,q,t;
int *num, *cpot;
Matrix MT; /* MT是M的转置矩阵 */
num = (int *)malloc(M.cols*sizeof(int));
cpot = (int *)malloc(M.cols*sizeof(int));
if (!num || !cpot)
return ERROR;
/* 设置转置矩阵MT行数、列数和非零元数目 */
MT.rows = __________ (1);
MT.cols = ________ (2) ;
MT.elements = M.elements;
if (M.elements > 0)
{
for(q = 0; q < M.cols; q++)
num[q] = 0;
for(t = 0; t < M.elements; ++t) /* 计算矩阵M中每一列非零元素数目 */
num[M.data[t].c]++;
/* 计算矩阵M中每列第一个非零元素在其转置矩阵三元组顺序表中的位置 */
___________(3) ;
for(j = 1;j < M.cols; j++)
cpot[j] = ________ (4) ;
/* 以下代码完成转置矩阵MT三元组顺序表元素的设置 */
for(t = 0; t < M.elements;t++)
{
j = __________ (5) ; /* 取矩阵M的一个非零元素的列号存入j */
q = cpot[j]; /* q为该非零元素在转置矩阵MT三元组顺序表中的位置(下标)*/
MT.data[q].r = M.data[t].c;
MT.data[q].c = M.data[t].r;
MT.data[q].e = M.data[t].e;
++cpot[j]; /* 计算M中第j列的下一个非零元素的目的位置 */
}/* for */
}/* if */
free(num); free(cpot);
/*此处输出矩阵元素,代码省略*/
return OK;
}/* TransposeMatrix */