大數(shù)據(jù)問題處理

一、在一個(gè)文件中有 10G 個(gè)整數(shù),亂序排列,要求找出中位數(shù)。內(nèi)存限制為 2G。
解決方案:桶排序。
1、讀入內(nèi)存2G數(shù)據(jù),一個(gè)整數(shù)四個(gè)字節(jié),將這四個(gè)字節(jié)取最高的一個(gè)字節(jié)即8位(用>>位移法取出)
2、一個(gè)字節(jié)共256種可能性,開辟256個(gè)文件,根據(jù)每個(gè)數(shù)的高8位寫入文件
3、重復(fù)上述算法直到所有數(shù)算完,同時(shí)記錄每個(gè)文件中的數(shù)的數(shù)量。
4、第一個(gè)文件數(shù)的個(gè)數(shù)+第二個(gè)文件數(shù)的個(gè)數(shù)... 可以判斷中位數(shù)在第幾個(gè)桶里面
5、把這個(gè)桶整個(gè)讀入內(nèi)存,之后如果大小小于2G就不用寫文件了,在內(nèi)存中計(jì)算就可以
6、這個(gè)桶里面的數(shù)高8位都一樣,用1中的方法去取第二高的字節(jié)并重復(fù)上面的算法,然后取第三高的字節(jié)重復(fù)算法,最后一個(gè)字節(jié)可以接著桶排序,也可以快排,就能得出中位數(shù)了
二、10億個(gè)整數(shù),找出最大的1000個(gè)。
解決方案:有重復(fù)可以用分治法+快排或者小頂堆,如果沒有重復(fù)可以桶排
1、分治法+快排:將數(shù)分成內(nèi)存能裝的下的分?jǐn)?shù),比如100份,每分進(jìn)行快排得到最大的1000個(gè),然后將100*1000個(gè)數(shù)進(jìn)行快排取1000個(gè)。這里快排方法如下:每趟快排可以將數(shù)組分成數(shù)量不一定的兩部分,如果大的那份多余1000,再對著分進(jìn)行一次快排,如果再多再對多的那份快排一次,如果少了則對少的這份快排一次,如此循環(huán)直到夠1000個(gè)為止。
2、小頂堆:先從文件中讀取1000個(gè)數(shù)到內(nèi)存,建小頂堆,之后依次讀取,每讀一個(gè)數(shù)就和堆頂比較,小于堆頂則丟棄,大于堆頂則與堆頂交換再重建堆,直到全部讀取完畢。
3、桶排序:按最高位分256個(gè)桶,最高的一個(gè)應(yīng)該超過1000個(gè)數(shù),再把這個(gè)桶拿出來按第二位繼續(xù)分桶,直到夠數(shù)了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 教你如何迅速秒殺掉:99%的海量數(shù)據(jù)處理面試題 本文經(jīng)過大量細(xì)致的優(yōu)化后,收錄于我的新書《編程之法》第六章中,新書...
    Helen_Cat閱讀 7,587評(píng)論 1 39
  • 摘要:本文將向您講述諸多數(shù)據(jù)處理面試題以及方法的總結(jié)。 第一部分、十道海量數(shù)據(jù)處理面試題 1、海量日志數(shù)據(jù),提取出...
    拾壹北閱讀 1,786評(píng)論 0 28
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,174評(píng)論 25 708
  • 第一部分、十道海量數(shù)據(jù)處理面試題 1、海量日志數(shù)據(jù),提取出某日訪問百度次數(shù)最多的那個(gè)IP。 此題,在我之前的一篇文...
    零一間閱讀 1,021評(píng)論 0 5
  • 你扛不住的小情緒 愿你能安然無恙發(fā)泄掉 迷茫、害怕、犯了錯(cuò) 愿你有個(gè)溫暖的角落 當(dāng)你為夢想義無反顧 愿有人感動(dòng) 也...
    江上雨寒舟里閱讀 353評(píng)論 0 1

友情鏈接更多精彩內(nèi)容