最小的多组集合,包含从1到N的所有数字

时间:2015-06-11 18:11:25

标签: algorithm

让我们假设我们只有整数,其值在1N的范围内。接下来,我们将它们分成K-element个多组。您如何找到包含这些多组最小可能数量的集合,但此多集合的总和包含1N的所有数字?如果不明确,答案将是符合条件(首先找到)的任何集合。

例如,我们有N = 9K = 3

(1,2,3)(4,5,6)(7,8,8)(8,7,6)(1,9,2)(4,4,3)

包含19中所有数字的最小数量的多套数等于4,可以是(1,2,3)(4,5,6)(7,8,8)(1,9,2)(1,2,3)(4,5,6)(8,7,6)(1,9,2)

任何有效算法的想法都能找到这样的集合吗?

PS 在写完答案后,我发现了另一个4元素集:(4,5,6)(1,9,2)(4,4,3)(7,8,8)(4,5,6)(1,9,2)(4,4,3)(8,7,6)但正如我所说,算法找到任何最小集合都没问题。

2 个答案:

答案 0 :(得分:3)

您的问题是经典Set Covering problem的受限制版本,但仍然很容易证明它是NP-Hard

这个问题的任何近似技术都是合理的。特别是,选择覆盖最多未覆盖项目的下一个子集的greedy solution - 尤其是。易于实施。

答案 1 :(得分:1)

正如@Ami Tavroy所说,这个问题通过简化为3-dimensional matchinghere)来实现NP难度。

要进行缩小,请注意三维匹配的限制决策变体,当它缩小为精确的封面时(here):

  

...给定一个T和一个整数k,决定是否存在   三维匹配M⊆T与| M | ≥k。 ... 问题是   即使在k = | X |的特殊情况下,NP完全= | Y | =   | Z |。1 [4] [5]在这种情况下,三维(支配)匹配是   不仅是一个固定的包装,而且还有一个精确的封面:套装M覆盖每个   X,Y和Z的元素恰好一次。[6]

如果您可以在P中解决其他问题,则可以在P中解决此变体 - 您可以在O(N ^ 3)时间内生成所有三元组,然后设置封面,并检查是否K = N / 3。因此,通过简化,原始问题也是NP难的。