【问题标题】:Given n sets of integers, how to maximize the number of non overlapping sets给定n组整数,如何最大化非重叠集的数量
【发布时间】:2016-02-01 16:47:46
【问题描述】:

给定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听说的问题吗?如果有针对该问题的有效解决方案,我会期待一些细节。

[注意]输入集的数量最多可达到 1000,每个集最多包含 1000 个整数。

【问题讨论】:

    标签: algorithm data-structures set np-hard


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 如何查看bool + bool &lt;= 1?我很困惑。
    • @SazzadHissainKhan 你不会,你把它交给一个现有的求解器,比如 GLPK、CPLEX、Gurobi ..如果你的意思是如何对布尔值求和,那么标准方法:false 是0,真为 1
    • @SazzadHissainKhan 换一种说法,根据我们的解释,x 是一个布尔数组。这不是bool[],实际上是float[] 内部原因 - 事实上,当求解器忙于求解时,部分解将在x 中具有小数值。但是约束的定义方式和结果的解释方式,x[i] 实际上是一个布尔值,只有值 0.0(false = 不接受这个集合)和 1.0(true = 这个集合在 MIS 中)可以出现在解决方案中。
    【解决方案2】:

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

    这里,{1, 2, 3} 和 {8, 9} 可以排除,很高兴剩下的四个集合不重叠。

    【讨论】:

    • 你能用例子多描述一下吗?提前致谢。
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2012-05-09
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多