題目
乙個長度為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
(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個數 演算法描述 輸入兩個長度自定且等長的陣列,然後對他們進行賦值。演算法的思路是分別取他們的中位數進行比較,假設兩...