要在小文件中获得前100个单词,我们可以简单地使用hashmap
for each word in file
hash(word)++;
maxHeap(hash, 100)
如果文件超大,我们可以轻松使用MapReduce。
我的问题是,以下伪代码是正确的逻辑吗?
divide file into N chunks
for each chunk
hash(word)++;
maxHeap(hash, 100)
merge the N chunks and get the final top 100.
我们能否证明每个大块中前100个单词的前100个单词?
答案 0 :(得分:0)
没有,
想想这种情况
块1:AABBBCCC
第2块:AADDDEEE
Chunk 1 get max 2 character => Bx3和Cx3。
块2获得最多2个字符=> Dx3和Ex3。
我们想念“A”字符。 (AX4)
伪代码应该是这样的:
divide file into N chunks
for each chunk
hash(word)++;
maxHeap(hash, 100)
merge all hash table and get the final top 100.
答案 1 :(得分:0)
您的算法错误,因为您假设整个集合中的顶部单词等于各个块中顶部单词的总和。因为你修剪每个块,你就有可能错过一个更好的词。
正确答案
收集:(猫,5)(狗,5)(驼鹿,4)
Top2 :(猫,狗)
您的排序
块1 :(猫,2)(狗,4)(驼鹿,4)=> (狗,4)(驼鹿,4)
块2 :(猫,3)(狗,1)=> (猫,3)(狗,1)
合并:(猫,3)(狗,5)(驼鹿,4)
Top2 :(狗,驼鹿)
(狗,驼鹿)!=(猫,狗)
使用哈希映射也可能不是正确的方法。如果我们处理大量数据并且单词非常稀疏且唯一,则哈希映射将不适合主存储器。根据数据的敏感性,也可能存在哈希冲突。
将文件分成N个块可能更好。对于每个块,您将执行计数,然后按字母顺序对其进行排序,以使文件包含(字,计数)对。然后你可以对所有文件执行N路合并。这些文件按字母顺序合并(即一个文件头部有一个字,按字母顺序排在另一个文件的头部之前应该先进行)。如果操作正确,您可以从所有文件中添加单词的计数,以获得总计数。当您执行此合并时,您可以跟踪X顶部单词。
此处列出了外部合并排序算法https://en.wikipedia.org/wiki/External_sorting