Algorithm 划分问题

Algorithm 划分问题,algorithm,Algorithm,我有一组非唯一的数字,并希望将这些数字划分为K个分区,这样每个分区中的数字之和几乎相等。 假设我有下面的一组 {1, 2, 3, 4, 5, 6, 7, 8, 9} 当K=3 { 1 2 3 4 5 } { 6 7 } { 8 9 } 这是意料之中的,但由于这是线性分区算法,所以输入集顺序的任何更改也会更改分区,这是我想要避免的 每个分区的元素和的差异应该最小化。在上面的示例中,每个分区的总和是15,13,17 对于以下输入,它不起作用 {10, 20, 90, 100, 200

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

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

{ 1  2  3  4  5 }
{ 6  7 }
{ 8  9 }
这是意料之中的,但由于这是线性分区算法,所以输入集顺序的任何更改也会更改分区,这是我想要避免的

每个分区的元素和的差异应该最小化。在上面的示例中,每个分区的总和是
15
13
17

对于以下输入,它不起作用

{10, 20, 90, 100, 200}
线性分割算法给了我以下的启示

{ 10  20  90  100 }
{ 200 }
但正确的答案应该是

{10200}

{20,90,100}

如果您让它在一般情况下工作,并且您只是在寻找确定性行为,而不考虑顺序,那么只需首先对集合进行排序。所有具有相同忽略顺序的集合在排序后将具有完全相同的顺序

当然,这可能会增加运行时的复杂性,但我不认为需要防止这种情况发生


所有这些都是基于你的评论,即数字的排列确实不重要。在这一点上,这肯定与您链接到的问题不同,该问题假定分区从不需要重新排列元素。

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

  • 按降序排列元素
  • 将第一个
    K
    元素放入不同的集合中
  • 对于下一个
    N-K
    元素,将它们放入总和最小的集合中
  • 在您使用
    {10,20,90100200}
    的情况下,排序后得到
    {2001009020,10}
    。算法将按如下步骤进行:

    Set A   Set B
     200     100
     200     190
     200     210
     210     210
    

    这恰好是最佳的解决方案。

    我认为,几乎你唯一的选择就是使用暴力,对于简单的情况,可能会进行一些优化(比如for
    K=2
    的修改版本)。也许有更好的算法,但不是更好

    通过阅读Wikipedia关于和的文章,我发现你的问题是这些问题的广义和稍加修改的版本,它们是NP完全的


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

    基于Steven Skiena提供的相同问题定义(和解决方案)。唯一的事情是他在C++中说话,所以它变得更容易掌握。p> 因此,您想对它们进行分区,而不考虑“集合”中的顺序?步骤一-对集合重新排序,步骤二-执行工作partition@svick,是的,换句话说,当输入相同且分区数相同时,无论输入数是如何排列的,都会给我相同的分区集。@Avinash,你说的“几乎相等”到底是什么意思?具体要求是什么?你需要找到最好的解决方案吗?@svick,我会更新这个问题。你的第2步是为了澄清,因为第3步包括它。伟大的工作伟大的解决方案..这是已知的算法还是你的。给定集合
    {3,3,2,2}
    K=2
    ,此算法将其划分为
    {3,2,2}
    {3,2}
    ,而最佳解决方案是
    {3,3}
    {2,2}
    。我如何证明此算法的正确性?我的意思是,如果列表没有按升序排序,这将失败。我无法证明这个算法。动态规划在这里可能很有用,而且会比暴力更好。不幸的是,我知道的不够多,无法写出答案。