字频差异很大时如何根据字频平衡哈希表

时间:2019-07-10 00:15:01

标签: java python algorithm hashmap

有N台计算机,我需要向其中的计算机分发单词列表。同一单词应该在同一台机器上,所以我决定先计算每个单词的哈希值,然后再使用mod N,然后使用结果值进行分布。问题是,如果单词频率不均匀,这会导致分布不均匀,是否有任何方法可以平衡整个计算机的负载?问题要求我显示要使用的映射功能。预先感谢

1 个答案:

答案 0 :(得分:0)

抽象问题:您有一个数字(单词频率)集合,您希望将其划分为N个子集,以使子集总和“平衡”。

首先,您尚未定义“平衡”。在许多范例中,这只是使最大和最小化。在其他情况下,它将求和范围最小化(最高值减去最低值)。此外,它可能是总和的MSE(均方误差)。鉴于缺乏规范,我将不得不对它进行微调。

第二,您尚未指定对“最佳”解决方案的需求,或者仅是“良好”解决方案的需求。您是否需要可证明的最佳解决方案,还是拥有一个易于理解的解决方案,几乎在所有时间都能获得良好的结果,是否足够?同样,这种调整仍然是您的工作。

一个最佳解决方案是使每个分区之和等于平均值​​total_word_count / N。 有两种流行的工具可用于“快速打击”解决方案。

  1. 目标总和:计算均值(我们将其称为mean),然后应用N-1次子集总和算法。找到每种解决方案后,请从数字集合中删除这些元素。
  2. “选择团队”。这是一个贪婪的解决方案。按降序对数字进行排序。初始化N个空的子列表通过此排序的collection进行迭代,将每个数字分配给当前总和最低的子列表。

在几乎任何现实生活中的语言应用程序中,频率都会遵循大量未使用单词的分布。因此,第二次攻击将在 O(n log n)时间内为您提供最佳解决方案- O(n log n)排序,然后是< strong> O(N)分配通行证。