我正在浏览Stack Overflow关于算法的问题,在该算法中,从2D点列表中找到距离点A最近的点。我知道必须对列表进行排序以获得最佳时间,但我希望它比使用暴力的O(N ** 2)更快。
我找到了一个似乎很有吸引力的答案:Given list of 2d points, find the point closest to all other points,但我并不完全理解答案。我想知道他开始解释水平/垂直成本的那一部分,从那时起。有人能为我提供一个例子,说明在这些(随机)点的情况下该怎么办?
点A:(20,40.6)如果您可以为链接的帖子提供替代方法,那也没关系。我知道它与排序列表有关,可能会取消极端,但我再次确定使用哪种方法。
编辑:我现在明白这不是我最感兴趣的欧几里德距离。分而治之的算法/方法是不是最好的选择?我还没有完全理解它,但听起来它解决了我希望它在O(N * log(N))中解决的问题。这种方法是否是最佳的,如果是这样,有人会介意将其分解为基础知识,因为我无法像其他大多数网站所描述的那样理解它。答案 0 :(得分:0)
如果点列表中没有结构并且它们确实可以是随机的,那么您尝试做的事情是不可能的。假设您的算法运行速度比线性时间快,那么在您的点列表中有一个点B
,该算法根本无法读取。如果我将B
更改为另一个值,则算法将以相同的方式运行并返回相同的结果。现在,如果算法没有返回列表中与A
相同的点,那么我可以将B
更改为B=A
,现在问题的正确解决方案是{{1 (你不能比实际上相同的点更接近),算法必然会返回错误的结果。
您所指的问题是尝试从列表B
中找出<{1}} 点1>,以便{{1}之间的所有距离之和} A
中的每一点都是最小的。答案中描述的算法及时运行L
(其中A
)。请注意n*log(n)
actually grows faster than n
所以它实际上比查看每个元素要慢。
另外&#34;距离&#34;在问题中没有提到欧几里德距离。通常情况下,您要将点L
与第二点O(n*log(n))
之间的距离定义为n
,问题是指&#34; Taxicab distance&#34; (x_1,y_1)
其中(x_2,y_2)
表示绝对值。
如果您只想找到最接近固定点sqrt((x_2-x_1)^2+(y_2-x_2)^2)
的列表中的一个点,那么您可以在列表中线性搜索它。请参阅以下python代码:
|x_2-x_1|+|y_2-x_2|
引用问题的挑战在于,您不希望最小化到固定点的距离,但是您想要找到<{1}} 之外的点列表| |
与A
中所有其他点的平均距离最小。