我有S_0, ..., S_N
套。如何找到最大的子集T
,以便I_i
和T
的交集S_i
(对于每个0< = i
< = N )最多包含一个元素。
我有一个解决方案,但我猜它是不必要的慢(基本上是几个嵌套的for循环尝试所有组合)。所以我的问题是:
T
?答案 0 :(得分:3)
我认为你不太可能找到一个有效的通用算法来解决这个问题,因为我认为它是NP完全的。
如果您有一个有效的算法来解决这个问题,那么您可以解决maximum independent set problem。
假设您有一个图形,然后为每个边构造一个包含{i,j}的集合,其中i和j是由边缘连接的顶点。
然后,这些集合的最大子集T将是图表的最大独立集合。
更有用的是,您还可以通过查找图的最大独立集来表达您的问题,其中a和b之间存在边,当且仅当存在包含a和b的集时。
然后,您可以使用一些标准求解器来解决最大独立集问题,例如one in Pythons NetworkX。
答案 1 :(得分:0)
您可以通过缓存集合S_a
和S_b
的交集是否为空来加速您的程序。而不是构建我认为是T
中的一些集合的集合S
。您保留集合索引的T
列表,并检查集合S_n
是否与T
相交,您检查T
中S_n
中的集合是否{{1}} 1}}与其中一个相交。
我在我的一个Python程序中这样做,因为集合交集测试是一个慢点。