【问题标题】:Select k numbers from each category without duplicates and maximize the selection从每个类别中选择不重复的k个数字并最大化选择
【发布时间】:2017-10-27 19:37:46
【问题描述】:

N 数字列表。从每个列表中选择k 数字并返回可以以这种方式形成的最大集合(无重复)。如果可能有多个相同大小的集合,则返回其中任何一个都是可以接受的。

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

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

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

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

请解释一下。提前致谢!

【问题讨论】:

  • 也许我不太了解这个问题,但似乎您可以将所有列表中的所有元素添加到一个集合中,并在线性时间内获得最大结果,不是吗? (然后您可以从结果集中随机选择k 数字)
  • @alfasin 那么它不会被授予 k 号码被选中。如果 l1 = [1,2], l2 = [3,4,5,6,7], 如果 k = 2, 那么从 [1,2,3,4,5,6,7] 中随机选择 4 可能会返回[4,5,6,7] 不包括 l1 中的 1,2。所以在这种情况下,最终结果必须包含来自 l1 的 [1, 2]。有意义吗?
  • 但是如果你正在寻找max 解决方案,你真的不能随意做任何事情......
  • @alfasin,感谢您的跟进。在这种情况下,我的意思是最终结果可以是 [1,2,3,4] 或 [1,2,4,7],两者都被接受。我希望我的算法具有这种随机性。
  • 很抱歉没有很好地解释自己:如果你想要最大的结果,在你的最后一个例子中 - 答案必须包含1,2。既然你有这个限制,它就不再是“随机的”了。

标签: algorithm np-complete


【解决方案1】:

这个问题可以通过最大二分匹配来解决。这是一个经典的算法,它的描述在网上很容易找到,所以我就不在这里介绍了。

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

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

让我们构建一个二分图。在左侧部分,输入中出现的所有不同数字都有一个顶点。在右侧,每个列表都有k 顶点。现在,“数字”顶点与所有“列表”顶点相连,使得列表包含数字。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2017-05-09
    • 2017-07-13
    相关资源
    最近更新 更多