寻找一组点的最近点(纬度/长度)

时间:2018-02-03 20:44:26

标签: algorithm sorting computer-science computational-geometry geographic-distance

我给了一个随机的一组点(不知道有多少)经纬度,需要对它们进行排序。

然后我将获得另一个随机点(纬度/经度)并且需要找到最接近它的点(来自上面的集合)。

当我实现线性搜索(将该集合放入列表然后计算所有距离)时,它所需的时间大约为7倍。

所以,我需要一种更有效的排序算法,但我不确定如何做到这一点,特别是因为我给出的点在平面上不存在。

1 个答案:

答案 0 :(得分:0)

如果你的分数分布适中,那么几何散列是一种在实践中加速最近邻搜索的简单方法。这个想法只是在网格单元格中注册您的对象并按单元格进行搜索,这样您就可以将搜索限制在当地社区。

这个小python demo将这个想法应用于飞机上的圆圈: Circles inserted into a geometric hash

因此,在您的情况下,您可以选择一些固定的N并将[0,2pi]中的经度坐标分成N个相等的部分,并将[0,pi]中的纬度坐标分成N个部分。这样可以在球体上提供N ^ 2个单元格。您在这些单元格中注册所有初始点。

当您获得查询点p时,您将开始在被p命中的单元格中搜索并在足够大的邻域中搜索,以便您不会错过最近的点。

如果您最初注册了n个点,那么您可以选择N到sqrt(n)/ 4左右。