天天看點

有序數組中找中位數

題目:兩個有序數組a和b,大小都是n,尋找這兩個數組合并後的中位數。時間複雜度為o(logn)。

中位數:如果數組的個數是奇數,那麼中位數的值就是有序時處于中間的數;如果數組個數是偶數的,那麼就是有序時中間兩個數的平均值。

方法一:合并時計數

使用merge sort時的merge操作,比較兩個數組時候計數,當計數達到n時,就可以得到中位數,在歸并的數組中,中位數為下标n-1和n的兩個數的平均值。

時間複雜度o(n)。

有序數組中找中位數
有序數組中找中位數

方法二:比較兩個數組的中位數

ar1[]和ar2[]為輸入的數組

算法過程:

1.得到數組ar1和ar2的中位數m1和m2

2.如果m1==m2,則完成,傳回m1或者m2

3.如果m1>m2,則中位數在下面兩個子數組中

a) from first element of ar1 to m1 (ar1[0...|_n/2_|])

b) from m2 to last element of ar2 (ar2[|_n/2_|...n-1])

4.如果m1<m2,則中位數在下面兩個子數組中

a) from m1 to last element of ar1 (ar1[|_n/2_|...n-1])

b) from first element of ar2 to m2 (ar2[0...|_n/2_|])

5.重複上面的過程,直到兩個子數組的大小都變成2

6.如果兩個子數組的大小都變成2,使用下面的式子得到中位數:median = (max(ar1[0], ar2[0]) + min(ar1[1], ar2[1]))/2

時間複雜度:o(logn)。

有序數組中找中位數
有序數組中找中位數

方法三:通過二分查找法來找中位數

基本思想是:假設ar1[i]是合并後的中位數,那麼ar1[i]大于ar1[]中前i-1個數,且大于ar2[]中前j=n-i-1個數。通過ar1[i]和ar2[j]、ar2[j+1]兩個數的比較,在ar1[i]的左邊或者ar1[i]右邊繼續進行二分查找。對于兩個數組 ar1[] 和ar2[], 先在 ar1[] 中做二分查找。如果在ar1[]中沒找到中位數, 繼續在ar2[]中查找。

算法流程:

1) 得到數組ar1[]最中間的數,假設下标為i.

2) 計算對應在數組ar2[]的下标j,j = n-i-1 

3) 如果 ar1[i] >= ar2[j] and ar1[i] <= ar2[j+1],那麼 ar1[i] 和 ar2[j] 就是兩個中間元素,傳回ar2[j] 和 ar1[i] 的平均值

4) 如果 ar1[i] 大于 ar2[j] 和 ar2[j+1] 那麼在ar1[i]的左部分做二分查找(i.e., arr[left ... i-1])

5) 如果 ar1[i] 小于 ar2[j] 和 ar2[j+1] 那麼在ar1[i]的右部分做二分查找(i.e., arr[i+1....right])

6) 如果到達數組ar1[]的邊界(left or right),則在數組ar2[]中做二分查找

有序數組中找中位數
有序數組中找中位數

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

http://www.cnblogs.com/luxiaoxun/archive/2012/09/13/2684054.html

下一篇: 背包問題

繼續閱讀