将自然数分配到相等桩的算法

时间:2017-12-26 18:20:51

标签: algorithm sorting

我正在寻找一种可以采用一组自然数的算法,例如:

S = {1, 3, 4, 2, 9, 34, 432, 43}

然后将它们分成尽可能相等的堆。桩的数量预定义为n。

目标是使每桩和最低桩之间的差值之和最小。

这是一个例子。

假设你有:

S = { 1, 2, 2, 3, 1, 2, 3 }
n = 3

然后解决方案可能

N1 = { 1, 2 }
N2 = { 2, 3 }
N3 = { 1, 2, 3 }

这些桩的总和将是3,5和6.错误将是:(5 - 3)+(6 - 3)= 5.

算法需要找到误差最小的解决方案。

感谢任何帮助。如果不清楚,请评论。

2 个答案:

答案 0 :(得分:1)

这听起来像https://en.m.wikipedia.org/wiki/Bin_packing_problem的变体。然而,没有给出箱的尺寸,因此它至少与箱包装一样坚硬。因此,问题是NP难。

对于近似解决方案,您可以例如计算平均箱尺寸并执行首次拟合或最佳拟合的调整,以允许小的过度包装。

答案 1 :(得分:1)

我认为没有有效的方法来解决这个问题,因为它是一个NP难题。

证明:

让我们将您提出的问题表示为P *,

我们可以通过执行以下操作将分区问题(已知的NP-hard)减少为P * 给定任意分区问题P1,我们要求解决P *的黑盒子用N = 2来解决P1(即,将该组分成最小化不同的2堆)。

如果黑盒子返回的差值为零,则>有一个解决方案P1

如果黑盒子返回的差值不为零,则> P1没有解决方案

因此,P *是NP-hard