海量數據處理問題

問題一:
        怎麼在海量數據中找出重複次數最多的一個?
        思路:先將海量數據經過哈希表統計出數據的頻率並映射爲100個小文件,小文件中的數據包括兩項(數值,出現次數),而後再對每個小文件求出重複次數最多的一個數據而後將各個小文件出現最多的數據項目經過二路歸併進行比較,找出頻率最大的即爲所求
       性能:時間複雜度:O(N)+100*O(N1)+O(nlogn)*/
 問題二: 10億個數中找出最大的10000個數(top K問題)
       先拿10000個數建堆,而後一次添加剩餘元素,若是大於堆頂的數(10000中最小的),將這個數替換堆頂,並調整結構使之仍然是一個最小堆,這樣,遍歷完後,堆中的10000個數就是所需的最大的10000個。建堆時間複雜度是O(mlogm),算法的時間複雜度爲O(nmlogm)(n爲10億,m爲10000)。

        優化的方法:能夠把全部10億個數據分組存放,好比分別放在1000個文件中。這樣處理就能夠分別在每一個文件的10^6個數據中找出最大的10000個數,合併到一塊兒在再找出最終的結果。算法

top K問題

        在大規模數據處理中,常常會遇到的一類問題:在海量數據中找出出現頻率最好的前k個數,或者從海量數據中找出最大的前k個數,這類問題一般被稱爲top K問題。例如,在搜索引擎中,統計搜索最熱門的10個查詢詞;在歌曲庫中統計下載最高的前10首歌等。

        針對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位數電話號碼的內容。優化

相關文章
相關標籤/搜索