假设C
引用一组容器{c1,c2,c3....cn}
,其中每个容器都包含一组有限的整数{i1,i2,i3...im}
。此外,假设整数可能存在于多个容器中。给定一组有限的整数S
{s1,s2,s3...sz}
,找到包含C
中所有整数的S
的最小子集的大小。
请注意,可能有数千个容器,每个容器有数百个整数。因此,蛮力很难解决这个问题。
我尝试使用Greedy算法解决问题。也就是说,每次我选择集合S
中具有最大整数数的容器,但我都失败了!
有人能为这个问题建议快速算法吗?
答案 0 :(得分:6)
这是众所周知的set cover problem。它是NP-hard - 事实上,它的决策版本是规范的NP完全问题之一,并且是Karp's 1972 paper中包含的21个问题之一 - 因此没有有效的算法。除非你能够找到问题的一些特殊额外结构,否则你必须对一个近似结果感到满意:即C的一个子集,其并集包含S,但不一定是最小 C的这种子集。
greedy algorithm可能是你最好的选择:它找到的集合集合不超过最小此类集合大小的O(log | C |)倍。
你说你无法让贪婪算法发挥作用。我想这可能是因为你没能正确实现它。您可以这样描述您的算法:
每次我选择集S中具有最大整数数的容器
但通常的贪婪算法中的规则是在每个阶段选择集合S 中最大数量的整数的容器,这些容器不在目前为止选择的任何容器中。