2010考研数据结构试题点评
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2010年考研计算机专业综合考试数据结构试题点评
2010年考研计算机专业综合考试是统一命题后的第二次考试。
本次考试统考科目仍然包括四门计算机专业课:数据结构、计算机组成原理、操作系统和计算机网络,这四门课程合在一起称为计算机科学专业基础综合,共150分。
其中数据结构仍然占45分。
总体上来看,2010年的考研数据结构试题仍然注重对基础知识的考察。
重点考察的是对基本知识点、基本概念的理解及应用。
题目的难度适中,没有出现超出考试大纲的题目,也没有一眼就能看出答案的题目;在基础题中又有拔高,本次考试并非考查基本概念的填空,考题比较灵活,重点考察了对基础知识的应用能力、应变能力和实际动手能力。
与2009年的考研数据结构试题相比,难度略有提高,考察的内容更加深入、灵活,并且有针对性。
下面我们对2010的考研计算机专业综合考试进行简要的分析。
一、单项选择题
这部分共有40个选择题,每题2分,共80分。
单选题覆盖了大纲列出的各章的知识点,主要考察对各种数据结构、基本查找和排序算法的基本概念和特点的理解以及灵活运用。
1-11题是数据结构部分的试题。
1.若元素a、b、c、d、e、f依次进栈,允许进栈、退栈操作交替进行。
但不允许连续三次进行退栈工作,则不可能得到的出栈序列是()
A.dcebfa
B.cbdaef
C.bcaefd
D.afedcb
点评:此题考察对栈的基本操作(进栈、退栈)的理解和应用。
栈的特点是后进先出。
若元素a、b、c、d、e、f依次进栈,要得到出栈序列afedcb,需要进行的操作为:a进栈,a 出栈,b,c,d,e,f分别进栈,然后f,e,d,c,b分别依次出栈,连续出栈操作超过3次。
故答案为D。
2.某队列允许在其两端进行入队操作,但仅允许在一端进行出队操作,则不可能得到的顺序是()
A.bacde
B.dbace
C.dbcae
D.ecbad
点评:此题考察对可以两端入队,一端出队的队列的操作。
一般教材中讨论的队列都是一端入队,一端出队,而本题中的队列可以两端入队,一端出队,入队出队操作要复杂一些,是对教材内容的深化。
对于序列dbcae ,要先得到d ,a ,b ,c 必须先从一端入队,d 再从另一端入队,d 出队得到序列中的d ,但队列是先进先出,下面要得到b ,而b 是在a 之后进队的,只有a 先出队,b 才能出队,故得不到所要求的序列。
所以答案为C 。
3.下列线索二叉树中(用虚线表示线索),符合后序线索树定义的是( )
点评:此题考察对后序线索树的定义的理解。
先得到后序序列为dbca ,然后在后序线索树中将空的左孩子域指向其后序前驱,空的右孩子域指向其后序后继,因此答案为D 。
4.在下列所示的平衡二叉树中插入关键字48后得到一棵新平衡二叉树,在新平衡二叉树中,关键字37所在结点的左、右子结点保存的关键字分别是( )
A.13,48
B.24,48
C.24,53
D.24,90 点评:此题考察对平衡二叉树插入操作的理解及应用,要熟悉平衡二叉树调整平衡的4
种旋转方法。
48插入后作为37的右孩子,此时破坏了二叉树的平衡,需旋转,旋转类型为RL 型,根据RL型的操作可知答案为C。
5.在一棵度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则数T的叶结点个数是()
A.41
B.82
C.113
D.122
点评:此题考察对树中度、结点、叶子结点个数的计算。
一般教材中多是对二叉树的讨论,二叉树性质3有结论:n0=n2+1。
而本题是一棵度为4的树,因此需要引深。
n0=n2+2*n3+3*n4+1=1+2*10+3*20+1=82。
故答案为B。
6.对n(n≥2)个权值均不相同的字符构成哈夫曼树,关于该树的叙述中,错误的是()
A.该树一定是一棵完全二叉树
B.树中一定没有度为1的结点
C.树中两个权值最小的结点一定是兄弟结点
D.树中任一非叶结点的权值一定不小于下一层任一结点的权值
点评:此题考察对哈夫曼树的特性的理解。
根据哈夫曼算法哈夫曼树中没有度为1的结点,两个权值最小的结点一定是兄弟结点,任一非叶结点的权值一定不小于下一层任一结点的权值,但哈夫曼树不是一棵完全二叉树。
因此答案是A。
7.若无向图G=(V,E)中含7个顶点,则保证图G在任何情况下都是连通的,则需要的边数最少是()
A.6
B.15
C.16
D.21
点评:此题考察对图的连通性的理解。
一个有n个顶点的图要连通至少需要n-1条边。
故答案是A。
8.对下图进行拓扑排序,可以得到不同的拓扑序列的个数是()
A.4
B.3
C.2
D.1
点评:此题考察对拓扑序列的理解。
拓扑序列不唯一。
根据拓扑序列的求法可知此题有3个不同的拓扑序列。
故答案为B 。
9.已知一个长度为16的顺序表L ,其元素按关键字有序排列,若采用折半查找法查找一个不存在的元素,则比较次数最多的是( )
A.4
B.5
C.6
D.7
点评:此题考察对折半查找最坏情况下的查找长度的理解。
折半查找的查找过程可用一棵判定树来表示,折半查找失败时的过程对应判定树中从根结点到某个含空指针的结点的路径,因此,折半查找失败时关键字的比较次数最多不超过判定树的深度。
n 个结点的判定树的深度和n 个结点的完全二叉树的深度相等,均为 log 2n +1。
故答案为B 。
10.采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是( )
A.递归次数与初始数据的排列次序无关
B.每次划分后,先处理较长的分区可以减少递归次数
C.每次划分后,先处理较短的分区可以减少递归次数
D.递归次数与每次划分后得到的分区处理顺序无关
点评:此题考察对递归方式下的快速排序算法的理解与应用。
快速排序的递归的次数与初始数据的排列顺序有关,递归次数与每次划分后得到的分区处理顺序无关。
故答案为D 。
11.对一组数据(2,12,16,88,5,10)进行排序,若前三趟排序结果如下:( ) 第一趟:2,12,16,5,10,88 e d
a c b
第二趟:2,12,5,10,16,88
第三趟:2,5,10,12,16,88
则采用的排序方法可能是
A.起泡排序
B.希尔排序
C.归并排序
D.基数排序
点评:此题考察对各种排序方法的步骤、特点的理解及应用。
起泡排序第i趟结束后可以把第i大的数放到正确位置。
希尔排序第i趟结束后把相距为某一值的同一组中元素排好序。
归并排序第i趟结束后可以得到长度为2i 的有序子序列。
基数排序第i趟按第i位分配收集。
故答案为A。
二、综合应用题
综合应用题主要考察综合运用基本知识分析问题、解决问题的能力。
41-42为数据结构部分的题。
出题风格仍然沿用第一次的出题风格,一道问答题、一道算法设计题。
41.(10分)将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中,散列表的存储空间是一个下标从0开始的一维数组,散列函数:H(key)=(key×3) MOD T,处理冲突采用线性探测再散列法,要求装填(载)因子为0.7。
问题:(1)请画出所构造的散列表;
(2)分别计算等概率情况下查找成功和查找不成功的平均查找长度。
点评:此题考察对散列表相关知识的理解及应用,要求能够构造散列表,并且能够计算等概率情况下查找成功和查找不成功的平均查找长度。
(1)本题中涉及到装填(载)因子α,在散列函数中还有一个未知数T(可认为是散列表的长度)。
因此需先求出T。
α=数据个数/表长,由装载因子0.7,数据总数7个可知存储空间长度为10即T =10。
所以,散列函数为H(key)=(key×3) MOD 10,线性探测再散列函数为:
Hi=( H(key)+d i) MOD 10,(d i=1,2,3, (9)
因此,各数据的下标为:
H(7)=(7*3)MOD 10=1 H(8)=(8*3)MOD 10=4 H(30)=(30*3)MOD 10=0 H(11)=(11*3)MOD 10=3 H(18)=(18*3)MOD 10=4 H1=(H(18)+1) MOD 10=5 H(9)=(9*3)MOD 10=7 H(14)=(14*3)MOD 10=2
构造的散列表为:
(2)在等概率情况下,手工计算查找成功时的平均查找长度可用下列公式计算:
ASL succ =n 表中装入的元素个数1∑=n
i C 1i
其中,c i 为查找第i 个元素所需的比较次数,即装入第i 个元素时所需的比较次数。
处理冲突用线性探测再散列法,得到其哈希表及各关键字的比较次数如下图所示
按照上述公式,在等概率情况下,查找成功时的平均查找长度为:
查找成功的ASL=(1+1+1+1+2+1+1)/7=8/7
在等概率情况下,查找不成功时的平均查找长度是指在表中查找不到待查记录,但找到插入位置的平均探测次数,它是表中所有可能散列的位置上要插入新记录时为找到空位置的探测次数的平均值。
在等概率情况下,手工计算查找不成功时的平均查找长度可用下列公式计算:
ASL unsucc =r 哈希函数取值个数1∑=n
i C 1i
其中,c i 为哈希函数取值为i 时查找不成功的比较次数。
查找不成功的情况:(1)遇到空单元(2)按处理冲突的方法完全探测一遍后仍未找到。
0到r-1相当于r 个不成功查找的入口,从每个入口进入后,直到确定查找不成功为止,其关键字比较次数就是与该入口对应的不成功查找长度。
在本题中,在线性探测再散列法处理冲突得到的哈希表中查找,假设待查的关键字k 不在该表中,若H(k)=0,将HT[0]中的关键字和k 比较后发现HT[0]为空,即查找不成功,比较次数为1;若H(k)=1,则必须将HT[0..5] 中的关键字和k 比较后,再与HT[6]中的关键字比较时发现HT[6]为空,查找失败,比较次数为7,同理,位置2,3,…,5,6的比较次数分别为6,5,…,2,1次,位置7,8,9的比较次数分别为2,1,1,因此,在等概率情况下,查找不成功时的平均查找长度为
查找不成功的ASL=(7+6+5+4+3+2+1+2+1+1)/10=3.2
42.(13分)设将n(n>1)个整数存放到一维数组R中。
试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(x0,x1,…,x n-1)变换为(x p,x p+1,…,x n-1,x0,x1,…,x p-1)。
要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用C或C++或JAVA语言描述算法,关键之处给出注释。
(3)说明设计算法的时间复杂度和空间复杂度。
点评:此题是一道算法设计题,算法设计是数据结构课程的一个重点内容,也是一个难点。
此题考察对顺序表的基本运算的理解及灵活运用、时间复杂度和空间复杂度的概念及应用。
要求时间和空间两方面都尽量最优的情况下,实现数组的循环左移,还要求算法的时间、空间的复杂度。
具体要求给出算法思想,并且能用C、C++、Java描述该算法。
思想可以描述为:建立一个可以存放P个整数的辅助队列,将数组R中的前p个整数依次进队;将R 中后面的n-p个整数依次前移p个位置,然后将辅助队列中的p个数依次出队,依次放入数组末尾即第n-p开始的位置即可。
算法描述:
void shift(int *pr,int n,int p) //pr是指向数组R的指针,n为存放的整数个数,
//p为循环左移的个数
{ int temp[p];//辅助数组,存放要移出的整数
int i=0;
while (i<p)//将R中前p个数据存入辅助数组中
{temp[i]=pr[i]; i++;}
i=0;
while(i<n-p) //将R中从第p个整数开始的整数前移p个位置
{pr[i]=pr[i+p]; i++;}
i=0;
while (i<p)//将辅助数组中的p个数据放到R中第n-p个数据的后面
{pr[n-p+i]=temp[i]; i++;}
return;
}
算法分析:循环需进行n次,故时间复杂度O(n),需要p个空间存放进队数据,故空间复杂度O(p)。
在数据结构中,对所设计的算法进行分析是很重要的,因此,需掌握时间复杂度和空间复杂度的相关知识,并对所设计算法求出时间复杂度和空间复杂度。