从每个类别中选择k个数字,不重复,并最大化选择

时间:2017-10-27 19:37:46

标签: algorithm np-complete

N个数字列表。从每个列表中选择k个数字,然后返回可以这种方式形成的最大集合(无重复项)。如果可以使用多个相同大小的集合,则可以返回其中任何一个集合。

例如,如果N = 3,则k = 2,

l1: [1, 2, 3]
l2: [2, 7]
l3: [3]

然后最佳结果为[1, 3, 2, 7]。从[1, 3]选择l1,从[2, 7]选择l2,从[3]选择l3。 (虽然还有其他选择,但结果集中的元素数量少于这个,所以这一个是最佳选择。)

我认为这是 NP-complete 问题,唯一的方法是枚举。

请详细说明。提前谢谢!

1 个答案:

答案 0 :(得分:0)

这个问题可以用最大的二分匹配来解决。这是一个经典的算法,它的描述可以在互联网上轻松找到,所以我不会在这里包含它。

请注意,此算法是多项式时间,因此问题不是NP难。

二分匹配问题是:给定一个二分图,选择一组边,使每个顶点最多与一个选定边相邻,并且在可能的集中找到一个具有最大基数的边。

让我们建立一个二分图。在左侧部分,将出现输入中出现的所有不同数字的顶点。在右侧部分,每个列表将有k个顶点。现在,"数字" vertex与所有" list"顶点,使列表包含数字。

现在请注意,此图表中最大匹配的基数正是您问题的答案:我们已经采用尽可能多的不同数字,而不会从任何单个列表中获取超过k的数字。在这里,我们允许从列表中删除少于k项,因为它无法增加答案。如有必要,您可以携带任何额外的(无用的)物品。

如果您对最大流量有所了解,可以考虑每个列表只添加一个顶点,使k - 容量边缘下沉。这基本上是相同的,但会产生更快的渐近运行时间。