如何快速找到大量点的特定点(基于位置的服务)?

时间:2014-04-11 03:32:05

标签: algorithm maps graph-algorithm

我有一张大约数千万个点的地图代表人们的位置,现在有一个点,如何在1公里的距离找到点(代表人的位置)从给定的点快速?什么是最好的算法?

3 个答案:

答案 0 :(得分:2)

您可以使用kd tree获取距指定点特定距离内的所有点。在诸如你的密集图中,问题可以在O(logn + k)中求解,其中k是可以在区域中找到的总点,n是总点。

答案 1 :(得分:1)

我认为最快快速的方法是使用网格过滤绝对距离太远的所有点。对于其他点,您可以精确计算距离。

我不确定你的圆点是什么样的。但是让一个点成为一对坐标(x,y)。 您可以将它们保存为已排序(在数据库中),因此可以使用(a,b)x - max_dist < a < x + max_dist轻松找到所有点y - max_dist < b < y + max_dist。所以你得到一个只有一些点的小方块。现在,您可以计算(x,y)与正方形中(a,b)点之间的确切距离。

这也适用于gps-coordinats。当然,球体上的坐标不会形成正方形,但如果球体比最大距离大得多,则无关紧要。

答案 2 :(得分:1)

网格听起来像一个非常实用的解决方案,但是这个问题也有许多基于树的数据结构。基本思想是您将数据排列在树中并向树中添加注释,例如每个节点上的边界框,其中包含该节点下方的所有点。然后,当您搜索树时,您可以计算出您不需要查看大多数节点的后代。

http://en.wikipedia.org/wiki/K-d_tree http://en.wikipedia.org/wiki/Cover_tree