乙個長度為 l 的公升序序列 s,處在第
個位置的數稱為 s 的中位數。例如,若序列
,則
的中位數是 15,兩個序列的中位數是含他們所有元素的公升序序列的中位數。例如,若
,則
和
的中位數是 11。現在有兩個等長公升序序列 a 和 b,試設計乙個演算法,找出兩個序列 a 和 b 的中位數。
把 a 和 b 混合到一起再找中位數。實現方法簡單且不為本篇文章討論重點,不再詳細敘述。
將公升序序列左右兩邊同時減去相等個數的數字,中位數不變。
令兩個公升序序列 a , b 的中位數為 a , b,求解過程如下:
① 若 a = b,則 a 或 b 即為所求中位數。
② 若 a < b,則捨棄序列 a 中較小的一半,同時捨棄序列 b 中較大的一半,要求兩次捨棄的長度相等。
③ 若 a > b,則捨棄序列 a 中較大的一半,同時捨棄序列 b 中較小的一半,要求兩次捨棄的長度相等。
在保留的兩個公升序序列中,重複過程 ① ,② ,③,直到兩個序列中均只含乙個元素時為止,較小者即為所求的中位數。
a = b時,容易得到兩個序列在數軸上的大小關係,雖然左右兩邊並沒有絕對大小關係,但是中位數的選取只跟中間位置有關,所以並不影響。
② a != b
a != b時,以 a < b 為例。
對於奇數個數序列:
因為中位數只與公升序序列的位置有關,通過左圖中的有/無絕對大小關係可得 藍1,藍2,綠4,綠5 代表的四個數絕對不可能在中間位置(5),所以把他們刪去,即中位數的大小範圍為 [a , b] 。
對於偶數個數序列:
還是那句話因為中位數只與公升序序列的位置有關,通過右圖中的有/無絕對大小關係可得 藍1,藍2,綠3,綠4 代表的四個數絕對不可能在中間位置(4),所以把他們刪去,即中位數的大小範圍為 ( a , b ]。
//當元素個數為偶數
}else
//同理
else}}
return a[s1]a[s1]:b[s2];
}
求解兩個等長公升序序列的中位數
2011年計算機聯考真題 題目描述 乙個長度為l l 1 的公升序序列s,處在第 l 2 個位置的數稱為s的中位數。例如,若序列s1 11,13,15,17,19 則s1的中位數是15,兩個序列的中位數是含它們所有元素的公升序序列的中位數。例如,若s2 2,4,6,8,20 則s1和s2的中位數是1...
求解兩個公升序序列的中位數
描述 乙個長度為l l 1 的公升序序列s,處在第l 2 若為小數則去掉小數後加1 個位置的數稱為s的中位數。例如,若序列s1 11,13,15,17,19 則s1的中位數是15。兩個序列的中位數是含它們所有元素的公升序序列的中位數。例如,若s2 2,4,6,8,20 則s1和s2的中位數是11。現...
求兩個有序非等長陣列中位數
本部落格所用演算法是受另外一篇部落格所啟發,但該博主給出的 很多邊界條件和n m為偶數的情況未考慮到,這裡我做了一定的完善。原題如下 there are two sorted arrays nums1 and nums2 of size m and n respectively.find the m...