1、實踐題目:
兩個有序序列的中位數
2、題目描述:
知有兩個等長的非降序序列s1, s2, 設計函式求s1與s2並集的中位數。有序序列a0,a1,⋯,an−1的中位數指a(n−1)/2的值,即第⌊(n+1)/2⌋個數(a0為第1個數)。
輸入分三行。第一行給出序列的公共長度n(0≤100000),隨後每行輸入乙個序列的資訊,即n個非降序排列的整數。數字用空格間隔。
在一行中輸出兩個輸入序列的並集序列的中位數。
5
1 3 5 7 9
2 3 4 5 6
4
6
-100 -10 1 1 1 1
-50 0 2 3 4 5
3、演算法描述:
利用二分法的思想,先分別求每個序列的中位數a[m1],b[m2],比較a[m1],b[m2]的大小,如果a[m1]==b[m2],則可以確定合併序列的中位數為a[m1],因為a[m1]大於a[m1]前面的元素,小於a[m1]後面的元素,b[m2]大於b[m2]前面的元素,小於b[m2]後面的元素,而a[m1]又等於b[m2],則可以確定a[m1]為合併序列中處於中間的位置。如果a[m1]b[m2],也分兩種情況,同樣是大取前,小取後,奇數:end1=m1,start2=m2;偶數:end1=m1,end2=m2+1。只要start1**實現:
#include
using namespace std;
int m_search(int a, int b, int n)
for (int i=0;i>b[i];
}cout<4、時間複雜度和空間複雜度的分析:
時間複雜度:二分法的時間複雜度為o(logn)
空間複雜度:o(1)
5、心得體會:
一開始看到這個題,我第乙個想到的是先把兩個序列排成有序的再去找排好序的陣列的中位數,即快排,然後我就發現這種做法的時間複雜度為o(nlogn)。然後想到剛學的二分法,但是在分奇偶的情況卡了很久,最後慢慢試得出了結論。
演算法第二章上機實驗報告
實驗報告 1 實踐題目 pta第二題,改進二分搜尋演算法 2 問題描述 設a 0 n 1 是已排好序的陣列,請改寫二分搜尋演算法,使得當x不在陣列中時,返回小於x的最大元素位置i和大於x的最小元素位置j。當搜尋元素在陣列中時,i和j相同,均為x在陣列中的位置。3 演算法描述 整體框架 1 首先,還是...
第二章實驗報告
實踐題目名稱 找第k小的數 1.問題描述 設計乙個平均時間為o n 的演算法,在n 1 n 1000 個無序的整數中找出第k小的數。輸入格式 輸入有兩行 第一行是n和k,0第二行是n個整數 輸出格式 輸出第k小的數 輸入樣例 在這裡給出一組輸入。例如 10 4 2 8 9 0 1 3 6 7 8 2...
演算法第二章實驗報告
7 1 二分查詢 輸入n值 1 n 1000 n個非降序排列的整數以及要查詢的數x,使用二分查詢演算法查詢x,輸出x所在的下標 0 n 1 及比較次數。若x不存在,輸出 1和比較次數。輸入共三行 第一行是n值 第二行是n個整數 第三行是x值。輸出x所在的下標 0 n 1 及比較次數。若x不存在,輸出...