求解兩個等長公升序序列的中位數

2021-07-22 06:25:17 字數 1151 閱讀 9188

2023年計算機聯考真題

題目描述:

乙個長度為l (l>=1)的公升序序列s,處在第[l/2]個位置的數稱為s的中位數。例如,若序列s1=(11, 13, 15, 17, 19),則s1的中位數是15,兩個序列的中位數是含它們所有元素的公升序序列的中位數。例如,若s2= (2, 4,6,8, 20),則s1和s2的中位數是11。現在有兩個等長公升序序列a和b,試設計乙個在時間和空間兩方面都盡可能高效的演算法,找出兩個序列a和b的中位數。
基本思想:
我們找到了a[n/2] 和 b[n/2]來比較,

如果他們相等,那樣的話,我們的搜尋結束了,因為答案已經找到了a[n/2]就肯定是排序後的中位數了。

如果我們發現b[n/2]>a[n/2],說明什麼,這個數字應該在 a[n/2]->a[n]這個序列裡面, 或者在 b[1]-b[n/2]這裡面。

類似的, 如果b[n/2]注意:當元素個數為奇數時捨棄中間點以前或以後部分,保留中間點

當元素個數為偶數時:往前舍的捨掉中間點,往後捨得保留中間點,這是為了保證元素個數始終相同

**如下:

int find_median( int a, int b, int

length)

else

}

基本思想:
分別求兩個序列的中位數,設為a, b,求a、b的中位數的過程如下:

1、若a = b, 則a或b為所求,演算法結束;

2、若a < b, 則捨棄a中較小的一半,同時捨棄b中較大的一半,要求兩次捨棄的長度相等;

3、若a > b, 則捨棄a中較大的一半,同時捨棄b中較小的一半,要求兩次捨棄的長度相等。

重複步驟1 2 3,直到兩個序列均只含乙個元素,較小者即為所求

**如下:

// 非遞迴版本

int m_search(int a, int b, int n)

//元素個數為偶數

else

}//滿足條件 3

else

//偶數

else}}

return a[s1] < b[s2] ? a[s1] : b[s2];

}

兩種演算法時間複雜度均為o(logn)

兩個等長公升序序列找中位數

乙個長度為 l 的公升序序列 s,處在第 個位置的數稱為 s 的中位數。例如,若序列 則 的中位數是 15,兩個序列的中位數是含他們所有元素的公升序序列的中位數。例如,若 則 和 的中位數是 11。現在有兩個等長公升序序列 a 和 b,試設計乙個演算法,找出兩個序列 a 和 b 的中位數。把 a 和...

求解兩個公升序序列的中位數

描述 乙個長度為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。現...

(演算法)C語言得到兩個公升序序列的中位數

乙個長度為l l 1 的公升序序列s,處在第 l 2 個位置的數稱為s的中位數。例如,若序列s1 11,13,15,17,19 則s1的中位數是15,兩個序列的中位數是含它們所有元素的公升序序列的中位數。例如,若s2 2,4,6,8,20 則s1和s2的中位數是11。現在有兩個等長公升序序列a和b,...