鉴于一本有数百万册的书。数以百万计的单词。所有的单词一次都不能适合记忆。 给出一个有效的算法(空格和时间)来找到10个最常用的单词。
我的方法是使用哈希&存储所有的单词。通常散列取值并乘以素数(使其更有可能生成唯一的散列)所以你可以这样做:
int hash=7;
for (int i=0; i < strlen; i++) {
hash = hash*31+charAt(i);
}
如果某个单词已存在,请增加相应的计数。保持一个大小为10的最小堆。当扫描一个单词时,找到它的频率。如果它大于堆中的最小值,则删除最小值&amp;插入并更新堆。 最后,我们留下了堆中最常用的10个单词。 有什么问题? 只有当所有单词可以同时容纳在内存中时,此方法才有效。
另一种方法是使用外部排序,因为书的大小与物理内存相比要大得多。排序后,线性搜索可以完成我们的工作。但是,磁盘的访问时间呢?寻求时间&amp;延迟时间可以增加访问时间。 所以,这种方法效率也不高。
我可以想到另一种方法:分布式散列(仅当我们有n台机器时才会起作用)。在n台机器之间分配散列。我们可以执行不同的策略,比如说我们有26台机器,然后我们可以在机器1中用字母'a'('A'),以'b'('B')开头的单词等等所有字样。然后我们可以执行排序或使用TRIE数据结构。
有没有更好的方法找到十大最常用词?