假设我们在N台电脑中分配了很多单词,我们想要前10个常用单词。 我能想到三种方法:
单独计算每台N台计算机上的文字,我们可以在每台计算机上获得前20名(这个数字可以讨论)。然后将这些结果合并在一起。
这种方法的缺点是有些词可能会被忽略。这些单词在每台计算机上均匀分布,但不能在每台计算机上排在前20位,但这些单词的总频率可能是前10位。
它与第一个几乎相同。不同之处在于在每台计算机上获取所有计数结果并合并它们。然后计算TOP 10。
缺点是合并时间和传输时间相对较大。
使用好的哈希函数重新分配单词。不同的计算机不会有相同的单词。然后我们可以在每台计算机上获得TOP 10并合并它们。
缺点是每个单词都会被散列并传输到另一台计算机。这需要很长的传输时间。
你有更好的方法吗?或者我的哪种方法最好?
答案 0 :(得分:2)
你在#1中的想法很好,但需要更好的执行。如果F是单台计算机上第K个最常用字的频率,则可以忽略所有N台计算机上频率小于F / N的所有字。如果将机器划分为G组,则应用阈值F'/ G,其中F'是单个组中计算机上第K个最常用字的频率。
在两轮中,计算机可以确定F的最佳值,然后聚合一个小Bloom过滤器,该过滤器对所有常用词进行命中,并在其他一些词上给出误报,用于减少与方法#2合并的数据量和#3。
答案 1 :(得分:0)
第一种方法的缺点使其成为一种非解决方案。
第二种方法将所有结果发送到一台机器,以便它完成所有工作。
第三种方法也会发送所有结果,但是会向多台计算机发送然后共享工作负载(这是重要部分) - 最终结果将被发送到要合并的单个计算机与发送所有字频相比,它应该很小。
显然,第三种方法最有意义。