algorithm - 集合中互斥项的子集

标签 algorithm set

我有集合S_0,...,S_N。如何找到最大子集 T,使得 TS_i 的交集 I_i(对于每个 0 <= i <= N) 最多包含一个元素。

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

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

最佳答案

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

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

证明草图

假设你有一个图,那么为每条边构造一个包含 {i,j} 的集合,其中 i 和 j 是由边连接的顶点。

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

转换为最大独立集

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

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

关于algorithm - 集合中互斥项的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19166144/

相关文章:

algorithm - 在前一个元素和当前元素之间的最大差异为 1 的数组中搜索的有效方法

java - 如何通过类中的部分字段从集合中提取对象

java - 您可以在不将值存储在 Java 中的情况下拥有集合吗?

java - TreeSet 存储重复的自定义对象

php - 找到分区集的每个可能组合的更好方法

c++ - 如何将 find_if 与链表等非容器一起使用?

algorithm - 您如何看待这种兴趣点检测算法?

algorithm - 动态与贪婪算法 : The debate regarding Neil G's answer on the same topic

c# - 将水平线和垂直线分组到表中 (C#)

arrays - 删除集合数组中的子集