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

2021-09-11 11:47:34 字數 1905 閱讀 1805

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

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

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

舉個例子

思路:找出將大問題分割成較小規模的相同問題的切割點,並遞迴定義大問題與子問題之間的關係。簡單來說,就是比較兩個區間的中位數,如果第乙個區間的中位數比第二個大,那麼就把第乙個區間的範圍縮小至它的前半段,把第二個區間縮小至它的後半段,然後重複上述過程。具體些,對於兩個陣列 x 和 y,我們可以從他們中分別選取出乙個中位數,並將兩個陣列的左右邊界稱之為 xleft,xright,yleft,yright。對比兩個中位數,如果 x 陣列中的中位數大於 y 陣列中的中位數,且 x 陣列中的元素個數為偶數個,則 x 陣列被切割為 x[xleft, x],y被切割為 y[y+1, yright],如果 x 陣列的元素個數不為偶數個的話,則直接將 x 切割為 x[xleft, x]。如果 x 陣列的中位數小於 y 陣列的中位數,取值情況剛好相反。

遞迴關係:根據上面所述,對於原問題 x[xleft, xright],y[yleft, yright]。假設切割後的子問題為 x[xleft, x],y[y+1, yright]。則求解 x[xleft, xright],y[yleft, yright] 問題的中位數,歸結於求解子問題 x[xleft, x],y[y+1, yright] 的中位數。

遞迴結束條件:當切割後得到的子問題的兩個陣列的長度都為 2 時,整個遞迴結束。

double findmediansortedarrays(vector& nums1, vector& nums2)  else 

}double midsearch(vector& nums1, vector& nums2, int xleft, int xright, int yleft, int yright) else else

}}複製**

如果中位數在陣列 a 中,那麼若 a[m] < b[n-m-2],此時比 a[m] 小的數最多只有 n - 2 個,即 a[m] 不可能為第 n 小數,偏小更新左界;若 a[m] > b[n-m-1],此時比 a[m] 小的數至少有 n 個, a[m] 不可能為第 n 小數,偏大更新右界;若 a[m] 介於 b[n-m-2] 與 b[n-m-1] 則 a[m] 恰好為第 n 小數。中位數在陣列 b 中的情況類似。

注:該方法只返回第 n 小的數。

int findnthnumber(vector& a, vector& b, int n)  

else if (a[m] < b[n - m - 1])

else r = m - 1;//此時比a[m]小的數至少有n個,即a[m]不可能為第n小數,偏大更新右界

} //中位數在b陣列中的情況,和上面類似

l = 0, r = n -1;

while(l <= r)

else if (b[m] < a[n - m - 1])

else r = m - 1;

}}複製**

也可以取 a[m] 與 b[n-m-2] 中較大的乙個,然後與 a[m+1] 和 b[n-m-1] 作比較,簡化後的**如下:

int findnthnumber(vector& a, vector& b, int n)  

else if(tmp > a[m + 1])

else return tmp;

}}複製**

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

設兩個有序陣列的長度均為n,求它們組成的2n長的陣列的中位數。首先說明下中位數的定義 統計學名詞,當變數值的項數n為奇數時,處於中間位置的變數值即為中位數 當n為偶數時,中位數則為處於中間位置的2個變數值的平均數。中位數有個性質 在中位數兩側去掉任意數量的數後,中位數不變 為了簡化,先假設n為奇數,...

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

本部落格所用演算法是受另外一篇部落格所啟發,但該博主給出的 很多邊界條件和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...