題目:有一個1GB大小的文件, 文件裏面每行是一 個詞,每一個詞的大小不超過16B. 內存大小限制是1MB,要求返回頻數最高的100個詞。
排序
分析解答:
因爲文件大小爲1GB,而內存大小隻有1MB,所以不可能一次把全部的詞讀入到內存中處理,所以也須要採用分治的方法,把一個大的文件分解成多個小的子文件,從而保證每一個文件的大小都小於1MB,進而能夠直接被讀取到內存中處理。內存
具體的思路爲:hash
(1)遍歷文件,對遍歷到的每個詞,執行以下Hash操做: hash(x)%2000, 將結果爲i的詞存放到文件ai中,經過這個分解步驟,能夠使每一個子文件的大小大約爲400KB左右,若是這個操做後某個文件的大小超過1MB了,那麼能夠採用相同的方法對這個文件繼續分解,直到文件的大小小於1MB爲止。遍歷
(2)統計出每一個文件中出現頻率最高的100個詞。最簡單的方法爲使用字典來實現,具體實現方法爲,遍歷文件中的全部詞,對於遍歷到的詞,若是在字典中不存在,那麼把這個詞存入字典中(鍵爲這個詞,值爲1),若是這個詞在字典中已經存在了,那麼把這個詞對應的值加1。遍歷完後能夠很是容易地找出出現頻率最高的100個詞。方法
(3)第2步找出了每一個文件出現頻率最高的100個詞,這一步能夠經過維護-一個小項堆來找出全部詞中出現頻率最高的100個。具體方法爲,遍歷第一個文件,把第一個文件中出現頻率最高的100 個詞構建成一個小頂堆。(若是第一個文件中詞的個數小於100,那麼能夠繼續遍歷第2個文件,直到構建好有100個結點的小頂堆爲止)。繼續遍歷,若是遍歷到的詞的出現次數大於堆頂上詞的出現次數,那麼能夠用新遍歷到的詞替換堆頂的詞,而後從新調整這個堆爲小頂堆。當遍歷完全部文件後,這個小頂堆中的詞就是出現頻率最高的100 個詞。(固然這一步也能夠採用相似歸併排序的方法把全部文件中出現頻率最高的100個詞排序,最終找出出現頻率最高的100個詞。)統計