硕士研究生入学考试数据结构近几年全国联考题汇总优质PPT.ppt
《硕士研究生入学考试数据结构近几年全国联考题汇总优质PPT.ppt》由会员分享,可在线阅读,更多相关《硕士研究生入学考试数据结构近几年全国联考题汇总优质PPT.ppt(69页珍藏版)》请在冰豆网上搜索。
,则有:
2T(n)n/2,即即T(n)log2n/2=O(log2n)。
本题答案为。
本题答案为A。
本题为本题为2011年全国考研题。
年全国考研题。
例例2、设将、设将n(n1)个整数存放到一维数组)个整数存放到一维数组R中。
试设计一个时间和空间两方中。
试设计一个时间和空间两方面尽可能高效的算法,将面尽可能高效的算法,将R中整数序列循环左移中整数序列循环左移p(0pn)个位置,即将)个位置,即将R中的数据序列中的数据序列(X0,X1,Xn-1)变换为变换为(Xp,Xp+1,Xn-1,X0,X1,Xp-1),要求:
,要求:
(1)给出算法的基本设计思想。
)给出算法的基本设计思想。
(2)根据设计思想,采用)根据设计思想,采用C、C+或或Java语言描述算法,关键之处给出注释。
语言描述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。
)说明你所设计算法的时间复杂度和空间复杂度。
本题为本题为2010年全国考研题。
(1)设)设R=(X0,X1,Xp,Xp+1,Xn-1),其中,其中a=(X0,X1,Xp-1)(共有(共有p个元素),个元素),b=(Xp,Xn-1)(共有(共有n-p个元素),并设个元素),并设reverse(R)用于原地逆置数组用于原地逆置数组R,则,则a原地逆置后原地逆置后a变为变为(Xp-1,X1,X0),b原地逆置后原地逆置后b变为变为(Xn-1,Xp-1,Xp),也就是说,也就是说ab=(Xp-1,X1,X0,Xn-1,Xp-1,Xp),再将,再将ab原地逆置变为原地逆置变为(Xp,Xp-1,Xn-1,X0,X1,Xp-1)即为所求,即即为所求,即reverse(R)=reverse(reverse(a),reverse(b)。
(2)对应的算法如下:
)对应的算法如下:
intcreverse(intR,intn,intp)/循环左移循环左移if(p=n)return0;
elsereverse(R,0,p-1);
reverse(R,p,n-1);
reverse(R,0,n-1);
return1;
voidreverse(intR,intm,intn)/将将Rm.n逆置逆置inti;
inttmp;
for(i=0;
i(n-m+1)/2;
i+)tmp=Rm+i;
/将将Rm+i与与Rn-i进行交换进行交换Rm+i=Rn-i;
Rn-i=tmp;
(3)reverse(R,m,n)算法的时间复杂度为算法的时间复杂度为O(n-m),所以,所以creverse(R,n,p)算法的时间复杂度算法的时间复杂度=O(p)+O(n-p)+O(n)=O(n)。
另外,。
另外,creverse(R,n,p)算法算法中只定义几个变量,所以空间复杂度为中只定义几个变量,所以空间复杂度为O
(1)。
【阅卷点评阅卷点评】本题算法应有本题算法应有3个参数,即个参数,即R、n、p,有些考生算法只用一个参数或,有些考生算法只用一个参数或两个参数,如:
两个参数,如:
fun(intR)fun(intR,intn)fun(intR,intp)fun(intn,intp)有的考生只有一个主函数,如有的考生只有一个主函数,如main(),这些表明考生没能掌握基本的算,这些表明考生没能掌握基本的算法或函数设计方法。
法或函数设计方法。
相当一部分考生用了一个中间数组,如:
voidcreverse1(intR,intn,intp)int*R1=(int*)malloc(p*sizeof(int);
inti;
ip;
i+)/将将R0.p-1复制到复制到R1中中R1i=Ri;
in-p;
i+)/将将Rn-p前移前移p个元素位置个元素位置Ri=Ri+p;
for(i=n-p;
in;
i+)/将将R10.p-1中元素复制到中元素复制到Rn-1.n-1中中Ri=R1i-(n-p);
free(R1);
给出算法时间复杂度为给出算法时间复杂度为O(n),空间复杂度为,空间复杂度为O(n),本算法可以正确求解,本算法可以正确求解,但显然不是最佳解题方案。
但显然不是最佳解题方案。
少部分考生用了双重循环求解,如:
voidcreverse2(intR,intn,intp)inti,j;
i+)tmp=R0;
for(j=0;
jn;
j+)Rj=Rj+1;
Rn-1=tmp;
给出算法时间复杂度为给出算法时间复杂度为O(n2),空间复杂度为,空间复杂度为O
(1),本算法可以正确求解,本算法可以正确求解,但显然也不是最佳解题方案。
但显然也不是最佳解题方案。
例例3、一个长度为一个长度为L(L1)的升序序列)的升序序列S,处在第,处在第L/2个位置的数称为个位置的数称为S的中位数。
例如:
若序列的中位数。
若序列S1=(11,13,15,17,19),则,则S1的中位数是的中位数是15。
两个。
两个序列的中位数是含它们所有元素的升序序列的中位数。
例如,若序列的中位数是含它们所有元素的升序序列的中位数。
例如,若S2=(2,4,6,8,20),则,则S1和和S2的中位数是的中位数是11。
现有两个等长升序序列。
现有两个等长升序序列A和和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和和B的中位数。
要求:
的中位数。
(2)根据设计思想,采用)根据设计思想,采用C或或C+或或JAVA语言描述算法,关键之处给语言描述算法,关键之处给出注释。
出注释。
(1)分别求两个升序序列)分别求两个升序序列A、B的中位数,设为的中位数,设为a和和b。
若。
若a=b,则则a或或b即为所求的中位数;
否则,舍弃即为所求的中位数;
否则,舍弃a、b中较小者所在序列之较小一中较小者所在序列之较小一半,同时舍弃较大者所在序列之较大一半,要求两次舍弃的元素个数相半,同时舍弃较大者所在序列之较大一半,要求两次舍弃的元素个数相同。
在保留的两个升序序列中,重复上述过程,直到两个序列中均只含同。
在保留的两个升序序列中,重复上述过程,直到两个序列中均只含一个元素时为止,则较小者即为所求的中位数。
一个元素时为止,则较小者即为所求的中位数。
12345678910345678456756中位数为中位数为5
(2)算法实现如下:
)算法实现如下:
intM_Search(intA,intB,intn)intstart1,end1,mid1,start2,end2,mid2;
start1=0;
end1=n-1;
start2=0;
end2=n-1;
while(start1!
=end1|start2!
=end2)/两个序列中都不是一个元素两个序列中都不是一个元素mid1=(start1+end1)/2;
mid2=(start2+end2)/2;
if(Amid1=Bmid2)returnAmid1;
if(Amid1Bmid2)/分别考虑奇数和偶数,保持两个子数组元素个数相等分别考虑奇数和偶数,保持两个子数组元素个数相等if(start1+end1)%2=0)/若元素为奇数个若元素为奇数个start1=mid1;
/舍弃舍弃A中间点以前的部分且保留中间点中间点以前的部分且保留中间点end2=mid2;
/舍弃舍弃B中间点以后的部分且保留中间点中间点以后的部分且保留中间点else/若元素为偶数个若元素为偶数个start1=mid1+1;
/舍弃舍弃A的前半部分的前半部分end2=mid2;
/舍弃舍弃B的后半部分的后半部分elseif(start1+end1)%2=0)/若元素为奇数个若元素为奇数个end1=mid1;
/舍弃舍弃A中间点以后的部分且保留中间点中间点以后的部分且保留中间点start2=mid2;
/舍弃舍弃B中间点以前的部分且保留中间点中间点以前的部分且保留中间点else/若元素为偶数个若元素为偶数个end1=mid1;
/舍弃舍弃A的后半部分的后半部分start2=mid2+1;
/舍弃舍弃B的前半部分的前半部分returnAstart1Bstart2?
Astart1:
Bstart2;
(3)上述所给算法的时间、空间复杂度分别是)上述所给算法的时间、空间复杂度分别是O(log2n)和和O
(1)。
【评分说明评分说明】若考生设计的算法满足题目的功能要求且正确,则(若考生设计的算法满足题目的功能要求且正确,则
(1)、()、
(2)根据所)根据所实现算法的效率给分。
考生也可以采用实现算法的效率给分。
考生也可以采用2路归并的思想实现,算法如下:
路归并的思想实现,算法如下:
intM_Search(intA,intB,intn)inti,j,k;
i=j=k=0;
while(in&
jn)k+;
if(Ailink;
while(p!
=NULL&
countlink;
if(p=NULL)/没有时返回没有时返回0return(0);
elsewhile(p!
=NULL)/p和和q同步后移直到同步后移直到p=NULLq=q-link;
p=p-link;
printf(%d,q-data);
return
(1);
【阅卷点评阅卷点评】本题算法应有两个参数,即本题算法应有两个参数,即list和和k,有些考生算法只用一个参数甚至没有,有些考生算法只用一个参数甚至没有参数,如:
参数,如:
fun(LinkListlist)fun(intk)这些表明考生没能掌握基本的算法或函数设计方法。
其中这些表明考生没能掌握基本的算法或函数设计方法。
其中LinkList类型可由类型可由考生自定义,这里考生自定义,这里LinkList是节点指针类型。
是节点指针类型。
相当一部分考生先求出节点个数相当一部分考生先求出节点个数n,再从头找到第,再从头找到第n-k+1个节点,如:
个节点,如:
intSearchk(LinkListlist,intk)LinkListp=list-link,q;
intn=0,j=0;
=NULL)/求表长求表长n+;
q=list;
while(q!
jlink;
if(q=NULL)/未找到返回未找到返回0return0;
else/找到了输出节点值并返回找到了输出节点值并返回1printf(%d,q-data);
本题两次扫描单链表,会扣除一定的分数。
有些考生在求解时自己假本题两次扫描单链表,会扣除一定的分数。
有些考生在求解时自己假设头节点中含有单链表长度设头节点中含有单链表长度n,算法中不再包含求表长的实现,这样也会,算法中不再包含求表长的实现,这样也会扣分。
有些考生还假设是循环单链表或循环双链表,这样得分会很低。
扣分。
本题是典型的单链表查找题目,满分者占极少数。
例例5