求兩個等長有序陣列的中位數

2021-06-27 23:45:06 字數 1918 閱讀 8741

設兩個有序陣列的長度均為n,求它們組成的2n長的陣列的中位數。

首先說明下中位數的定義:

統計學名詞,當變數值的項數n為奇數時,處於中間位置的變數值即為中位數;當n為偶數時,中位數則為處於中間位置的2個變數值的平均數。

中位數有個性質:在中位數兩側去掉任意數量的數後,中位數不變

。為了簡化,先假設n為奇數,那麼a[n/2]是中位數,假設

1. a[n/2]>b[n/2],那麼a[n/2+1]...a[n-1]都大於a[0]...a[n/2]並且大於b[0]...b[n/2],而這些數加起來有n+1個,所以

a[n/2+1

]...a[n-1

]大於所求的中位數;同理,b[0]...b[n/2-1]小於b[n/2]...b[n-1]並且小於a[n/2]...a[n-1], 而這些數加起來有n+1個,所以b[0]...b[n/2-1

]小於所求的中位數。

所以,利用中位數性質,問題縮小成在a[0]...a[n/2]和b[n/2]...b[n-1]這兩個有序陣列中找中位數,可用遞迴。

2. a[n/2]==b[n/2],那麼a[n/2]就剛好位於n-1或n的位置上,所以它就是中位數

3. a[n/2]由此擴充套件一下,當n為偶數時,((double)a[n/2]+(double)a[n/2+1])/2為a的中位數,設a_mid為a的中位數,b_mid為b的中位數,那麼:

1. 當a_mid>b_mid時,a[n/2+1, n-1]都不可能出現中位數,同理b[0, n-1-n/2-1]也不可能出現中位數,所以排除這兩個,可能出現中位數的地方是在:a[0,n/2]和b[n-1-n/2,n-1]

2. 當a_mid==b_mid

時, 中位數是a_mid

3. 當a_mid時, 對稱不表

由此我們可以統一奇數和偶數的公式為:

假設求有序陣列a[la, ra]和b[lb, rb]組成的有序陣列的中位數,兩個陣列的長度相等且為length,那麼:

若a_mid>b_mid,

變成求a[la,la+length/2]和b[rb-length/2,rb]的中位數

若a_mid變成求a[ra-length/2, ra

]和b[lb,lb+length/2

]的中位數

若a_mid==b_mid,

中位數就是a_mid

因此可得code:

int*a;

int*b;

double f(

int la,

int ra,

int lb,

int rb)

else

else

if(m>n)

return f(la,la+length/2,rb-length/2,rb)

;else

if(mreturn f(ra-length/2,ra,lb,lb+length/2)

;else

return m;}}

double findmediansortedarrays(

int a,

int m,

int b,

int n)

還有乙個簡化的中位數的定義,就是無論n是奇數還是偶數,a[n]的中位數就是a[n/2]

這樣,無論n為奇數偶數,可得公式

1. 當a[n/2]>b[n/2]時,

變成求以a[0]開始長度為n-n/2的新陣列和以b[n/2]開始,長度為n-n/2的新陣列的中位數

2. 當

a[n/2]>b[n/2

]時,和1對稱

3. 當a[n/2]==b[n/2

]時a[n/2]就是中位數

可得code:

intfindmediansortedarrays

(int a,

int b,

int length)

0 給主人留下些什麼吧!~~

求兩個等長有序陣列的中位數

兩個有序陣列的長度均為 n,求它們組成的 2n 長的陣列的中位數。中位數的定義 統計學名詞,當變數值的項數 n 為奇數時,處於中間位置的變數值即為中位數 當 n 為偶數時,中位數則為處於中間位置的 2 個變數值的平均數。中位數的性質 在中位數兩側去掉任意數量的數後,中位數不變。舉個例子 思路 找出將...

求兩個有序非等長陣列中位數

本部落格所用演算法是受另外一篇部落格所啟發,但該博主給出的 很多邊界條件和n m為偶數的情況未考慮到,這裡我做了一定的完善。原題如下 there are two sorted arrays nums1 and nums2 of size m and n respectively.find the m...

求兩個等長有序陣列的中位數的logN演算法 分治法

題目 有兩個長為n的非遞減陣列a和b,把b接在a的後面變成長為2n的陣列c。設計演算法求c的中位數 第n小數 思路 o n 的演算法很容易找到,關鍵是用二分的思想設計logn演算法。這題關鍵是用好a和b陣列中腳標和為定值的元素的大小關係。直觀想法是 如果中位數在陣列a中,那麼若a m b n m 1...