| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1461 人关注过本帖
标题:[求助]程序员考试做复杂填空题的方法?!
只看楼主 加入收藏
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
结帖率:83.33%
收藏
 问题点数:0 回复次数:14 
[求助]程序员考试做复杂填空题的方法?!



这是程序员考试的试题
在做这样一个比较复杂的填空题 什么思路来做这个题 从那里入手呢?
我需要做这种题快速明确的方法 思想 和过程 ,不需要答案

谢谢各位高手



若一个矩阵中的非零元素数目很少且分布没有规律,则称之为稀疏矩阵。对于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 */

搜索更多相关主题的帖子: 程序员考试 填空 
2007-10-21 22:56
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
收藏
得分:0 
顶一个!

羊肉串 葡萄干 哈密瓜!!
2007-10-22 00:34
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
先理解好程序的意图,如果能看出来程序的算法,那就好办了,再注意一些边界的判断就可以了

从BFS(Breadth First Study)到DFS(Depth First Study)
2007-10-22 08:21
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
用一数组来保存每一列的元素个数以确定该列要放的首位置
比如
a[7]={2,0,3,1,3,0,4};
表示列为0的有2个,所以存放时从0开始,放2个单位
列为2的有3个,所以存放时从(2+0)开始,放3个单位
以次类推...

倚天照海花无数,流水高山心自知。
2007-10-22 09:38
风的声音
Rank: 1
等 级:新手上路
帖 子:128
专家分:0
注 册:2007-3-27
收藏
得分:0 
实现转置,其实从两个三元组中可以看出来,步骤:1.将矩阵的行列值交换2.将每个三元组中的i和j交换;3.重新排列三元组之间的次序实现矩阵转置;
不过第三步,实现方法有很多种;你这个程序给出的就是比较简单地一种。
因为在每次转置的时候,它都给出了相应的转置矩阵中的位置。也就是cpot[]这个数组,只要理解了这个数组就基本上没有什么问题了。这个数组就给出了对应的位置。
而且还要说明一点原矩阵m中列号相同的元素,那么前面的那个在转置矩阵mt中,它的次序仍然在前面;

一念心清净,莲花处处开。 一花一净土,一土一如来。
2007-10-22 09:43
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
收藏
得分:0 
........不发表任何意见  

羊肉串 葡萄干 哈密瓜!!
2007-10-22 12:49
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
以下是引用mp3aaa在2007-10-22 12:49:11的发言:
........不发表任何意见


[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2007-10-22 12:54
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
mp3aaa 你该不会在耍我的吧.

倚天照海花无数,流水高山心自知。
2007-10-22 14:15
风的声音
Rank: 1
等 级:新手上路
帖 子:128
专家分:0
注 册:2007-3-27
收藏
得分:0 

答案:1. M.cols ;2. M.rows; 3. cpot[0]=0; 4. cpot[j]=cpot[j-1]+num[j-1]; 5. M.date[t].c;
大家可以看看;这是一个比较经典的一个三元组转置问题。


一念心清净,莲花处处开。 一花一净土,一土一如来。
2007-10-22 21:06
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 

从稀疏矩阵入手!


方寸之内,剖天下; 方坛之内,析自我;
2007-10-22 22:51
快速回复:[求助]程序员考试做复杂填空题的方法?!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.107089 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved