包含所有给定元素的最小数量的容器

时间:2012-08-25 16:23:52

标签: algorithm genetic-algorithm semantic-analysis

假设C引用一组容器{c1,c2,c3....cn},其中每个容器都包含一组有限的整数{i1,i2,i3...im}。此外,假设整数可能存在于多个容器中。给定一组有限的整数S {s1,s2,s3...sz},找到包含C中所有整数的S的最小子集的大小。

请注意,可能有数千个容器,每个容器有数百个整数。因此,蛮力很难解决这个问题。

我尝试使用Greedy算法解决问题。也就是说,每次我选择集合S中具有最大整数数的容器,但我都失败了!

有人能为这个问题建议快速算法吗?

1 个答案:

答案 0 :(得分:6)

这是众所周知的set cover problem。它是NP-hard - 事实上,它的决策版本是规范的NP完全问题之一,并且是Karp's 1972 paper中包含的21个问题之一 - 因此没有有效的算法。除非你能够找到问题的一些特殊额外结构,否则你必须对一个近似结果感到满意:即C的一个子集,其并集包含S,但不一定是最小 C的这种子集。

greedy algorithm可能是你最好的选择:它找到的集合集合不超过最小此类集合大小的O(log | C |)倍。

你说你无法让贪婪算法发挥作用。我想这可能是因为你没能正确实现它。您可以这样描述您的算法:

  

每次我选择集S中具有最大整数数的容器

但通常的贪婪算法中的规则是在每个阶段选择集合S 中最大数量的整数的容器,这些容器不在目前为止选择的任何容器中