問題描述:設x[0:n-1]和y[0:n-1]為2 個陣列,每個陣列中含有n 個已排好序的數。試設計乙個
o(log n)時間的演算法,找出x和y 的2n個數的中位數。
例如,當n=7,x=[1,3,6,7,8,9,10];y=[2,4,5,11,12,13,14]時,x 和y
的中位數是7。
«演算法設計:
對於給定的n 個元素的陣列x[0:n-1]和y[0:n-1],試設計乙個o(log n)時間演算法,計
算x 和y 的中位數。
«資料輸入:
輸入資料由檔名為input.txt的文字檔案提供。
檔案的第1行是每個陣列中元素個數n;接下來的2行中每行有n 個整數,分別為x 和
y 中元素。
«結果輸出:
將計算出的x 和y 的中位數輸出到檔案output.txt中。
輸入檔案示例 輸出檔案示例
input.txt output.txt
7 7
1 3 6 7 8 9 10
2 4 5 11 12 13 14
#include #include #include using namespace std;bool ismiddle( int a, int b, int max, int &i, int& upper, int& lower , int& result )
else
bresult = true;
} else
else
if ( a[i] >= b[max-i-2] && a[i] <= b[max-i-1] )
}result/=2;
return bresult;
}int getmiddle( int a1, int a2, int length )
} i2 = ( l2+u2) /2;
if ( abs( u2-l2) >1 )
}} return result;
}int main()
ofstream outfile( outfilename.c_str(), ios_base::out | ios_base::trunc );
if ( outfile.fail() )
int len =0;
while ( !(infile>> len) )
if ( len <=0 )
int *a1 = new int[len];
int *a2 = new int[len];
int number=0, i=0;
for ( i=0; i>number) && !infile.eof() );
if ( i3.:輸入二叉樹的兩個節點,輸出它們的最近公共祖先節點
struct node
4.上億個單詞,如何設計演算法去掉其中重複的單詞,要求寫出程式,並估算時間和空間複雜度
BFPRT(中位數的中位數)演算法
又稱為 中位數的中位數演算法 該演算法由 blum floyd pratt rivest tarjan 在1973年提出,最壞時間複雜度為o n 最差的空間複雜度為o logn 演算法步驟 1 將 n 個元素劃分為 n 5 個組,每組 5 個元素,若有剩餘,捨去 2 使用排序方法找到 n 5 個組中...
演算法 動態中位數問題
輸入一組整數a1,a2,an 每輸入乙個整數,輸出到此時為止的中位數。中位數定義 如果數串的大小是偶數 2j,中位數是從小到大排列的第 j 個數 如果數串的大小是奇數 2j 1,中位數是從小到大排列的第 j 1 個數。一組整數,數字和數字之間以空格隔開。一組整數,數字和數字之間以空格隔開。最後乙個數...
演算法題 中位數問題
平時我們要找中位數還得排一下序,但是如果掌握了堆這乙個結構。我們就只需要乙個大頂堆和乙個小頂堆就可以了。大頂堆和小頂堆的性質不贅述,但是乙個比較重要的提一下,就是大頂堆堆頂是整個堆的最大值,小頂堆的頂必然是最小值。並且我們要實現的中位數的演算法,還需要保證小頂堆的最小值大於大頂堆的最大值。1 有了這...