有乙個 1gb 大小的檔案,檔案裡每一行是乙個詞,每個詞的大小不超過 16b,記憶體大小限制是 1mb,要求返回頻數最高的 100 個詞(top 100)。
由於記憶體限制,我們依然無法直接將大檔案的所有詞一次讀到記憶體中。因此,同樣可以採用分治策略,把乙個大檔案分解成多個小檔案,保證每個檔案的大小小於 1mb,進而直接將單個小檔案讀取到記憶體中進行處理。
思路如下:
首先遍歷大檔案,對遍歷到的每個詞x,執行hash(x) % 5000
,將結果為 i 的詞存放到檔案 ai 中。遍歷結束後,我們可以得到 5000 個小檔案。每個小檔案的大小為 200kb 左右。如果有的小檔案大小仍然超過 1mb,則採用同樣的方式繼續進行分解。
接著統計每個小檔案**現頻數最高的 100 個詞。最簡單的方式是使用 hashmap 來實現。其中 key 為詞,value 為該詞出現的頻率。具體方法是:對於遍歷到的詞 x,如果在 map 中不存在,則執行map.put(x, 1)
;若存在,則執行map.put(x, map.get(x)+1)
,將該詞頻數加 1。
上面我們統計了每個小檔案單詞出現的頻數。接下來,我們可以通過維護乙個小頂堆來找出所有詞**現頻數最高的 100 個。具體方法是:依次遍歷每個小檔案,構建乙個小頂堆,堆大小為 100。如果遍歷到的詞的出現次數大於堆頂詞的出現次數,則用新詞替換堆頂的詞,然後重新調整為小頂堆,遍歷結束後,小頂堆上的詞就是出現頻數最高的 100 個詞。
分而治之,進行雜湊取餘;
使用 hashmap 統計頻數;
求解最大的 topn 個,用小頂堆;求解最小的 topn 個,用大頂堆。
如何從大量資料中找出高頻詞?
有乙個 1gb 大小的檔案,檔案裡每一行是乙個詞,每個詞的大小不超過 16b,記憶體大小限制是 1mb,要求返回頻數最高的 100 個詞 top 100 由於記憶體限制,我們依然無法直接將大檔案的所有詞一次讀到記憶體中。因此,同樣可以採用分治策略,把乙個大檔案分解成多個小檔案,保證每個檔案的大小小於...
如何從大量URL中找出相同的URL?
給定 a b 兩個檔案,各存放 50 億個 url,每個 url 各佔 64b,記憶體限制是 4g。請找出 a b 兩個檔案共同的 url。每個 url 佔 64b,那麼 50 億個 url占用的空間大小約為 320gb。5,000,000,000 64b 5gb 64 320gb 由於記憶體大小只...
如何從 5 億個數中找出中位數
從 5 億個數中找出中位數。資料排序後,位置在最中間的數就是中位數。當樣本數為奇數時,中位數 n 1 2 當樣本數為偶數時,中位數為 n 2 與 1 n 2 的均值。如果這道題目沒有記憶體大小的限制,則可以把所有的數字排序後找出中位數,但是最好的排序演算法的時間複雜度都是 o nlogn n 為數字...