我有一个问题,我正在研究最快的算法来找到一个原始集(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),......
任何人都可以给我一个建议吗?谢谢!
答案 0 :(得分:2)
考虑选择不包含哪些元素的问题。
如果我们选择不包含元素1,我们满足S1和S2的约束。
如果我们选择不包含元素2,我们就满足S1的约束。
如果我们选择不包含元素3,我们满足S1和S3的约束。
因此1给出{S1,S2},2给出{S1},3给出{S3}。
您的问题可以表示为找到不包含的最小元素数,使得满足集合的并集(例如{S1,S2})涵盖所有给定集合。
这正是NP完成的set cover problem。
在实践中,你可能会做的很好,只需选择不包括的元素,基于最多覆盖最多集合的元素。
这是一个易于实现的贪婪算法(虽然它并不总能给出最佳答案)。