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