查找所有集合不包含任何子集

时间:2015-12-02 16:16:22

标签: algorithm list set

我有一个问题,我正在研究最快的算法来找到一个原始集(S)子集的集合,并且不包含S的任何子集(S1,... Sn)。我想要的集合查找可以包含Si的一些元素,但不包含整个元素。

例如,original set:S =(1,2,3,4,5),S1 =(1,2),S2 =(1,3) => longest set :( 2,3,4,5); other sets :( 1,4,5),(2,4,5),(3,4,5),(1,4),......

任何人都可以给我一个建议吗?谢谢!

1 个答案:

答案 0 :(得分:2)

坏消息

考虑选择不包含哪些元素的问题。

如果我们选择不包含元素1,我们满足S1和S2的约束。

如果我们选择不包含元素2,我们就满足S1的约束。

如果我们选择不包含元素3,我们满足S1和S3的约束。

因此1给出{S1,S2},2给出{S1},3给出{S3}。

您的问题可以表示为找到不包含的最小元素数,使得满足集合的并集(例如{S1,S2})涵盖所有给定集合。

这正是NP完成的set cover problem

好消息

在实践中,你可能会做的很好,只需选择不包括的元素,基于最多覆盖最多集合的元素。

这是一个易于实现的贪婪算法(虽然它并不总能给出最佳答案)。