求两个等长的已排序数组的中位数(《算法导论》P113习题9.3-8)

      [问题]设X[1...n]和Y[1...n]为两个数组,每个都包含n个已排序好的数。给出一个求数组X和Y中所有2n个元素的中位数的、O(lgn)时间的算法。

      [解析]O(lgn)的时间复杂度就是二分查找的复杂度。首先给出一个观察:如果所有元素的中位数是X,那么从数组中同时删除num个小于X的的元素和num个大于X的元素后,产生的新集合的中位数还是X。考虑如下思路求解:每次比较AB数组的中项元素A[n/2],B[n/2],代码实现如下:

 

int FindMiddleElement(int A[],int B[],int n)  
{  
    if (n == 1)  
    {  
        return A[0] > B[0] ? B[0] : A[0];  
    }  
    
    if (A[n/2] == B[n/2])  
    {  
        return A[n/2];  
    }  
    
    if (A[n/2]>B[n/2])  
  {
      // 需要确保A和B中丢掉相同数量的元素                   
        if (n%2 == 0)    //丢掉B[0...n/2 - 1]和A[n/2...n-1]  
        {
			return FindMiddleElement(A,B + n/2,n/2);
		}
        else    //丢掉B[0...n/2 - 1]和A[n/2 + 1...n-1]  
        {
		    return FindMiddleElement(A,B + n/2,n/2 + 1);  
    }  
    else   
    {
		// 需要确保A和B中丢掉相同数量的元素  
        if (n%2 == 0)    //丢掉A[0...n/2 - 1]和B[n/2...n-1]  
		{
            return FindMiddleElement(A + n/2,B,n/2);
		}
        else    //丢掉A[0...n/2 - 1]和B[n/2 + 1...n-1]   
		{
            return FindMiddleElement(A + n/2,B,n/2 + 1); 
	    }
    }  
}

 

  

 

posted @ 2013-12-25 09:25  姚来飞  阅读(408)  评论(0编辑  收藏  举报