我有一组整数或示例:{1,3,4,5,10}现在我想要最大(最大=最多元素)子集,其中每个元素与其他元素之间的距离/差异最小。< / p>
例如,使用Set {1,3,4,5,10}和最小距离2,结果可能是:
{1,3,5,10}
或距离3:
{1,5,10}
是否存在(良好/高效)算法来解决该问题?
答案 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,依此类推......
后续步骤:
1 3 4 5 (10)
(1) 4 5 (10)
1 4 10
我不保证这有效,但这是一个开始......
答案 2 :(得分:0)
是的,以下贪婪算法提供了最佳解决方案。按排序顺序扫描整数,如果前一个采用的整数足够远,则取每个整数。正确性遵循一个感应证据,即对于每个解S和每个整数u,贪婪解决方案选择至少与S一样多的整数。