找中位數問題 分治法

2021-07-02 22:40:09 字數 838 閱讀 9486

題目:設a和b都是從小到大已經排好序的n個不等的整數構成的陣列, 如果把a與b合併後的陣列記作c,設計乙個演算法找出c的中位數。

解題思路:

思路一:

對將a和b合併數組成c,並且進行排序,然後直接輸出中位數。

該演算法的時間複雜度為:o(nlogn),空間複雜度為:o(n)。

思路二:

利用分治法。

假定a[0,……,n-1] 和 b[0,……,n-1] 是輸入陣列,令k = [n/2]  (向下取整),取a[k] 和 b[k]比較。

如果a[k] == b[k],則a[k]就是所求的中位數,直接輸出,演算法結束;

如果a[k] < b[k],則a[0,……,k-1] 和 b[k+1,……,n-1] 不含有c的中位數,直接捨棄,下一步遞迴查詢的子問題是a[k,……,n-1] 和 b[0,……,k](注:c中位數必定在這個區間之內);

如果a[k] > b[k],則a[k+1,……n-1] 和 b[0,……,k-1]不含有c的中位數,直接捨棄,下一步遞迴查詢的子問題是a[0,……,k] 和 b[k,……,n-1].

當n == 1,a和b中都只剩下乙個數,那麼取中位數mid = (a[1] + b[1])/2,演算法結束;

該演算法每次將子問題減半(至多差常數1)。

時間複雜度滿足方程:

w(n) = w(n/2) + 1

w(1) = 1

解該方程得:w(n) = o(logn),即時間複雜度為:o(logn)

分治法 中位數問題,C

採用分治法完成如下任務 中位數問題 問題描述 設x 0 n 1 和y 0 n 1 為兩個陣列,每個陣列中含有n個已排好序的數。找出x和y的2n個數的中位數。程式設計任務 利用分治策略試設計乙個o log n 時間的演算法求出這2n個數的中位數。資料輸入 由檔案input.txt提供輸入資料。檔案的第...

演算法實驗之分治法求中位數

利用分治策略試設計乙個o log n 時間的演算法求出這2n個數的中位數。要輸入的內容在檔案1.txt中,輸出的結果在檔案2.txt中。include includeusing namespace std template t mid t a,t b,int len int n if len 2 0...

主元素,中位數以及快速排序問題(分治法問題)

ibm最後有道求主元素的題目,乙個陣列有n個元素,其中有超過n 2的元素相同,請找出這個元素。時間複雜度為o n 方法1 如果乙個元素的個數超過n 2則這個元素必然是這n個元素的中位數。則這個題目是找中位數。方法是通過快速排序變化的來的演算法。如下 做這個題目複習了下快排,選擇乙個pivot,然後圍...