【发布时间】:2013-09-26 11:01:21
【问题描述】:
当给定一组数字时,我如何找到覆盖所有数字的最小组?约束是所选组不应重叠。
例如,给定三组数字(1,2)、(2,3)和(3,4),我们可以选择(1,2)和(3,4)作为(2,3)是多余的。
对于 (1,2),(2,3),(3,4),(1,4),我们有两个解 (1,2),(3,4) 或 (1,4), (2,3)。
对于(1,2,3),(1,2,4),和(3,4),有冗余,但没有解。
我想出的算法(对于 G = (1,2),(2,3),(3,4),(1,4) 的例子)是
collect all the numbers from the groups x = (1,2,3,4)
for g in G:
x = remove g in x # x = (3,4)
find G' = (a set of (g' in (G - g))) that makes (G' + g = x) # G' = ((3,4))
if find (G' + g) return (G',g) # return ((1,2)(3,4))
我知道我的算法在性能方面有很多漏洞,我认为这可能是一个众所周知的问题。这个问题有什么提示吗?
【问题讨论】:
-
这是一个经典的 NP 完全问题:en.wikipedia.org/wiki/Set_cover_problem
-
这实际上是一个非常困难的NP完全问题。在最坏的情况下,您将无法比测试组之间所有可能组合的指数时间蛮力算法做得更好。
-
注意:“使用 (1,2,3)、(1,2,4) 和 (3,4),没有冗余。” - (1,2,3) 和 (3,4) 覆盖它....
-
@Karoly Horvath:限制是所选组 (1,2,3) 和 (3,4) 不应重叠。我更新了帖子以使其清楚。
-
用(1,2,3),(1,2,4),(3,4),有冗余,但无解。
标签: algorithm