題目
乙個長度為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 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 (log2 n) o(\log_2n) o(log2n ),空間複雜度為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個數 演算法描述 輸入兩個長度自定且等長的陣列,然後對他們進行賦值。演算法的思路是分別取他們的中位數進行比較,假設兩...#include
兩個有序序列的中位數
找尋兩個序列的中位數
兩個有序序列的中位數