【发布时间】: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