algorithm - 在一本大书中找到 10 个最常用的单词

标签 algorithm data-structures hashmap heap hashtable

<分区>

我知道这个问题已经在论坛上被问过几次了,我没有找到任何可以被认为是最合适的解决方案的“已标记”答案 - 所以再次询问:

我们从书中得到了非常大的文本,所有这些文本都无法容纳在内存中。我们需要找到文本中出现频率最高的前 10 个词。执行此操作的最佳(时间和空间)方式是什么?

我的想法:

将文件分成k大小的 block (这样每个 block 都可以存储在内存中)。现在,对每个 block 执行外部排序。一旦我们在磁盘上有了 (N/k)- 排序的文件(假设 N 是书中文本的总大小)——我不确定我应该如何继续才能从中获得前 10 个元素k 排序数组。

另外,如果有不同的思路,欢迎提出。

最佳答案

这是流式算法领域的经典问题。在某些退化的情况下,显然没有办法做到这一点;您需要满足一堆元素,这些元素大约(在明确定义的意义上)流中的前 k 个词。我不知道任何经典引用资料,但快速谷歌将我带到 this .它似乎对流式传输 top-K 的各种技术进行了很好的调查。您可以查看其中的引用资料以了解其他想法。

另一个想法(并且在流模型中不适用)只是随机抽取尽可能多的单词以适合内存,对它们进行排序和唯一化,然后再通过文件计算命中率示例中的单词。然后你可以很容易地找到前k。

关于algorithm - 在一本大书中找到 10 个最常用的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17541983/

相关文章:

algorithm - 高效文件存储算法

Javascript:我需要一个好的数据结构来保持排序列表

java - 如何实现连通房间?

java - Java中Tree和Hash(Sets-Maps)的区别

java - 为什么使用排序(O(n log n) 复杂度)比使用 HashMap(O(n) 复杂度)更快地找到多数元素?

java - 打印 Java ConcurrentHashMap 中的所有键/值对

arrays - 找到包含多数元素的最长子数组

javascript - 给定字典和字母列表,让程序学习生成有效单词 | Javascript

javascript - 使用javascript检查字符串是否是数组中字符串的组合

algorithm - 高效的数据结构搜索算法