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}
。我如何证明此算法的正确性?我的意思是,如果列表没有按升序排序,这将失败。我无法证明这个算法。动态规划在这里可能很有用,而且会比暴力更好。不幸的是,我知道的不够多,无法写出答案。