Algorithm 给定N个元素集,求M个元素集的最小并集

Algorithm 给定N个元素集,求M个元素集的最小并集,algorithm,Algorithm,给我一份食谱,作为一套配料,我试图找到能让我一周的饭量值的最小配料。这就转化为上面的问题,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,但我想看看其他方法是否也可以使其达到最佳 注意:可能有多个这样的集合,具有相同的基数。这个问题称为最小k-并集,如下所示

给我一份食谱,作为一套配料,我试图找到能让我一周的饭量值的最小配料。这就转化为上面的问题,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,但我想看看其他方法是否也可以使其达到最佳


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

这个问题称为最小k-并集,如下所示:

  • 斯塔尔·文特博(2002)。DSG技术报告2002-006
因此,没有人知道任何算法可以解决它,它在时间上运行,即输入大小的多项式

在您的情况下,您可能很乐意接受一个近似的解决方案:即,一个包含少量成分的配方集合,但不一定是最小的集合。因此,我建议您尝试贪婪算法:通过在每个阶段添加最小化联合大小的配方,迭代地建立一个配方集合。下面是Python中的一个幼稚实现:

def小螺纹接头(套,k):
"""
从“集合”中选择“k”元素并返回它们的并集。请重试
用贪婪的方法返回一个相当小的联盟。
>>>小联合([{1,2},{2,3},{1,2,3},{1},{2}],3)
集合([1,2])
>>>小联合([{1,2},{2,3},{3,4},{1,4}],3)
集合([1,2,3,4])
"""
union=set()
对于xk范围内的u):
s=最小值(集合,键=λs:len(s |并集))
设置。删除(s)
并集|=s
回归联盟

Hmm也许Mathforum会更好;)交叉张贴在这里:(2017)O(n^{0.25+\epsilon})-这里的近似算法(在SODA 2017中):哇,我的杂货店购物变得NP难。谢谢你的回答。把杂货装进你的购物篮已经是NP难了!