2017-04-11 82 views
2

我有一个列表A的坐标(十进制,十进制)和〜10.000点,第二个列表B的相同类型的坐标约100万点。从另一个点有效地找到最近点

我想找到列表用于名单B.每个元素的最近点

我已经做的是创建两个列表的笛卡儿积,并使用半正矢找到所有组合的距离式。

然后我得到的名单A具有用于名单B.

每个点的最小距离的点由于总的组合超过10个十亿,计算距离所用的时间太长。

有没有一种方法可以确保列表B中的每个点都与列表A中的一个点相匹配,同时也提高了性能?

+0

我会考虑在问题中增加更多细节。像预期的最小距离是什么?覆盖区域有多大?球体的哪一部分? “A”尺寸是固定的(或多或少)?你需要一个确切的解决方案?依此类推...最简单的方法,根据数据而定,可能会也可能不会,在较小的列表上构建kdtree,然后使用它来映射RDD。 – zero323

回答

1

如果您已经创建了交叉产品并计算出了所有的轴距,那么您已经完成了大部分工作,所以我将假设问题是如果您有新的A和B组应该怎么做

要重复查找AI中的最近点,将构建某种包含A中的点的树结构,并在树的每个节点处存储信息,该信息相当于一个包围其所有后代的包围盒或等效物。然后,当试图在A中找到最接近的点时,递归搜索包含A的树,在到达节点时从递归调用返回,并且可以根据存储的信息计算出它的所有后代离目标点更远比迄今为止最接近的匹配。

对于此代码的工作,边界框信息需要准确,但如果树是愚蠢的,它会减慢搜索速度,但不会阻止它们找到正确的答案。这意味着,特别是,当您构建树时,您可以放心地忽略在180W = 180E处缠绕的不便习惯。你可以假设lat-long是一个矩形网格并构建一棵kd树,你可以结合纬度和经度并对它们进行位交织并在结果上构建一维搜索树,你可以计算https://en.wikipedia.org/wiki/Geohash并构建一个搜索树基于这一点,或者你可以计算大量的海峡,并建立一个https://en.wikipedia.org/wiki/Cover_tree - 所有这些应该工作,我不知道哪一个最好 - 它可能取决于你的数据和你有可用的库。