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

2021-06-10 04:53:20 字數 1220 閱讀 4076

題目:有兩個長為n的非遞減陣列a和b,把b接在a的後面變成長為2n的陣列c。設計演算法求c的中位數(第n小數)。

思路:o(n)的演算法很容易找到,關鍵是用二分的思想設計logn演算法。這題關鍵是用好a和b陣列中腳標和為定值的元素的大小關係。

直觀想法是:如果中位數在陣列a中,那麼若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中的情況類似。

[cpp]view plain

copy

#include 

using

namespace

std;  

intfindnthnumber(

inta, 

intb, 

intn)  

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;  

}  }  

intmain();  

intb = ;  

cout0;  

}  

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

[cpp]view plain

copy

#include 

using

namespace

std;  

intfindnthnumber(

inta, 

intb, 

intn)  

else

if(tmp > a [m + 1])  

else

return

tmp;  

}  }  

intmain();  

intb = ;  

cout0;  

}  

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

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

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

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

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

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