输入: 一个正整数 K 和一个大文本。文本实际上可以看作是单词序列。所以我们不必担心如何把它分解成单词序列。
输出: 文本中最常用的 K 字。
我的想法是这样的。
使用哈希表记录所有单词的频率,同时遍历整个单词序列。在这个阶段中,关键字是“ word”,值是“ word 频率”。这需要 O (n)时间。
对(单词,单词-频率)对进行排序,关键是“单词-频率”,这需要正常排序算法下的 O (n * lg (n))时间。
排序后,我们只取第一个 K 字,这需要 O (K)的时间。
总的来说,总时间是 O (n + nLg (n) + K) ,因为 K 肯定小于 N,所以它实际上是 O (nlg (n))。
我们可以改进。事实上,我们只想要 K 开头的单词。我们不关心其他词的频率。因此,我们可以使用“部分堆排序”。对于步骤2)和3) ,我们不仅仅是排序。相反,我们把它改成
2’)构建一个以“词频”为关键字的(词、词频)对堆,构建一个堆需要 O (n)个时间;
3’)从堆中提取最上面的 K 个单词,每个提取的单词是 O (lg (n)) ,所以总时间是 O (k * lg (n))。
总之,这个解决方案的成本时间 O (n + k * lg (n))。
这只是我的想法,我还没有找到改进第一步的方法。
我希望一些信息检索专家能对这个问题提供更多的解释。