top問題

1. 從10萬個數中找10個最大的數

對於這種題目,最普通的想法是先對這10萬個數進行排序,而後再選取數組中前10個數,即爲最後的答案,排序算法的時間複雜度不下於O(N lgN)。最好的方法是創建一個最小堆。
算法描述:
咱們首先取10萬個元素中的前10個元素來創建由10個元素組成的最小堆。這樣堆頂元素即是當前已知元素的第10大的數;而後依次讀取剩下的99990個元素,若讀取的元素比堆頂元素大,則將堆頂元素和當前元素替換,並自堆頂至下調整堆;這樣讀取完全部元素後,堆中的10個元素即爲這10萬個數最大的10個數,同時堆頂元素爲這10萬個元素第10大元素。
時間複雜度:
設從N個數中找M個最大數 每次從新恢復堆的時間複雜都爲O(logM),最多供進行了(N-M)次恢復堆操做,顧時間複雜度爲O(NlogM)。算法

2. 10億個數中找出最大的10000個數

拿10000個數建堆,方法同題目1。數組

優化的方法:優化

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

3. 海量數據處理-topk問題  

如下是一些常常被說起的該類問題。
(1)有10000000個記錄,這些查詢串的重複度比較高,若是除去重複後,不超過3000000個。一個查詢串的重複度越高,說明查詢它的用戶越多,也就是越熱門。請統計最熱門的10個查詢串,要求使用的內存不能超過1GB。spa

(2)有10個文件,每一個文件1GB,每一個文件的每一行存放的都是用戶的query,每一個文件的query均可能重複。按照query的頻度排序。.net

(3)有一個1GB大小的文件,裏面的每一行是一個詞,詞的大小不超過16個字節,內存限制大小是1MB。返回頻數最高的100個詞。blog

(4)提取某日訪問網站次數最多的那個IP。排序

(5)10億個整數找出重複次數最多的100個整數。內存

(6)搜索的輸入信息是一個字符串,統計300萬條輸入信息中最熱門的前10條,每次輸入的一個字符串爲不超過255B,內存使用只有1GB。字符串

(7)有1000萬個身份證號以及他們對應的數據,身份證號可能重複,找出出現次數最多的身份證號。

 

(1)用HashMap求出每一個詞出現的頻率,而後求出頻率最大的10個詞(最小堆)。

(2)若是內存有限:

須要將原數據文件切割成一個一個小文件,如用hash(x)%M,將原文件中的數據切割成M小文件,若是小文件仍大於內存大小,繼續採用Hash的方法對數據文件進行分割,知道每一個小文件小於內存大小,這樣每一個文件可放到內存中處理。而後用上述方法(1)處理

相關文章
相關標籤/搜索