给定 n 组整数,如何最大化非重叠组的数量

Given n sets of integers, how to maximize the number of non overlapping sets

给定n组整数,如何最大化非重叠组的数量?

例如,让给定的 sets

{1,2,3}
{1,4,5}
{6,7,8}
{2,3}
{8,9}
{9}

那么答案就是4,

 {1,4,5}, {6,7,8}, {2,3}, {9}

{1,2,3}{1,4,5} 不能由非重叠集合组成,因为 1 在两个集合中都是公共的。这是一个 NP 听到的问题吗?如果有针对该问题的有效解决方案,我会期待一些细节。

[N.B.] 输入集的数量最多可达 1000,每个集最多包含 1000 个整数。

这是一个最大独立集问题,其中您的集合对应于节点,而与共享至少一个元素的集合对应的节点之间有一条边。它是 NP-Hard,也很难近似为一个常数因子。

您仍然可以尝试解决它,例如使用整数线性规划:

maximize: sum x[i]

for each pair of sets (i,j) that overlap: x[i] + x[j] <= 1

x[i] 是一个布尔值,表示第 i 个集合是否是您要查找的 MIS 的一部分。

在这种情况下,答案很简单:假设没有一个集合是空的,你总能找到一个最大集合,其中没有一个集合是原始集合之一的超集——因为一个非空集合和它的超集或重叠并且不能都在最大集合中,并且可以用子集替换超集而不创建任何重叠。

这里可以排除{1, 2, 3}和{8, 9},幸好剩下的四组不重叠。