首先呢,考研数据结构和算法是得分关键,题目有简单的,也有复杂的,在时间复杂度和空间复杂度上都要求高效率,要想花较短的时间得到大把的分数需要自己考虑清楚,平时多多积累。用O(n)的时间复杂度和O(1)的空间复杂度写出来的算法往往是最好的,一般没什么大问题一般都给满分,但是这种算法比较难思考,时间复杂度一般没啥问题,都是在空间复杂度上做文章。考研的时间紧张,题量较大,花费较短的时间得到大把的分数才是关键,提个醒。。。一起学习,共同考上研究生,加油啊!!!每日一道数据结构算法题,一段时间总结一次,就一定有质的变化。
2011年计算机联考真题
一个长度为L的升序序列S,处在第n/2个位置的数称为S的中位数,例如:S1=(11,13,15,17,19),则中位数是15,S2=(2,4,6,8,20),S1和S2的中位数是11,现在有两个等长的升序序列A和B,设计高效算法,找出它们的中位数。
拿到这样一个问题,好像很好写,用归并排序的思想,设定两个指针,left和right,给它们排序合并到一个新的数组中,中位数就找出来啦!是不是很简单?但是这样就用到了O(2n)的空间复杂度了,算法不够高效,在考场想不出其他的方法就用这个,好写,思路简单,分数一大半得到。
接下来写个标准答案。
算法思想:设A和B的中位数是a和b。
1.若a=b,则中位数就是a或者b。
2.若a>b,则舍弃序列A中较大的一半,同时舍弃序列B中较小的一半,要求两次舍弃的长度要相等。
3.若a<b,则与2相反。
在保留的两个升序序列中,重复1.2.3.,直到两个序列中只含一个元素为止,较小者即为所求的中位数。
**int M_Search(int A[],int B[],int n){
int s1=0,d1=n-1,m1,s2=0,d2=n-1,m2; //分别表示序列A和B的首位数、末尾数和中位数
while(s1!=d1||s2!=d2){
m1=(s1+d1)/2;
m2=(s2+d2)/2;
if(A[m1]==B[m2])
return A[m1];
if(A[m1]<B[m2]){
if((s1+d1)%2==0){
s1=m1;
d2=m2;
}
else{
s1=m1+1;
d2=m2;
}
}
else{
if((s2+d2)%2==0){
d1=m1;
s2=m2;
}
else{
d1=m1;
s2=m1+1;
}
}
}
return A[s1]<B[s1]?A[s1]:B[s2];
}**
本题运用了类似二分查找的方法,比较大小,一步一步将序列减小,最后成为一个数,算法的时间复杂度是O(log2n),空间复杂度为O(1),两个方面都虐暴第一个。可能,这就是算法吧。。。本次总结一题。