我有几个列表,您可以将其视为整数行。 例如:
[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]或......很多可能性)。
第二部分是微不足道的(选择最高和),但基数中所有最小子集的生成似乎很难。
你知道实现这个目标的好方法吗?
修改
随着迭代,数据的大小正在缓慢增长,但我需要完全匹配。
答案 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))。