问答题 一个长度为L(L≥1)的升序序列S,处在第
问答题 给出算法的基本设计思想;
【正确答案】算法的基本思想是:
分别求出A,B的中位数,设为a,b,求序列A和B的中位数的过程如下:
1)若a=b,则a或b即为所求的中位数,将结果返回,算法结束;
2)若a<b,则舍弃序列A中较小的一半和B中较大的一半,要求舍弃的长度相等;
3)若a>b,则舍弃序列A中较大的一半和B中较小的一半,要求舍弃的长度相等;
在保留的两个升序的序列中,重复上述的1,2,3的过程,直到两个序列中只含有一个元素是为止,较小者即为所求的中位数。
【答案解析】
问答题 根据设计思想,采用C、C++或JAVA语言描述,关键之处给出注释;
【正确答案】算法的实现如下:
int midseareh(int A[],int B[],int n) {
int t1=0,w1=n-1,m1;//序列A的首位数,末尾数,中位数;
int t2=0,w2=n-1,m2;//序列B的首位数,末尾数,中位数;
while(t1!=w1 || t2!=w2) {
m1=(t1+w1)/2;//序列A中位数位置;
m2=(t2+w2)/2;//序列B中位数位置;
if(A[m1]==B[m2])//序列A中位数=序列B中位数;
return m1;//返回序列A的中位数;
if(A[m1]<B[m2])
{//序列A中位数<序列B中位数;
if((t1+w1)%2==0) {
t1=m1;//舍去序列A中位数之前的数,且保留中点;
w2=m2;//舍去序列B中位数之后的数,且保留中点;
}//end if
else {
t1=m1+1;//舍去序列A中位数之前的数;
w2=m2;//舍去序列B中位数之后的数,且保留中点;
}//end else
}//end if
else{
if((t1+w1)%2==0){
w1=m1;//舍去序列A中位数之后的数,且保留中点;
t2=m2;//舍去序列B中位数之前的数,且保留中点;
}//end if
else{
w1=m1+1;//舍去序列A中位数之后的数,且保留中点;
t2=m2;//舍去序列B中位数之前的数;
}//end else
}//end else
}//end while( )
return A[t1]<B[t2]?A[t1]:B[t2];
}//end midsearch( )
【答案解析】
问答题 说明你所设计的算法的时间复杂度和空间复杂度。
【正确答案】算法的时间复杂度和空间复杂度:
算法的时间复杂度为O(log2n);
算法的空间复杂度O(1);
【答案解析】