从线上的点中挑选“传播”

时间:2016-02-04 20:27:26

标签: algorithm big-o distance

我正面临着如下所述的算法问题:给定从0到N的线(非常大的N),所述线上的X点列表和数字Z(0 <= Z <= X)选择Z指向X以最大化两个最近点之间的距离。 O(n ^ 2)中的暴力解决方案看起来并不困难,但我正在寻找可以在O(n log n)时间内完成的更复杂的东西。任何线索,解决方案,建议都非常感谢。

编辑:在第一篇文章中回答问题 - 必须最大化的最小距离(两个最近点之间)。

1 个答案:

答案 0 :(得分:3)

一种简单的方法是O(XlogN)。

首先,对点进行排序。

接下来观察一下,如果你已经知道了点之间的最小距离(称之为d),那么看O(X)是否有一种方法可以选择Z点,所有这些点都至少距离为d:左转最近的元素,然后是距离d至少距离d的下一个元素,然后是距离d远离距离d的下一个元素,依此类推。如果当你到达数组末尾时,你至少有Z分,那么你有一个解决方案,如果你没有,那就没有解决方案了。

现在,你可以在[0,N]上使用二进制搜索来找到解决方案中最大的d。

排序为O(XlogX),二进制搜索采用O(logN)试验,每个都是O(X)。总的来说,那是O(XlogX + XlogN),但是因为N&gt; = X简化为O(XlogN)。