算法 - 找到代表所有行的最小单元格子集

时间:2010-06-18 20:45:09

标签: algorithm language-agnostic

我有几个列表,您可以将其视为整数行。 例如:

[1 3 5]
[3 7]
[3 5 7]
[1 5 9]
[3 9]
[1 7]
[5 9 11]

我希望找到这些行中表示的最小可能整数集,以便:

  • 每行至少有一个选定的整数
  • 如果是基数关系,请选择总和最高的集合。

在我的例子中,我认为结果应该是[5 7 9](首选[3 5 7]或[1 3 11]或......很多可能性)。

第二部分是微不足道的(选择最高和),但基数中所有最小子集的生成似乎很难。

你知道实现这个目标的好方法吗?

修改

随着迭代,数据的大小正在缓慢增长,但我需要完全匹配。

1 个答案:

答案 0 :(得分:4)

最小基数版本是NP-Complete。 Set Cover可以简化为此。要求其中的最大值只会使问题更难。

顺便说一句,关于布尔可满足性的另一个答案是错误!你需要减少这个问题的布尔可满足性来显示NP-Completeness,而不是相反。

设置封面基本上是:

给出集合X的集合S1,S2,... Sn的集合,找到其联合覆盖S1 U S2 U中所有元素的最小子集合(就集合数而言)。 .U Sn。

为了减少我们的问题,

设S = S1 U S2 ... U Sn。 = {x1,x2,...,xm}

设C_i = {j使得xi在Sj中}

将C_i提供给我们的问题。

现在如果我们的问题在多项式时间内是可解的,我们可以找到C_i元素的最小基数集,那么我们可以找到Si的集合覆盖,反之亦然。

这通常可以解决为整数编程问题(也是NP-Hard)。

对于近似解,可以将其视为线性规划问题(具有多项式时间算法),并且可以进行随机舍入以将小数值(LP的解)转换为整数。

另外,不幸的是,已经证明这是NP难以接近甚至一个常数因子(实际上我认为它是O(logn))。