我有一组非唯一数字,并希望将这些数字划分为K
个分区,以使每个分区中的数字总和几乎相等。
假设我有以下设置。
{1, 2, 3, 4, 5, 6, 7, 8, 9}
使用Linear partition algorithm我在K = 3
{ 1 2 3 4 5 }
{ 6 7 }
{ 8 9 }
这是预期的,但由于这是线性分区算法,因此输入集顺序的任何更改也会改变分区,我想避免这种情况。
应尽量减少每个分区的元素总和的差异。在上面的示例中,每个分区的总和为15
,13
,17
用于跟随输入它不起作用。
{10, 20, 90, 100, 200}
线性分区算法给我以下
{ 10 20 90 100 }
{ 200 }
但正确的答案应该是
{ 10, 200 }
{ 20, 90, 100 }
答案 0 :(得分:15)
这是一个快速贪婪的解决方案(对于大多数情况来说接近最佳):
K
元素并将它们放入不同的集合N-K
元素,请将它们放入具有最低总和对于{10, 20, 90, 100, 200}
的情况,排序后会得到{200, 100, 90, 20, 10}
。该算法将按如下步骤进行:
Set A Set B
200 100
200 190
200 210
210 210
恰好是最佳解决方案。
答案 1 :(得分:1)
我认为,对于简单的情况,你几乎唯一的选择就是使用暴力,可能还需要进行一些优化(如K = 2
的{{3}}的修改版本)。也许有更好的算法,但不是更好。
通过阅读the pseudo-polynomial solution to subset sum problem和Partition problem上的维基百科文章,我发现你的问题是一般化的,并且这些问题略有修改,即NP完全。
更具体地说,如果你有一个有效的算法来解决你的问题,那么它也能够有效地解决上面的两个问题,这是不可能的(除非P = NP)。
答案 2 :(得分:0)
如果你有一般的工作,并且你只是在寻找确定性行为,无论顺序如何,只需先对集合进行排序。忽略顺序的所有集合在排序后将是完全相同的序列。
当然它可能会夸大你的运行时复杂性,但我没有看到防止这是一个要求。
所有这些都是基于您的评论,即数字的排列确实无关紧要。此时,这肯定与您链接的问题不同,后者假定分区永远不需要重新排列元素。
答案 3 :(得分:0)
LeetCoder have worked关于Steven Skiena提供的相同问题定义(和解决方案)。唯一的问题是他用C ++讲话,所以它变得更容易掌握。