【问题标题】:How to find the nearest line segment to a specific point more efficently?如何更有效地找到离特定点最近的线段?
【发布时间】:2014-06-27 22:27:09
【问题描述】:

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

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

对于 n = 1000 f.e,这可能是一个真正的性能问题。 (这是一个可能的数字),特别是如果距离计算不仅在欧几里得空间中通过勾股定理完成,而是通过诸如半正弦公式或 Vincenty 的测地线方法完成。

这是不同情况下的普遍问题:

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

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

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

【问题讨论】:

  • 检查单个线段可能会有一些效率,例如当它们与其他线段共享端点时,但我相信你总是必须检查所有线段,所以答案总是成为命令。
  • 这可能有用 - en.wikipedia.org/wiki/Point_location 。这用于点查询,但您可以根据自己的目的进行调整
  • 这不是图论问题,属于计算几何领域。我更新了标签。
  • 您可以查看quad-trees 之类的内容,以便尝试快速剔除一些距离太远而无法成为“最近”的线段,尽管这种方法运行成本可能更高如果 n 很小,或者所有的行都挤得很紧
  • 要记住的是,这个问题是高度可并行化的。如果您的输入是 n=1000 的数量级,那么如果在 GPU 上执行,问题实际上是 O(1) 时间复杂度。

标签: algorithm data-structures computational-geometry


【解决方案1】:

可能不是一个可接受的答案,但评论太长了:这里最合适的答案取决于您在问题中没有说明的细节。

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

您必须在几个因素之间进行权衡,例如查询时间和内存消耗,或者查询时间和给定行集更改时更新数据结构所需的时间。后者还取决于是 结构 更改(添加或删除行),还是仅更改现有行的 位置

【讨论】:

  • 所以,数据将保持不变,只是红点的位置发生了变化。意味着,我构建数据一次,进行一些计算并加载一组新数据。如果可以通过廉价的查询复杂性降低整体性能,那么使用更复杂的数据结构可能会很有效。但当然我必须测试它。
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多