最接近给定点

时间:2009-12-14 14:10:52

标签: algorithm 2d points

我在2D图像中有一组随机选择的像素。对于图像中的每个其他像素,我需要找出集合K中哪个像素最接近它(使用标准sqrt(dx ^ 2 + dy ^ 2)距离度量)。我知道每个像素可能有多个解决方案。显然,它可以通过强力对抗集合中的每个像素来完成,但我宁愿避免这种情况,因为它效率不高。还有其他好的建议吗?

干杯。

8 个答案:

答案 0 :(得分:36)

不要忘记你不需要打扰平方根。

如果你只是想找到最近的那个(而不是它的实际距离),只需使用dx^2 + dy^2,这将给你每个项目的距离平方,这同样有用。

如果您没有包含此像素列表的数据结构,则需要对它们进行全部测试。

如果您有一定的灵活性,那么有很多减少工作量的好方法。制作一个Quadtree,或保留像素的排序列表(按x排序并按y排序),以便更快地缩小搜索范围。

答案 1 :(得分:15)

我必须同意jk和Ewan同意Voronoi Diagram。这将分割多边形中的空间。 K中的每个点都有一个多边形,描述最接近它的所有点。 现在当你得到一个点的查询时,你需要找到它所在的多边形。此问题称为Point Location,可以通过构建Trapezoidal Map来解决。

jk已经使用Voronoi Diagram链接到Fortune's algorithm的创建,该This website采用O(n log n)计算步骤并花费O(n)空间。 Computational Geometry: algorithms and applications向您展示如何制作梯形地图以及如何查询它。你也可以在那里找到一些界限:
预计创建时间:O(n log n)
预期的空间复杂性:O(n)

但最重要的是,预期的查询时间:O(log n)。这(理论上)优于kD树的O(√n)。

我的来源(上述链接除外)是:{{3}},第六章和第七章。

在那里,您将找到有关这两种数据结构的详细信息(包括详细的证明)。 Google图书版仅包含您需要的部分内容,但其他链接应足以满足您的需求。如果你对这类东西感兴趣,那就买吧(这是一本好书)。

答案 2 :(得分:7)

Voronoi Diagrams的构建是Computational Geometry的一个分支。 Delaunay Triangulations的构建涉及类似的考虑。您可以根据自己的需要调整以下Delaunay algorithms之一。

  • 翻转算法
  • 增量
  • 分而治之
  • 扫掠迹线

答案 3 :(得分:6)

将点放在KD树中,在此之后找到最近的邻居非常快。有关详细信息,请参阅维基百科上的this文章。

答案 4 :(得分:5)

这称为最近邻搜索。唐纳德克努特称之为邮局问题。

有许多解决方案:线性搜索,局部敏感哈希,矢量近似文件和空间分区。

谷歌搜索那些应该有所帮助。

答案 5 :(得分:5)

你要做的是构建voronoi diagram这可以在O(n log n)中使用plane sweep

完成

答案 6 :(得分:4)

另一个提示:距离总是大于或等于每个坐标差异,并且总是小于或等于它们的总和,即

d >= dx, d >= dy, d <= dx + dy.

这可以帮助您更有效地进行排序。

答案 7 :(得分:1)

根据此图形填充像素的密度,您可能最好只从原点像素向外搜索。

我为这样的图形终端仿真编写了类似的东西。我最终做的是编写一个从中心点长出的方形螺旋形状的搜索模式,然后我让它生长直到它碰到某些东西。即使在旧的CPU上,这也足够快。