如何更有效地找到最近的特定点的线段?

时间:2014-06-27 22:27:09

标签: algorithm data-structures computational-geometry

这是我经常遇到的一个问题,我正在寻找一种更有效的解决方法。看看这张照片:

enter image description here enter image description here

假设您想要找到从红点到 n 的线段的最短距离。假设您只知道段和点的起点/终点(x,y)。现在,这可以在O(n)中完成,其中n是线段,通过检查从点到线段的每个距离。这是IMO没有效果,因为在最坏的情况下,必须进行n-1次距离检查才能找到正确的距离。

对于n = 1000 f.e,这可能是一个真正的性能问题。 (这是一个可能的数字),特别是如果距离计算不是由毕达哥拉斯定理在欧几里德空间中完成的,而是例如通过像胡子公式或文森特那样的测地方法。

这是不同情况下的一般问题:

  • 点是否在顶点半径内?
  • 哪一组顶点最接近点?
  • 点是否被线段包围?

要回答这些问题,我所知道的唯一方法是O(n)。现在我想知道是否有数据结构或不同的策略来更有效地解决这些问题?

简而言之:我正在寻找一种方式,其中线段/顶点可以被"过滤"在开始我的距离计算之前以某种方式获得一组潜在的候选人。将复杂度降低到O(m)的东西,其中m

1 个答案:

答案 0 :(得分:4)

可能不是一个可以接受的答案,但评论的时间太长了:这里最恰当的答案取决于你未在问题中说明的细节。

如果您只想执行此测试一次,则无法避免线性搜索。但是,如果您有一组固定的行(或一组随时间变化不会太大的行​​),那么您可以使用各种技术来加速查询。这些有时被称为Spatial Indices,就像Quadtree一样。

您必须期望在多个因素之间进行权衡,例如查询时间和内存消耗,或查询时间以及在给定的一组行更改时更新数据结构所需的时间。后者还取决于它是否是结构更改(添加或删除行),或者仅现有行的位置是否发生变化。