【问题标题】:Given N sets of elements, find minimal union of M sets给定 N 组元素,找到 M 组的最小并集
【发布时间】:2012-09-14 20:59:46
【问题描述】:

给定一份​​食谱作为一组配料,我试图找到最少的配料来制作一周的饭菜。这转化为上述问题,其中 N 为食谱数,M = 7。

eg. if the initial sets are [{1,2}, {2,3}, {1,2,3}, {1}, {2}], and M=3
The minimal union is {1,2}.

我正在寻找解决此问题的高级方法。我觉得这可以简化为 BFS,但我想看看其他方法是否也可以使其达到最佳状态。

注意:可能有多个这样的集合,具有相同的基数。

【问题讨论】:

标签: algorithm


【解决方案1】:

这个问题被称为MINIMUM k-UNION,它是NP-hard,如下所示:

所以没有人知道任何算法来解决它,它运行的时间是输入大小的多项式。

在您的情况下,您可能会乐于接受一个近似的解决方案:即包含少量成分的食谱集合,但不一定是最小的此类集合。所以我建议您尝试贪心算法:通过在每个阶段添加最小化联合大小的配方来迭代地构建配方集合。这是 Python 中的一个简单实现:

def small_union(sets, k):
    """
    Choose `k` elements from `sets` and return their union.  Attempt
    to return a fairly small union using a greedy approach.

    >>> small_union([{1,2}, {2,3}, {1,2,3}, {1}, {2}], 3)
    set([1, 2])
    >>> small_union([{1,2}, {2,3}, {3,4}, {1,4}], 3)
    set([1, 2, 3, 4])
    """
    union = set()
    for _ in xrange(k):
        s = min(sets, key = lambda s: len(s | union))
        sets.remove(s)
        union |= s
    return union

【讨论】:

  • 哇,我的杂货店购物非常困难。感谢您的回答。
  • 将杂货放入购物篮已经是 NP 难了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
相关资源
最近更新 更多