大數據面試題——如何從大量數據中找出高頻詞

原文鏈接

問題描述:

有一個1GB大小的文件,文件裏面每一行是一個詞,每個詞的大小不超過16B,內存大小限制爲1MB,要求返回頻數最高的100個詞。

分析:

由於文件大小爲1GB,而內存的大小隻有1MB,因此不能一次把所有的詞讀入到內存中去處理,可以採用分治的方法進行處理:把一個文件分解爲多個小的子文件,從而保證每個文件的大小都小於1MB,進而可以直接被讀取到內存中處理。

解題思路:

1、遍歷文件,對遍歷到的每一個詞,執行Hash操作:hash(x)%2000,將結果爲i的詞存放到文件ai中,通過這個分解步驟,可以是每個子文件的大小約爲400KB左右,如果這個操作後的文件大小超過1MB,那麼可以使用同樣的方法把文件繼續進行分解下去,直到文件的大小小於1MB爲止。

2、統計出每個文件中出現頻率最高的100個詞。最簡單的就是使用字典來實現,具體方法爲:遍歷文件中的所有詞,對於遍歷到的詞,如果字典中不存在,則把這個詞存入到字典中(鍵爲這個詞,值爲1),如果這個詞已經在字典中,那麼把這個詞對應的值加一。遍歷後可以非常容易的找到出現頻率最高的100個詞。

3、上一步找出了每個文件中出現頻率最高的100個詞,這步可以通過維護一個小頂堆來找出所有詞中出現頻率最高的100個詞。遍歷第一個文件,把第一個文件中的出現頻率最高的100個詞構成一個小頂堆。(如果第一個文件中詞的數目小於100,那麼可以繼續遍歷第二個文件,直到構建好有100個節點的小頂堆爲止)。繼續遍歷,如果遍歷到的詞的出現次數大於堆頂上詞的出現次數,那麼可以用新遍歷到的詞替換堆頂的詞,然後重新調整這個堆爲小頂堆。當遍歷完所有的文件後,這個小頂堆中的詞就是出現頻率最高的100個詞。當然這一步也可以採用類似歸併排序的方法把所有文件中出現次數最高的100個詞進行排序,最終找出出現次數最高的100個詞。


作者:CircleYua
來源:CSDN
原文:https://blog.csdn.net/kingyuan666/article/details/84502198
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章