兩個序列的中位數問題

2021-09-24 19:16:09 字數 2112 閱讀 5708

題目

乙個長度為l(l

≥1

)l(l\ge1)

l(l≥1)

的公升序序列s,處在第[l/2]個位置的數稱為s的中位數。例如,若序列s1=

(11,13

,15,17

,19

)s_1=(11,13,15,17,19)

s1​=(1

1,13

,15,

17,1

9),則s_1的中位數是15,兩個序列的中位數是含他們所有元素的公升序序列的中位數,例如,若s2=

(2,4

,6,8

,20

)s_2=(2,4,6,8,20)

s2​=(2

,4,6

,8,2

0),則s

1s_1

s1​和s

2s_2

s2​的中位數是11,現在需要找出序列a

aa和b

bb的中位數。

思路:分別求兩個公升序序列a、b

a、ba、

b的中位數,設為a

aa和b

bb,求序列a、b

a、ba、

b的中位數過程如下:

若a =b

a=ba=

b,則a

aa或b

bb即為所求中位數,演算法結束,

若a

a<

b,則捨棄序列a

aa中較小的一半,同時捨棄序列b

bb中較大的一半,要求兩次捨棄的長度相等,

若a

>

ba>b

a>

b,則捨棄序列a

aa中較大的一半,同時捨棄序列b

bb中較小的一半,要求兩次捨棄的長度相等,

在保留的兩個公升序序列中,重複過程1、2

、3

1、2、3

1、2、

3,直到兩個序列中均只含乙個元素為止,較小者即為所求的中位數。

思路依據:

a +b

a+ba+

b的情形,若將b

bb合併到a

aa中,則b

bb的前半部分放到a

aa的前半部分,b

bb的後半部分放到a

aa的後半部分,所以中位數不改變,

a

a<

b的情形,若將b

bb合併到a

aa中,則至少b

bb及前半部分放到a

aa的前半部分,此時最好的情況b

bb就是中位數,那麼b

bb的前半部分就不可能包含中位數,顯然a

aa的後半部分也不可能包含中位數,所以在兩邊同時刪去一半,對最終結果沒有影響。

a

>

ba>b

a>

b的情形同2

22一樣。

**實現:

#include

#include

using

namespace std;

intm_search

(int a,

int b,

int n)

else

}else

else}}

return a[s1]

< b[s2]

? a[s1]

:b[s2];}

intmain()

;int b[5]

=;printf

("%d\n"

,m_search

(a, b,5)

);}

分析:

時間複雜度為o

(log⁡2

n)

o(\log_2n)

o(log2​n

),空間複雜度為o(1

)o(1)

o(1)

。當然本題可以採用先合併a

aa、b

bb,在求中位數的辦法,但是複雜度為o(n

)o(n)

o(n)

,不是最優演算法。

兩個有序序列的中位數

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...

找尋兩個序列的中位數

乙個長度位l的公升序序列,處在l 2 向上取整 的是中位數,現有兩個等長的序列,求這兩個序列合併後 仍然有序 的中位數 利用中位數演算法 設a和b的中位數分別是a和b 1 若a b 則a就是中位數,結束 2 若a b 則捨棄a中較小的一半,b中較大的一般 若序列個數是偶數,則中位數也包含在這一半裡,...

兩個有序序列的中位數

問題 已知有兩個等長的非降序序列s1,s2,設計函式求s1與s2並集的中位數。有序序列a 0 a 1 a n 1 的中位數指a n 1 2 的值,即第 n 1 2 個數 a 0 為第1個數 演算法描述 輸入兩個長度自定且等長的陣列,然後對他們進行賦值。演算法的思路是分別取他們的中位數進行比較,假設兩...