给定 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},幸好剩下的四组不重叠。
给定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},幸好剩下的四组不重叠。