分区问题

时间:2011-07-12 18:50:18

标签: algorithm

我有一组非唯一数字,并希望将这些数字划分为K个分区,以使每个分区中的数字总和几乎相等。 假设我有以下设置。

{1, 2, 3, 4, 5, 6, 7, 8, 9}

使用Linear partition algorithm我在K = 3

时获得以下分区
{ 1  2  3  4  5 }
{ 6  7 }
{ 8  9 }

这是预期的,但由于这是线性分区算法,因此输入集顺序的任何更改也会改变分区,我想避免这种情况。

应尽量减少每个分区的元素总和的差异。在上面的示例中,每个分区的总和为151317

用于跟随输入它不起作用。

{10, 20, 90, 100, 200}

线性分区算法给我以下

{ 10  20  90  100 }
{ 200 }

但正确的答案应该是

{ 10, 200 } { 20, 90, 100 }

4 个答案:

答案 0 :(得分:15)

这是一个快速贪婪的解决方案(对于大多数情况来说接近最佳):

  1. 按降序排列元素
  2. 获取第一个K元素并将它们放入不同的集合
  3. 对于下一个N-K元素,请将它们放入具有最低总和
  4. 的集合中

    对于{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 problemPartition problem上的维基百科文章,我发现你的问题是一般化的,并且这些问题略有修改,即NP完全。

更具体地说,如果你有一个有效的算法来解决你的问题,那么它也能够有效地解决上面的两个问题,这是不可能的(除非P = NP)。

答案 2 :(得分:0)

如果你有一般的工作,并且你只是在寻找确定性行为,无论顺序如何,只需先对集合进行排序。忽略顺序的所有集合在排序后将是完全相同的序列。

当然它可能会夸大你的运行时复杂性,但我没有看到防止这是一个要求。

所有这些都是基于您的评论,即数字的排列确实无关紧要。此时,这肯定与您链接的问题不同,后者假定分区永远不需要重新排列元素。

答案 3 :(得分:0)

LeetCoder have worked关于Steven Skiena提供的相同问题定义(和解决方案)。唯一的问题是他用C ++讲话,所以它变得更容易掌握。