如何從大量資料中找出高頻詞?

2021-10-04 22:51:28 字數 960 閱讀 8752

有乙個 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個詞。分析 由於檔案大小為1gb,而記憶體的大小只有1mb,因此不能一次把所有的詞讀入到記憶體中去處理,可以採用分治的方法進行處理 把乙個檔案分解為多個小的子檔案,從而...

大資料面試題 如何從大量資料中找出高頻詞

有乙個1gb大小的檔案,檔案裡面每一行是乙個詞,每個詞的大小不超過16b,記憶體大小限制為1mb,要求返回頻數最高的100個詞。由於檔案大小為1gb,而記憶體的大小只有1mb,因此不能一次把所有的詞讀入到記憶體中去處理,可以採用分治的方法進行處理 把乙個檔案分解為多個小的子檔案,從而保證每個檔案的大...

如何找出最小偏向角 如何從大量資料中找出高頻詞?

有乙個 1gb 大小的檔案,檔案裡每一行是乙個詞,每個詞的大小不超過 16b,記憶體大小限制是 1mb,要求返回頻數最高的 100 個詞 top 100 由於記憶體限制,我們依然無法直接將大檔案的所有詞一次讀到記憶體中。因此,同樣可以採用分治策略,把乙個大檔案分解成多個小檔案,保證每個檔案的大小小於...