設兩個有序陣列的長度均為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...