获得具有特定最小距离/差异的最大整数子集

时间:2012-06-01 14:50:45

标签: algorithm

我有一组整数或示例:{1,3,4,5,10}现在我想要最大(最大=最多元素)子集,其中每个元素与其他元素之间的距离/差异最小。< / p>

例如,使用Set {1,3,4,5,10}和最小距离2,结果可能是:

{1,3,5,10}

或距离3:

{1,5,10}

是否存在(良好/高效)算法来解决该问题?

3 个答案:

答案 0 :(得分:2)

这绝对不是NP完全问题。

实际上这是经典Interval Scheduling问题的一个特例,而在正常的Interval Scheduling问题中,长度并不固定

在您的问题中,您可以查看每个数字是间隔的开始时间,并且每个间隔都将您的“最小距离”作为间隔长度。

每个间隔都有一个结束时间,即开始时间+间隔长度

所以解决方案就是

1按完成时间对所有间隔进行排序。

2逐个按排序顺序浏览它们,将间隔添加到结果集中,该结果集与结果集中的所有现有间隔兼容。

此解决方案是最佳的,并且具有O(nlogn)时间复杂度。

您可以在上面的链接中找到有关其他贪婪算法的证明和信息。

答案 1 :(得分:0)

这些方面的东西:

1)对输入进行排序。

2)浏览输入并用选择的元素数量标记每个元素。

3)从可用元素中依次选择具有最低标记的元素。

4)删除排除的元素。

5)重复3)和4)

所以,就你的例子而言:

1  3  4  5  10     - difference 3

第1步已经完成,转到第2步我们得到:

1  3  4  5  10
1  3  2  2  0

说明 - 如果我们选择1,我们排除1个数字-3;如果我们选择3,我们会排除3个数字-1,4和5,依此类推......

后续步骤:

  • 选择10,不删除任何内容。 - 1 3 4 5 (10)
  • 选择1,删除3. - (1) 4 5 (10)
  • 选择4(或5),删除5(或4) - 1 4 10

我不保证这有效,但这是一个开始......

答案 2 :(得分:0)

是的,以下贪婪算法提供了最佳解决方案。按排序顺序扫描整数,如果前一个采用的整数足够远,则取每个整数。正确性遵循一个感应证据,即对于每个解S和每个整数u,贪婪解决方案选择至少与S一样多的整数。