【问题标题】:Is there any algorithm which can solve this number group sequence?有什么算法可以解决这个数字组序列吗?
【发布时间】:2012-04-13 01:53:31
【问题描述】:

我有一个问题,如下所述。您有什么好的解决方案,或者这个问题只是任何“经典”或“已解决”问题的另一种形式?

问题是:

有一些数字组,例如

A(1 8 9)

B(1 4 5)

C(2 4 6)

D(3 4 7)

E(2 10 11)

F(3 12 13)

有“A-F”六组。我们有数字“1,2,3,4,5,6,7,8,9,10,11,12,13”。 现在找到满足每个组的最小数量的数字集合必须至少在这个集合中有一个数字。例如,我们可以找到集合“1 4 2 13 12”,A 有“1”,B 有“1,4”,C 有“2,4”,D 有“4”,E 有“2”, F 有“12,13”。

但集合“1 2 4”并不是我们发现的,F在集合中没有任何数字。

最好的集合是“1,2,3”,每个组在集合中都有一个数字,集合的大小是最优的。它只有三个数字。这就是我们想要的。如果有很多最好的集合,找到任何一个都可以。谢谢。

【问题讨论】:

  • 你的宇宙有多大?您的示例使用了 13 个数字,您是否期望得到更多?

标签: algorithm numbers set


【解决方案1】:

这相当于set cover problem。在这种情况下,您的每个集合 A、B、...、F 都是集合覆盖问题的元素,并且每个数字 1、2、...、13 都是集合。例如,在这个映射中,1 变成 {A, B},而 11 变成集合 {E}。

设置封面是 NP 难的。链接的维基百科页面上的整数线性规划公式可能与您获得的精确解决方案一样好;贪心算法对于大问题有一个不错的近似值。

【讨论】:

  • 我觉得有趣的是,我们每个人都在大约 20 秒内发现了不同 NP-hard 问题的减少。 :-)
  • @templatetypedef 我正要在您的答案中发布基本相同的内容。 :)
  • 我个人认为设置封面比顶点封面更合适(更直观的减少),所以我赞成这个答案。 ;)
【解决方案2】:

这个问题是 NP-hard 通过从 NP-hard vertex cover problem 减少而来的(给定一个图,你能找到一组 k 节点,使得图中的每个顶点都与某个选定的节点相邻吗?)

减少如下。以您想要的任何顺序对图表 1、2、3、...、n 中的所有节点进行编号。然后,对于图中的每条边,构造仅包含两个数字的集合 - 边的端点。如果原始图中有一个 k 节点顶点覆盖,那么您可以选择一组 k 个数字(即顶点覆盖中的节点),这样您就可以从每个集合中选择一个数字。这可以在多项式时间内计算。

要了解减少工作的原因,请注意,如果有一组大小为 k 的集合,您可以选择这样构造中的每个集合至少选择一个元素,然后对应于这些数字的顶点形成 k 元素顶点覆盖在原始图表中。

这种减少可以在多项式时间内完成,因此我们从 NP-hard vertex-cover 问题到您的问题进行了多项式时间减少。因此,这个问题是 NP 难的。所以,除非P = NP,否则这个问题没有多项式时间算法。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2018-08-13
    • 2021-01-17
    • 1970-01-01
    • 2023-03-18
    • 2021-09-02
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多