对受约束的排序列表进行分区

时间:2011-11-06 04:54:32

标签: algorithm puzzle partitioning

以下是问题:

给定一个有序整数的排序列表(你可以假设它们是正数,如果它使问题变得更简单),将列表分成'n'相等大小的分区(或尽可能相等),受限于没有一个整数出现多个这样的分区。

约束本质上意味着如果你有一个列表 {1,1,2,2}

然后所有的必须在同一组中,并且所有2必须在同一组中。所有1和2都可以在一组中。但是我们不能在第一个分区中使用1中的一个而在第二个分区中使用第二个。

示例1:

    List: {1,1,2,2,3,3,4,4}


    Number of partitions to make: 4

    Answer: {1,1} {2,2} {3,3} {4,4}

Example 2: (trickier one)

    List: {1,1,2,2,3,3,4,4}


    Number of partitions to make: 4

    Answer: {1,1} {2,2} {3,3} {4,4}

注意这里第3个分区的大小必须是8,因为由于约束,所有4个分区都必须在同一个分区中。

还有许多其他棘手的案例。如果有人需要更多例子,请告诉我。

所以问题是什么是接近或解决这个问题的最佳方法?

2 个答案:

答案 0 :(得分:1)

我能想到的最简单的解决方案是,

  1. 首先在列表中找到所有相同的元素(如果你事先知道范围,可以使用哈希来找到它们或计算排序)并保持它们的大小。

  2. 现在您将拥有多组重复数字(例如{1,1} {2,2})。完成此步骤后,尝试查找您拥有的列表数,并将它们分组以形成n个分区(如问题陈述中所指定)。对于前者在你最后一个棘手的例子中,我们最终会有4个列表,你需要3个分区。您可以找到2个小列表并将它们组合成1,重复此操作直到达到所需的分区数。

答案 1 :(得分:0)

这是k-partition problembin packing problem的偷偷摸摸的版本。如果计算每个元素的出现次数,并将这些计数放入多个集合中,那么您基本上是尝试将这些数字划分为具有相同总和的集合。
如果n = 2,则存在一些伪多项式算法。否则就没有已知的伪多项式算法。 (除非P = NP,否则不能) 至于如何接近它。如果您选择n,只需将其设置为1并将列表分区为自身。如果你没有,但你有小清单,只需实施一个强力解决方案。如果你没有选择n,并且你有很长的列表,请查看贪婪/近似算法,并尝试用“尽可能相等”来准确定义你的意思。 (你的意思是最大差异吗?差异?还有其他什么?)
祝你好运。