優化的方法:能夠把全部10億個數據分組存放,好比分別放在1000個文件中。這樣處理就能夠分別在每一個文件的10^6個數據中找出最大的10000個數,合併到一塊兒在再找出最終的結果。算法
針對top K類問題,一般比較好的方案是分治+Trie樹/hash+小頂堆(就是上面提到的最小堆),即先將數據集按照Hash方法分解成多個小數據集,而後使用Trie樹或着Hash統計每一個小數據集中的query詞頻,以後用小頂堆求出每一個數據集中出現頻率最高的前K個數,最後在全部top K中求出最終的top K。post
(1)有10000000個記錄,這些查詢串的重複度比較高,若是除去重複後,不超過3000000個。一個查詢串的重複度越高,說明查詢它的用戶越多,也就是越熱門。請統計最熱門的10個查詢串,要求使用的內存不能超過1GB。
(2)有10個文件,每一個文件1GB,每一個文件的每一行存放的都是用戶的query,每一個文件的query均可能重複。按照query的頻度排序。
(3)有一個1GB大小的文件,裏面的每一行是一個詞,詞的大小不超過16個字節,內存限制大小是1MB。返回頻數最高的100個詞。
(4)提取某日訪問網站次數最多的那個IP。
(5)10億個整數找出重複次數最多的100個整數。
(6)搜索的輸入信息是一個字符串,統計300萬條輸入信息中最熱門的前10條,每次輸入的一個字符串爲不超過255B,內存使用只有1GB。
(7)有1000萬個身份證號以及他們對應的數據,身份證號可能重複,找出出現次數最多的身份證號。性能
在海量數據中查找出重複出現的元素或者去除重複出現的元素也是常考的問題。針對此類問題,通常能夠經過位圖法實現。例如,已知某個文件內包含一些電話號碼,每一個號碼爲8位數字,統計不一樣號碼的個數。
本題最好的解決方法是經過使用位圖法來實現。8位整數能夠表示的最大十進制數值爲99999999。若是每一個數字對應於位圖中一個bit位,那麼存儲8位整數大約須要99MB。由於1B=8bit,因此99Mbit摺合成內存爲99/8=12.375MB的內存,便可以只用12.375MB的內存表示全部的8位數電話號碼的內容。優化