全部题库 / 计算机 / 试题详情
简答题 计算机
2013-09-28

(15 分)一个长度为 L(L≥1)的升序序列 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 的中位数。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用C 或 C++或JAVA 语言描述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。

参考答案

暂无

答案解析

(1)算法的基本设计思想如下。 
分别求出序列 A 和 B 的中位数,设为 a 和 b,求序列 A 和B 的中位数过程如下: 
1)若 a=b,则 a 或 b 即为所求中位数,算法结束。 
2)若 a<b,则舍弃序列 A 中较小的一半,同时舍弃序列B 中较大的一半,要求舍弃的长 度相等; 
3)若 a>b,则舍弃序列 A 中较大的一半,同时舍弃序列 B 中较小的一半,要求舍弃的 
长度相等; 
在保留的两个升序序列中,重复过程 1)、2)、3),直到两个序列中只含一个元素时为止,较小者即为所求的中位数。 
(2)算法的实现如下: 
int M_Search(int A[],int B[],int n){
int s1=0,d1=n-1,m1,s2=1,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]; //满足条件 1) 
if(A[m1]<B[m2]){ //满足条件 2) 
if((s1+d1)%2==0) { //若元素个数为奇数 
s1=m1; //舍弃 A 中间点以前的部分且保留中间点 
d2=m2; //舍弃 B 中间点以后的部分且保留中间点 
}
else{ //元素个数为偶数 
s1=m1+1; //舍弃 A 中间点及中间点以前部分 
d2=m2; //舍弃 B 中间点以后部分且保留中间点 
}
} 
else{ //满足条件 3) 
if((s1+d1)%2==0) { //若元素个数为奇数 
d1=m1; //舍弃 A 中间点以后的部分且保留中间点 
s2=m2; //舍弃 B 中间点以前的部分且保留中间点 
}
else{ //元素个数为偶数 
d1=m1+1; //舍弃 A 中间点以后部分且保留中间点 
s2=m2; //舍弃 B 中间点及中间点以前部分 
}
}
} 
return A[s1]<B[s2]? A[s1]:B[s2];
} 
(3)算法的时间复杂度为 O(log2n),空间复杂度为 O(1)。

你可能感兴趣的试题