有N台计算机,我需要向其中的计算机分发单词列表。同一单词应该在同一台机器上,所以我决定先计算每个单词的哈希值,然后再使用mod N,然后使用结果值进行分布。问题是,如果单词频率不均匀,这会导致分布不均匀,是否有任何方法可以平衡整个计算机的负载?问题要求我显示要使用的映射功能。预先感谢
答案 0 :(得分:0)
抽象问题:您有一个数字(单词频率)集合,您希望将其划分为N
个子集,以使子集总和“平衡”。
首先,您尚未定义“平衡”。在许多范例中,这只是使最大和最小化。在其他情况下,它将求和范围最小化(最高值减去最低值)。此外,它可能是总和的MSE(均方误差)。鉴于缺乏规范,我将不得不对它进行微调。
第二,您尚未指定对“最佳”解决方案的需求,或者仅是“良好”解决方案的需求。您是否需要可证明的最佳解决方案,还是拥有一个易于理解的解决方案,几乎在所有时间都能获得良好的结果,是否足够?同样,这种调整仍然是您的工作。
一个最佳解决方案是使每个分区之和等于平均值total_word_count / N
。
有两种流行的工具可用于“快速打击”解决方案。
mean
),然后应用N-1
次子集总和算法。找到每种解决方案后,请从数字集合中删除这些元素。N
个空的子列表通过此排序的collection进行迭代,将每个数字分配给当前总和最低的子列表。在几乎任何现实生活中的语言应用程序中,频率都会遵循大量未使用单词的分布。因此,第二次攻击将在 O(n log n)时间内为您提供最佳解决方案- O(n log n)排序,然后是< strong> O(N)分配通行证。