1. 在乙個檔案中有 10g 個整數,亂序排列,要求找出中位數。記憶體限制為 2g。只寫出思路即可。
海量資料處理的問題。10g 個數,中位數就是第 5g、第 5g+1 個數。回想一下,一般情況下求中位數的做法:類似於快排的 partition,找到乙個數,使比它小的數的個數佔到總數的一半就行。所以,可以把數值空間分段,然後統計每一段中資料的個數,這樣就可以很容易的確定中位數在那一段。找個該段後,資料量已經急劇減小了,剩下的問題就好處理了。這種方法可以說是桶排序的思想,也可以說是 hash 的思想。下面具體分析一下:
因為要統計每一段中資料的個數,所以可以用乙個 unsigned int 型。unsignedint 一般佔 4 個位元組,可以計數到 2^32-1,大約是 4g。題目中有 10g 個數,如果有很多數落在同乙個段中,unsigned int 肯定不夠用。所以,這裡的計數用要 8 位元組的 long long。即,相當於有乙個陣列,陣列是 long long 性,陣列的每乙個元素,代表了乙個資料段內的資料個數。這個陣列有多大?為了充分利用 2g 記憶體,陣列大小 2g/8= 256m。即,有陣列 long long cnt[256m].
假設題目中的 10g 個數都是 4 位元組的 int。如何把這 10g 個整數,對映到 cnt[256m] 的陣列中。可以使用計算機中的虛擬位址到實體地址的轉換。取 int 的高 28 位作為陣列下標的索引值,這樣就可以完成對映。
整個演算法的流程:
1)掃瞄 10g 個整數,對每個整數,取高 28 位,對映到陣列的某個元素上,給陣列的這個元素加 1,表示找到乙個屬於該資料段的元素
2)掃瞄完 10g 個整數後,陣列 cnt 中就記錄了每段中元素的個數,從第一段開始,將元素個數累計,直到值剛好小於 5g,則中位數就在該段
3)這時對 10g 個整數再掃瞄一遍,記錄該段中每個元素的個數。直至累計到 5g 即可。
海量資料處理
1 有一千萬條簡訊,有重複,以文字檔案的形式儲存,一行一條,有 重複。請用5分鐘時間,找出重複出現最多的前10條。方法1 可以用雜湊表的方法對1千萬條分成若干組進行邊掃瞄邊建雜湊表。第一次掃瞄,取首位元組,尾位元組,中間隨便兩位元組作為hash code,插入到hash table中。並記錄其位址和...
海量資料處理
給定a b兩個檔案,各存放50億個url,每個url各占用64位元組,記憶體限制是4g,如何找出a b檔案共同的url?答案 可以估計每個檔案的大小為5g 64 300g,遠大於4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。遍歷檔案a,對每個url求取hash url 1000...
海量資料處理
分而治之 hash對映 hash統計 堆 快速 歸併排序 300萬個查詢字串中統計最熱門的10個查詢。針對此類典型的top k問題,採取的對策往往是 hashmap 堆。hash統計 先對這批海量資料預處理。具體方法是 維護乙個key為query字串,value為該query出現次數的hashtab...