【问题标题】:Finding the biggest subset of elements that does not correlate找到不相关的元素的最大子集
【发布时间】:2015-04-07 09:45:04
【问题描述】:

我有一组整数,我想找到其中元素不以特定方式相互关联的最大子集。例如一个子集,如果其中任何元素乘以 13,则结果不在该子集中。

我的第一个想法是遍历所有可能的子集,过滤掉那些不满足条件的,然后找到最大的一个,但这太慢了,我不知道如何生成所有可能的子集。

【问题讨论】:

  • 答案在很大程度上取决于您所说的“相关”。一个明显的例子是sum{subset} = sum{set}/2 的关系,这是分区问题,它没有已知的有效(多项式时间)。 (如果是整数,则存在伪多项式)
  • 但是,如果问题只是“如何创建所有可能的子集” - 这将是一个骗局,这里有很多关于它的问题。 (简单的解释,使用递归,并且对于每个元素“猜测”它是否在子集中并递归,当从递归返回时,“猜测”另一个选项。
  • 问题是如何求最大子集中的元素个数。
  • 那要看具体关系了。
  • 1,2,26 不正确,因为 2*13=26。删除所有重叠也会删除 26,并且您只会得到 [1,2] - 这是次优的。

标签: algorithm


【解决方案1】:

我将回答这个问题(来自 cmets)。一般来说,任何“相关性”都没有好的解决方案

关系如下:如果您将子集中的任何元素乘以某个数字,则结果数字不必在子集中。

如果你的号码是m

你可以生成所有链xx*mx*m*m,....,这样链中的所有数字都在集合中,x/m不在

从原始集合中删除每隔一个元素,即x*m^2x*m^4。剩下的元素就是你的目标集。

【讨论】:

    【解决方案2】:

    更好的方法是构建一个图并找到具有最多边的顶点并将它们删除,直到您摆脱所有边为止。复杂度约为 O(N^2)。

    这是一个详细的算法:

    for each possible pair (x, y) from the source set
    begin
        if x = y * 13 or y = x * 13 then make edge between x and y
    end
    while graph has edges
    begin
        let V = find: a vertex with maximum count of edges (it can be 1 or 2)
        remove V from the graph
    end
    result: the remaining vertexes in the graph
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      相关资源
      最近更新 更多