找到元素的水平成本(和垂直成本)?

时间:2014-04-13 18:19:36

标签: algorithm distance

我正在浏览Stack Overflow关于算法的问题,在该算法中,从2D点列表中找到距离点A最近的点。我知道必须对列表进行排序以获得最佳时间,但我希望它比使用暴力的O(N ** 2)更快。

我找到了一个似乎很有吸引力的答案:Given list of 2d points, find the point closest to all other points,但我并不完全理解答案。我想知道他开始解释水平/垂直成本的那一部分,从那时起。有人能为我提供一个例子,说明在这些(随机)点的情况下该怎么办?

点A:(20,40.6)
积分[( - 20,200),(12,47),(4,0),( - 82,92),(40,15),(112,97),( - 203,84)]

如果您可以为链接的帖子提供替代方法,那也没关系。我知道它与排序列表有关,可能会取消极端,但我再次确定使用哪种方法。

编辑:我现在明白这不是我最感兴趣的欧几里德距离。分而治之的算法/方法是不是最好的选择?我还没有完全理解它,但听起来它解决了我希望它在O(N * log(N))中解决的问题。这种方法是否是最佳的,如果是这样,有人会介意将其分解为基础知识,因为我无法像其他大多数网站所描述的那样理解它。

1 个答案:

答案 0 :(得分:0)

如果点列表中没有结构并且它们确实可以是随机的,那么您尝试做的事情是不可能的。假设您的算法运行速度比线性时间快,那么在您的点列表中有一个点B,该算法根本无法读取。如果我将B更改为另一个值,则算法将以相同的方式运行并返回相同的结果。现在,如果算法没有返回列表中与A相同的点,那么我可以将B更改为B=A,现在问题的正确解决方案是{{1 (你不能比实际上相同的点更接近),算法必然会返回错误的结果。

您所指的问题是尝试从列表B中找出<{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 中所有其他点的平均距离最小。