No.0024-CareerCup

問題描述

Given a packed file with 1Tb of 64-bit doubles (first 8 bytes are first double, next 8 bytes are next, etc), find the exact value of median. For simplicity assume the number of doubles is odd. You cannot modify the file and you have only 8Gb of free memory. You may use no more than 2 passes through file and your algorithm should work in all cases.
給1Tb的64比特double類型數(shù)據(jù)永毅,每一個占8字節(jié)蜕窿。在限制8GB內(nèi)存魏宽,不多于2遍遍歷文件的條件下萨螺,求準確的中位數(shù)。假設(shè)有奇數(shù)個double吃衅。

詢問補充

思路分析

這屬于大數(shù)據(jù)問題往踢。
首先是做一些基本的計算。
1T=1024G=2^40B徘层,因為1個Double有8B峻呕,因此總共是2^37個Double數(shù)據(jù)。

假如沒有限制

這類帶限制的問題的一個套路就是惑灵,先思考沒有限制的解法山上。
就和普通算法題思考暴力破解方法類似。當(dāng)然不能花太多時間英支。
最直白的就是排序佩憾,然后選中間那個就是中位數(shù)了。當(dāng)然在這里不太現(xiàn)實,因為要容下所有Double的話妄帘,需要1T內(nèi)存楞黄。
另一個常見的求中位數(shù)的方法也需要大量內(nèi)存,就是維持min heap和max heap抡驼,把數(shù)據(jù)分成兩份鬼廓,中位數(shù)就在堆頂。不過這個方法同樣對內(nèi)存沒有優(yōu)化致盟。
不用內(nèi)存的方法:每次只處理1位碎税,知道中位數(shù)在哪里,然后繼續(xù)馏锡,直至找到雷蹂。例如第一次計數(shù)最高位為0的和為1的,然后知道中位數(shù)在哪一堆杯道,之后重復(fù)即可匪煌。缺點是需要遍歷足足64次。
優(yōu)化一點內(nèi)存的方法:8B=64bit党巾,直接二分萎庭,也就是用高32位作為桶的標簽來做桶。那么就有2^32個桶齿拂。然后就可以找到中位數(shù)在哪個桶驳规,之后繼續(xù)重復(fù)以低32位作為桶的標簽再來。因為每個桶最多有2^37個Double署海,也就是說每個桶需要37位來表示這個桶里面有多少Double达舒,第一次分32位,也就是說需要37*2^32bit的內(nèi)存叹侄,約20Gb。這種方法2次遍歷昨登,符合題目條件趾代。

有限制

因為只有8G內(nèi)存,而上面提到的優(yōu)化內(nèi)存之后的方法仍舊需要20G丰辣,因此還得再繼續(xù)考慮優(yōu)化撒强。

解法

這個思路點破了也就沒什么了,就是取模的意思笙什。當(dāng)然還是比較巧妙的飘哨。
首先對半分桶的思路是沒有問題的。大部分大數(shù)據(jù)問題都有類似的思路琐凭。而很明顯第一次遍歷的時候內(nèi)存壓力是最大的芽隆,因此只要能cover第一次,后面的都沒有問題。
因為有2^32個桶胚吁,那么造2^32的字節(jié)數(shù)組牙躺,也就是說每個容量是1byte,那么需要4GB腕扶。
此外孽拷,創(chuàng)造一個32bit的整型數(shù)組。
對于字節(jié)數(shù)組半抱,因為1byte=8bit脓恕,2^8=256,也就是說只能計數(shù)255次窿侈,當(dāng)超過次數(shù)的時候即溢出炼幔,從0開始,那么最多可以溢出2^37/2^8=2^29次棉磨,每次溢出時把對應(yīng)的前綴加入到整型數(shù)組當(dāng)中江掩,也就是最多有2^29*32/8=2GB。
當(dāng)?shù)谝槐楸闅v結(jié)束時乘瓤,因為每次溢出都會把前綴加入到整型數(shù)組环形,因此可以對整型數(shù)組從小到大排序,前綴出現(xiàn)的次數(shù)也就代表著溢出次數(shù)衙傀,一個前綴實際存在的次數(shù)就是桶里面剩余的次數(shù)+整型數(shù)組里面出現(xiàn)的次數(shù)x256抬吟。這樣就做到了對前綴的計數(shù)。
之后找到中位數(shù)所在的前綴之后统抬,再對低32位進行一次即可火本。
該方法僅僅使用了6G內(nèi)存,還有2G剩余聪建。

總結(jié)

非常典型的Big Data問題钙畔,很有代表性。難度:medium~hard金麸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末擎析,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挥下,更是在濱河造成了極大的恐慌揍魂,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡冈止,警方通過查閱死者的電腦和手機稳捆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人藻治,你說我怎么就攤上這事站绪÷希” “怎么了遂鹊?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蔗包。 經(jīng)常有香客問我秉扑,道長,這世上最難降的妖魔是什么调限? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任舟陆,我火速辦了婚禮,結(jié)果婚禮上耻矮,老公的妹妹穿的比我還像新娘秦躯。我一直安慰自己,他們只是感情好裆装,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布踱承。 她就那樣靜靜地躺著,像睡著了一般哨免。 火紅的嫁衣襯著肌膚如雪茎活。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天琢唾,我揣著相機與錄音载荔,去河邊找鬼。 笑死采桃,一個胖子當(dāng)著我的面吹牛懒熙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播普办,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼工扎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衔蹲?” 一聲冷哼從身側(cè)響起定庵,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踪危,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猪落,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡贞远,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了笨忌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓝仲。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袱结,到底是詐尸還是另有隱情亮隙,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布垢夹,位于F島的核電站溢吻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏果元。R本人自食惡果不足惜促王,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望而晒。 院中可真熱鬧蝇狼,春花似錦、人聲如沸倡怎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽监署。三九已至颤专,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間焦匈,已是汗流浹背血公。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缓熟,地道東北人累魔。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像够滑,于是被迫代替她去往敵國和親垦写。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 9.3.3 快速排序 ??快速排序?qū)⒃瓟?shù)組劃分為兩個子數(shù)組彰触,第一個子數(shù)組中元素小于等于某個邊界值梯投,第二個子數(shù)組中的...
    RichardJieChen閱讀 1,843評論 0 3
  • Java8張圖 11、字符串不變性 12况毅、equals()方法分蓖、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,704評論 0 11
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,805評論 1 10
  • 孩子們的暑假來了尔许,真的是羨慕么鹤,對于工作的我,心里有一個小小的夢味廊,好想把英語學(xué)好蒸甜,英語一直以來都是我的痛棠耕,從初中起就...
    糖葫蘆酸溜溜閱讀 167評論 0 0
  • 上學(xué)時,有的時候總在注意自己的行為禮儀柠新,要優(yōu)雅或者要有范窍荧,所以有的時候總是害羞不敢做。其實歸根究底就是想在自己心中...
    卷紙泡閱讀 622評論 0 0