空間限制相當苛刻,時間限制卻又並不寬裕,需要時間換空間,但代價又不能太大,要盡量利用可以利用的空間,餘下的再用時間換取。 開始認為這是乙個極為講究細節技巧的題目,但空間和時間總是不夠用,當夠用的時候演算法又存在致命缺陷,先後歷經mle(6)、tle(5)、wa(4)、re(1),時隔20天,遍尋各種解決方案無果。後來經人提醒,才發現出題者用心極其險惡!記憶體限制在2mb,而最大資料量為500000個int型別資料,就是4kb*500000=2000000kb=1.9mb<2.0mb。當然,直接開這麼大的陣列仍然會爆記憶體,畢竟還存在其他的資料,但開一半的陣列就足夠用來尋找中位數了。然後在時間方面,排序仍必不可少,但保持了一半資料後,對新的資料的有序插入的效率要求較高,綜合考慮可以使用heap。至此,此題告破。
run time: 0.82sec
run memory: 1160kb
code length: 631bytes
submit time: 2011-12-21 00:36:43
// problem#: 4224
// submission#: 1102823
// the source code is licensed under creative commons attribution-noncommercial-sharealike 3.0 unported license
// uri:
#include #include using namespace std;
int main()
}printf( "%.1f\n", n % 2 == 1 ? (float)data[ 0 ]: ( (float)data[ 0 ] + max( data[ 1 ], data[ 2 ] ) ) / 2 );
return 0;
}
海量資料找中位數
題目如下 只有2g記憶體的pc機,在乙個存有10g個整數的檔案,從中找到中位數,寫乙個演算法。給出了四種方法來解決 演算法 1.利用外排序的方法,進行排序 然後再去找中位數 2.另外還有個思路利用堆 先求第1g大,然後利用該元素求第2g大,然後利用第2g大,求第3g大.當然這樣的話雖不需排序,但是磁...
找中位數問題 分治法
題目 設a和b都是從小到大已經排好序的n個不等的整數構成的陣列,如果把a與b合併後的陣列記作c,設計乙個演算法找出c的中位數。解題思路 思路一 對將a和b合併數組成c,並且進行排序,然後直接輸出中位數。該演算法的時間複雜度為 o nlogn 空間複雜度為 o n 思路二 利用分治法。假定a 0,n ...
10G個數找中位數
題目 在乙個檔案中有 10g 個整數,亂序排列,要求找出中位數。記憶體限制為 2g。只寫出思路即可 記憶體限制為 2g的意思就是,可以使用2g的空間來執行程式,而不考慮這台機器上的其他軟體的占用記憶體 關於中位數 資料排序後,位置在最中間的數值。即將資料分成兩部分,一部分大於該數值,一部分小於該數值...