集合中互斥项的子集

时间:2013-10-03 18:08:49

标签: algorithm set

我有S_0, ..., S_N套。如何找到最大的子集T,以便I_iT的交集S_i(对于每个0< = i< = N )最多包含一个元素。

我有一个解决方案,但我猜它是不必要的慢(基本上是几个嵌套的for循环尝试所有组合)。所以我的问题是:

  • 这个问题有效吗?
  • 如果没有,是否有一个有效的算法可以找到子集T

2 个答案:

答案 0 :(得分:3)

我认为你不太可能找到一个有效的通用算法来解决这个问题,因为我认为它是NP完全的。

如果您有一个有效的算法来解决这个问题,那么您可以解决maximum independent set problem

证明草图

假设您有一个图形,然后为每个边构造一个包含{i,j}的集合,其中i和j是由边缘连接的顶点。

然后,这些集合的最大子集T将是图表的最大独立集合。

转换为最大独立集

更有用的是,您还可以通过查找图的最大独立集来表达您的问题,其中a和b之间存在边,当且仅当存在包含a和b的集时。

然后,您可以使用一些标准求解器来解决最大独立集问题,例如one in Pythons NetworkX

答案 1 :(得分:0)

您可以通过缓存集合S_aS_b的交集是否为空来加速您的程序。而不是构建我认为是T中的一些集合的集合S。您保留集合索引的T列表,并检查集合S_n是否与T相交,您检查TS_n中的集合是否{{1}} 1}}与其中一个相交。

我在我的一个Python程序中这样做,因为集合交集测试是一个慢点。