【演算法導論學習-016】兩個已排過序的等長數組的中位元(median of two sorted arrays)

來源:互聯網
上載者:User

標籤:演算法導論   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);        }    } }


 


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.