o(logn)
兩種方法:
一、二分查詢
中位數只有乙個,它前面有 c = (m+n-1)/2 個數比它小。中位數要麼出現在陣列a中,
要麼出現在陣列b中,我們先從陣列a開始找。考察陣列a中的乙個元素a[p], 在陣列a中,
有 p 個數比a[p]小,如果陣列b中恰好有 c-p 個數比 a[p] 小, 則倆陣列合併後就恰好有 c 個數比a[p]小,
於是a[p]就是要找的中位數。 如下圖所示:
如果a[p] 恰好位於 b[c-p-1] 和 b[c-p] 之間,則 a[p] 是中位數
如果a[p] 小於 b[c-p-1] ,說明a[p] 太小了,接下來從 a[p+1] ~a[m-1]開始找
如果a[p] 大於 b[c-p] ,說明a[p] 太大了,接下來從 a[0] ~a[p-1]開始找。
如果陣列a沒找到,就從陣列b找。
二、比較兩個陣列的中位數
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.如果m1a) 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
兩個有序陣列中位數
大小m和n分別有兩個排序陣列a和b。找到兩個排序陣列的中值。總的執行時間複雜度應該是o log m n class solution return findkth a,b,0,0,m,n,s 2 findkth a,b,0,0,m,n,s 2 1 2 private double findkth v...
兩個有序陣列中位數
首先我們可以不斷分割得到這個kkk。首先兩個陣列都分配k 2 frac 2k 如果第k 2 frac 2k 個數,第乙個陣列小於第二個陣列,那麼第乙個陣列的k 2 frac 2k 個數一定不是答案。問題可以變成乙個子問題,上乙個陣列從k2 1 frac 1 2k 1開始。相當於我們每次要去掉k 2 ...
兩個有序陣列的中位數
問題一 兩個有序陣列,且長度都為n。找出中位數。解決這個問題的方法很多。方法一 基於歸併排序的merge方法。找出兩個陣列中第n大的數和第n 1大的數,然後求它們的平均數。時間複雜度為o n 方法二 比較兩個陣列中的中位數的大小。每一次比較都能縮小兩個陣列的搜尋範圍。時間複雜度為o nlgn pub...