殷人昆 北京清航教育校长 清华大学计算机系教授
一、总体分析
计算机科学与技术学科全国硕士研究生统一入学考试已经进行了两次。数据结构部分的考试范围要求掌握:
1,基本数据结构的知识
2,算法设计和编程的能力
3,综合应用算法和数据结构的技能
从考试的命题来看,2010年比2009年的题目难度要大一些。在这里,我对2009年考题与2010年考题的考试范围进行了简单的比较:
A, 选择题部分,请参考表1
2009年 | 2010年 |
1.队列与缓冲区 | 1.进栈与出栈序列 |
2.栈与队列的操作 | 2.双端队列的出队序列 |
3.几种二叉树遍历的方式 | 3.后序线索二叉树的表示 |
4.完全二叉树的性质 | 4.平衡二叉树的插入 |
5.平衡二叉树的定义 | 5.K叉树叶结点的计算 |
6.森林的二叉树表示 | 6.Huffman树的定义和特点 |
7.无向连通图的定义 | 7.无向连通图的最少边数 |
8.m阶B树的定义 | 8.拓扑排序序列 |
9.堆的定义和插入方法 | 9.折半查找的性能分析 |
10.几种排序方法 | 10.快速排序递归次数 |
表1
2010年选择题还有一道题(11题)是对几种排序方法的考察。
由表1我们可以总结出,在选择题部分,各主要知识点分布如下,请参考表2:
考察内容 | 2009年 | 2010年 |
栈、队列与双端队列 | 2 | 2 |
树与二叉树、森林 | 4 | 4 |
图 | 1 | 2 |
查找 | 1 | 1 |
排序 | 2 | 2 |
表2
B,综合应用题部分的试题范围如下:
2009年 | 2010年 |
41.求解图的最短路径 | 41.散列表构造、数据存储及性能分析 |
42.算法设计:在单链表中求倒数第k个结点位置 | 42.算法设计:将一维数组中所有元素循环左移p位 |
总体上讲,2009年的试题较简单,2010年的试题比较复杂,且难度稍大,但平时教学中应当都教过,或练习都做过。
二、2010 年考试改卷的基本情况
2010年考试改卷的大概情况如下:
客观题是机改,数据结构部分总分22分,平均得分约为17分,失分较多的是
第2题(双端队列)
第5题(K叉树叶结点的计算)
第8题(拓扑排序的序列个数)
第10题(快速排序递归次数);
主观题是人改,数据结构部分总分23分
第41题10分,平均得分5分,失分最多的是
计算散列表长度(2分),多数考生未得分。
将给定元素存储到散列表中(6分),平均得3分。如果第1问错了,不影响第2问得分;但可惜散列函数有不少同学选择不完全对。
计算平均查找长度(2分),平均得1分。
第42题是算法设计题13分,平均得6~8分,失分最多的是算法效率达不到要求。
许多考生成绩差的主要原因:
1,本科数据结构课程学习不够扎实;
2,考前复习不够充分;
3,考试时审题不仔细,急于给出答案,未严格推导。
三、2010年考试试卷分析
由于篇幅有限,在此只例举综合题两道大题进行分析。
二、综合应用题
41题:(10分)将关键字序列{ 7, 8, 30, 11, 18, 9, 14 } 散列存储到散列表中,散列表的存储空间是一个下标从 0 开始的一个一维数组散列,函数为:
(1) 请画出所构造的散列表。
(2) 分别计算等概率情况下,查找成功和查找不成功的平均查找长度。
解答:这是一道常规的数据结构题目。实际上要做三步工作:计算表的长度,从而将 7 个数据存储到散列表中,最后计算等查找概率情形下,查找成功和查找不成功的平均查找长度。
H(30) = (30*3) mod 7 = 6,一次比较到位
图1
42题:(13分)设将n (n > 1) 个整数存放到一维数组 R中。设计一个在时间和空间两方面尽可能高效的算法。将 R 中的序列循环左移 p(0 < p < n)个位置,即将 R 中的数据由 (a0, a1, ……an-1) 变换为(ap, ap-1, …an-1, a0, a1, …, ap-1)。要求:
解答:此算法即有名的海豚算法。
如果n与p不互质,一次循环左移只涉及间隔为p的部分数据元素,可先求n与p的最大公约数m,再做m次循环左移,每次比上次右错一位,从而实现所有数据元素的循环左移。例如,n = 10,p = 4,m = 2,做 2 次循环左移。第1次涉及位置0-4-8-2-6,第2次涉及位置1-5-9-3-7。