【发布时间】:2017-04-12 14:42:44
【问题描述】:
我有一个包含约 30k 个位置的列表 L(写为经度/纬度对)和一个包含约 1m 个事件的列表 E(位置写为经度/纬度对),每个事件都发生在 L 中的一个点。我想用它在 L 中的相应位置标记 E 中的每个事件。但是 L 和 E 中的坐标四舍五入不同——E 到小数点后五位,L 到十三位——所以表面上相同的坐标实际上可以相差 ~10^-5 度,或约 1 米。 (L 中的点至少相隔约 10 m。)
因此我需要 L 中离 E 的每个点最近的点;明显的 O(|L||E|) 蛮力算法太慢了。 L 与 E 相比足够小,因此预处理 L 并将预处理时间摊销到 E 上的算法很好。这是一个经过充分研究的问题吗?我能找到的链接是针对相关但不同的问题,例如找到一组中一对点之间的最小距离。
可能相关:Voronoi diagrams,虽然我看不出将 L 预处理成 Voronoi 图如何节省我的计算时间。
【问题讨论】:
-
好吧..我已经跳过了你的大部分帖子,因为有太多无用的信息。基本上,您有一个包含 30k XY 点的列表“L”(如果需要,可以称为纬度/经度),并且您有一个包含一百万个 XY 点的列表“E”(同上),并且您想知道每个点E 最接近“L”中的哪个。是这样吗?请确认。
-
等等 - 如果舍入误差导致最大偏差为 1m,但点之间的最小距离为 10m,那么您可以将两者舍入到相同的精度并比较相等,对吧?
-
@AlexG:可以确认(我已经编辑了一些无用的信息)。
-
@ConnorHarris 谢谢。看起来四叉树应该可以完成这项工作。 fr.wikipedia.org/wiki/Quadtree 可能有很多开源库可以实现它,但我认为您可以很容易地自己完成。按 x 对所有参考点进行排序。将前半部分和后半部分按 y 排序。您刚刚将您的点分为 4 个区域。只需在构建树结构时递归执行此操作,直到每个区域仅包含 1 个点。之后,您可以通过比较范围和遍历树来搜索最近的点。
标签: algorithm geometry computational-geometry