1. 程式人生 > >統計一篇文章中出現次數最多的前k個詞,文章中一行一詞

統計一篇文章中出現次數最多的前k個詞,文章中一行一詞

      應該考慮檔案大小和詞的多少,有一個1G大小的一個檔案,裡面每一行是一個詞,詞的大小不超過16位元組,記憶體限制大小是1M。返回頻數最高的100個詞。於每個詞x,取hash(x)%5000,然後按照該值存到5000個小檔案(記為x0,x1,...x4999)中。這樣每個檔案大概是200k左右。

     如果其中的有的檔案超過了1M大小,還可以按照類似的方法繼續往下分,直到分解得到的小檔案的大小都不超過1M。
     對每個小檔案,統計每個檔案中出現的詞以及相應的頻率(可以採用trie樹/hash_map等),並取出出現頻率最大的100個詞(可以用含100個結點的最小堆),並把100個詞

    方案:順序讀檔案中,對及相應的頻率存入檔案,這樣又得到了5000個檔案。下一步就是把這5000個檔案進行歸併(類似與歸併排序)的過程了。

方法一:雜湊表統計詞頻,每次查詢插入的時間複雜度是O(1),一共O(n)。然後排序使用下面的堆排序;

方法二:使用map即二叉查詢樹統計詞頻,每次查詢插入O(logn),一共O(nlogn)。然後排序使用下面的堆排序;

堆排序nlogk(構建k個數的最小堆,和堆頂元素比較,如果比堆頂元素小,替換然後shiftdown)

如果不需要前k項進行排序,直接使用快排的前k部分,O(n)複雜度。