这是程序员考试的试题
在做这样一个比较复杂的填空题 什么思路来做这个题 从那里入手呢?
我需要做这种题快速明确的方法 思想 和过程 ,不需要答案
谢谢各位高手
若一个矩阵中的非零元素数目很少且分布没有规律,则称之为稀疏矩阵。对于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 */
----------------解决方案--------------------------------------------------------
顶一个!
----------------解决方案--------------------------------------------------------
先理解好程序的意图,如果能看出来程序的算法,那就好办了,再注意一些边界的判断就可以了
----------------解决方案--------------------------------------------------------
用一数组来保存每一列的元素个数以确定该列要放的首位置
比如
a[7]={2,0,3,1,3,0,4};
表示列为0的有2个,所以存放时从0开始,放2个单位
列为2的有3个,所以存放时从(2+0)开始,放3个单位
以次类推...
----------------解决方案--------------------------------------------------------
实现转置,其实从两个三元组中可以看出来,步骤:1.将矩阵的行列值交换2.将每个三元组中的i和j交换;3.重新排列三元组之间的次序实现矩阵转置;
不过第三步,实现方法有很多种;你这个程序给出的就是比较简单地一种。
因为在每次转置的时候,它都给出了相应的转置矩阵中的位置。也就是cpot[]这个数组,只要理解了这个数组就基本上没有什么问题了。这个数组就给出了对应的位置。
而且还要说明一点原矩阵m中列号相同的元素,那么前面的那个在转置矩阵mt中,它的次序仍然在前面;
----------------解决方案--------------------------------------------------------
........不发表任何意见
----------------解决方案--------------------------------------------------------
........不发表任何意见
----------------解决方案--------------------------------------------------------
mp3aaa 你该不会在耍我的吧.
----------------解决方案--------------------------------------------------------
答案:1. M.cols ;2. M.rows; 3. cpot[0]=0; 4. cpot[j]=cpot[j-1]+num[j-1]; 5. M.date[t].c;
大家可以看看;这是一个比较经典的一个三元组转置问题。
----------------解决方案--------------------------------------------------------
从稀疏矩阵入手!
----------------解决方案--------------------------------------------------------