標籤:演算法導論 median of two sorted
問題來源
《演算法導論》P223 9.3-8:
Let X[1..n] and Y[1..n] be two arrays, each containing nnumbers already in sorted order. Give an O(lgn)-time algorithm to find themedian of all 2n elements in arrays X and Y.
翻譯過來即:求兩個等長(n個元素)的已排序數組A和B的中位元
方案1:對兩個數組進行歸併直到統計到第n個元素(複雜度O(n))方案2:從A的中位元出發,二分尋找直到滿足條件(複雜度O(lgn))
參考:https://gist.github.com/richzw/3780428。注意:參考代碼中有明顯錯誤。
這也是題目中的要求。從A的中位元出發,即k=(n-1)/2,則B對應的指標是n-1-k的話能保證A中小於A[k]的元素個數為k個,B中小於B[n-1-k]-的元素為為n-1-k個,只要二分尋找到滿足下麵條件的A[k]就行——A和B中小於A[k]的元素個數為n-1個,A[k]為第n個數,即中位元。
A[k]>=B[n-k-1]&&A[k]<=B[n-k]
/** * 建立時間:2014年8月18日上午10:25:49 * 項目名稱:Test * @author CaoYanfeng * @sinceJDK 1.6.0_21 * 類說明: 編譯通過 */ public classMedianofTowArray { /** * @paramargs */ public static voidmain(String[] args) { // TODOAuto-generated method stub int[] array1={4,5,6,7}; int[] array2={3,5,6,7}; /*返回{3,4,5,5,6,6,7,7}的中間值,即6或者5*/ int result1=MedianofTowArray2(array1, array2); int result2=getMedian(array1, 0, array1.length-1, array1.length, array2); System.out.println("進行初始判斷後再遞迴:"+result1+"\n直接遞迴:"+result2); }/*排除兩種特殊情況(即A與B不重合的情況)再進行遞迴進行二分尋找*/ public static int MedianofTowArray2(int[] array1,int[] array2) { int n=array1.length; if (array1[n-1]<array2[0]){ return array1[n-1]; }else if (array2[n-1]<array1[0]){ return array2[n-1]; }else { return getMedian(array1, 0, n-1, n, array2); } } /*直接遞迴進行二分尋找,參考代碼中有錯誤,這裡已經修改*/ public static intgetMedian(int[] array1,int low,int high,int n,int[] array2) { int k=(high+low)/2; if (k==n-1||k==0){ return array1[k]; }else if (k>0&&k<n-1&&array1[k]>=array2[n-k-1]&&array1[k]<=array2[n-k]) { return array1[k]; }else if (array1[k]>array2[n-k-1]){ return getMedian(array1, low, k-1, n, array2); }else { return getMedian(array1, k+1, high, n, array2); } } }