兩個有序序列的中位數

2021-08-31 11:41:34 字數 1291 閱讀 6660

問題:

已知有兩個等長的非降序序列s1, s2, 設計函式求s1與s2並集的中位數。有序序列a​0​​,a​1​​,⋯,a​n−1​​的中位數指a​(n−1)/2​​的值,即第⌊(n+1)/2⌋個數(a​0​​為第1個數)。

演算法描述:

① 輸入兩個長度自定且等長的陣列,然後對他們進行賦值。演算法的思路是分別取他們的中位數進行比較,假設兩個陣列如下:

1 3 5 7 9
2 3 4 5 6
上面陣列的中位數是比下面陣列的中位數大的,接下來的操作就是取大中位數的左邊(包括中位數),取小中位數的右邊(包括中位數)。

1 3 5
4 5 6
再次重複以上操作,最後有

3 5
4 5
接下來已經不能再分別取他們的中位數縮小範圍了,所以對兩個陣列進行比較。取陣列的首位進行比較,如上即是3和4進行比較,若是哪邊比較小就取它的下一位進行比較。過程就是3和4比(3比4小,所以下標加1)→5和4比(4比5小,所以得到中位數為4)→中位數為4。

這是當陣列為奇數長度的情況,若是陣列長度為1,或者是陣列長度為偶數,要再次進行討論。

② 當陣列長度為1時,比較兩個數,誰比較小誰就是中位數。

③ 當陣列長度為偶數時,

-100 -10 1 1 1 1
-50 0 2 3 4 5
在第一步,取陣列的中位數時候,若是按照奇數的方法,我們會發現,最後取出來的兩個陣列不是等長的,這樣的話就會對我們的實際結果造成影響。如上,我們可以乙個陣列取第三個數,乙個陣列取第四個數這樣進行比較,這樣接下來得到的陣列都是等長的。接下來步驟和奇數陣列一樣。

④ 在這裡,偶數陣列這樣的取法原因是,我們每次取新陣列出來,只要兩個陣列的長度和加起來是原來陣列的一半或者大於一半,我們就可以保證中位數一直在我們取出來的新陣列裡面,不會出現中位數丟失的情況。

演算法時間及空間複雜度分析:

時間複雜度:每一次呼叫的過程為判斷餘下陣列長度是否大於2,接下來判斷陣列個數是奇數個還是偶數個,最後判斷兩個陣列的中位數誰大誰小。所以t(n) = o(1)+o(1)+o(1)。總共執行次數為logn次。在主函式中,執行的語句為建立兩個陣列還有陣列左右下標等變數,和為陣列賦值。所以總的時間複雜度為t(n) = logn*t(n)+o(n)+o(1) = o(logn)。

空間複雜度:演算法中輔助空間並不隨著陣列長度n而線性增大,所以空間複雜度為o(1)。

兩個有序序列的中位數

5 7 兩個有序序列的中位數 25分 已知有兩個等長的非降序序列s1,s2,設計函式求s1與s2並集的中位數。有序序列a0,a1,an 1a 0,a 1,cdots,a a 0 a 1 a n 1 的中位數指a n 1 2a a n 1 2 的值,即第 n 1 2 lfloor n 1 2 rflo...

兩個有序序列的中位數

7 1 兩個有序序列的中位數 30 分 已知有兩個非降序序列s1,s2,求s1與s2歸併成乙個序列的低位中位數。有序序列a0,a1,an 1的中位數指a n 1 2的值,即第 n 1 2 個數 a0為第1個數 輸入格式 輸入分4行。第一行給出第乙個序列的長度n1 0輸出格式 在一行中輸出兩個輸入序列...

兩個有序序列的中位數

已知有兩個等長的非降序序列s1,s2,設計函式求s1與s2並集的中位數。有序序列a 0 a 1 a n 1 的中位數指a n 1 2 的值,即第 n 1 2 個數 a 0 為第1個數 輸入分三行。第一行給出序列的公共長度n 0在一行中輸出兩個輸入序列的並集序列的中位數。5 1 3 5 7 9 2 3...