在一个大文件中获得前100个单词

时间:2016-01-13 06:51:18

标签: algorithm mapreduce

要在小文件中获得前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个单词?

2 个答案:

答案 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