【发布时间】:2012-12-21 09:59:36
【问题描述】:
假设您有一个很大的文件,比如 1GB。该文件每行包含一个单词(共 n 个单词),您要查找文件中出现频率最高的 k 个词。
现在,假设您有足够的内存来存储这些单词,那么在减少内存使用和 Big-O 复杂性中的持续开销方面,解决这个问题的更好方法是什么?我相信可以使用两种基本算法:
- 使用哈希表和最小堆来存储出现次数和看到的前 K 个单词。这是 O(n + nlogk) ~ O(N)
- 使用 trie 存储单词和出现次数,然后遍历 trie 以计算最常见的单词。这是 O(n*p) ~ O(N),其中 p 是最长单词的长度。
哪种方法更好?
另外:如果您没有足够的内存用于哈希表/trie(即 10MB 左右的有限内存),那么最好的方法是什么?
【问题讨论】:
-
您希望在 1GB 文件中大约有多少个不同的词?
-
我并没有特别期待什么。这个问题可以用现实世界的术语重写为从搜索列表或类似的东西中找到前 10 个搜索词,所以我猜它会遵循某种概率分布,但我没有设置特定的一个。