有一個1G大小的一個文件,里面每一行是一個詞,詞的大小不超過16字節(jié),內(nèi)存限制大小是1M。返回頻數(shù)最高的100個詞?
分而治之/hash映射:順序讀文件中,對于每個詞x,取hash(x)%5000,然后按照該值存到5000個小文件(記為x0,x1,...x4999)中。這樣每個文件大概是200k左右。如果其中的有的文件超過了1M大小,還可以按照類似的方法繼續(xù)往下分,直到分解得到的小文件的大小都不超過1M。
hash_map統(tǒng)計:對每個小文件,采用trie樹/hash_map等統(tǒng)計每個文件中出現(xiàn)的詞以及相應(yīng)的頻率。
堆/歸并排序:取出出現(xiàn)頻率最大的100個詞(可以用含100個結(jié)點的最小堆)后,再把100個詞及相應(yīng)的頻率存入文件,這樣又得到了5000個文件。最后就是把這5000個文件進行歸并(類似于歸并排序)的過程了。