寻找一种 JavaScript 算法来匹配给定半径内的 2 个人

问题描述

以下问题: 我有一个包含数千个条目的数组(具有 id地理位置 (lat,long) 的人)。目的是将每个人与给定半径(例如 20 公里)内的另一个人联系起来。我正在寻找一种有效的方法来做到这一点。我已经尝试过 Geohashes,但是由于数组的每个条目都需要与每个其他条目进行比较,因此缩放时执行时间很可怕。我将不胜感激任何伟大的提示!非常感谢。我正在使用 NodeJS 服务器进行匹配算法。

解决方法

我不明白为什么您需要将每个条目的 geohash 与其他条目进行比较?

从一个空的 Map 开始,其中每个键都是一个 geohash,每个值都是一组 id。 对于每个条目,计算 geohash 并将条目 id 添加到相关的 Set。 现在对于每个条目,您可以从集合中选择任何其他 id,如果没有其他 id,您将需要降低精度。 (如果一个条目不能与多个其他条目匹配,则实现会有所不同。)

,

我可以想到这里的一些改进:

  1. 如果您计算从 Ai 点到 Aj 点的距离,那么您已经有了从 Aj 到 Ai 的距离。这意味着您有 N*(N-1)/2 比较而不是 N*(N-1)
  2. 因为你有一个恒定的半径你可以取radius * radius(即radius^2)而不是使用平方根来比较计算距离与给定半径
  3. 如果所有计算都是同步的,您应该使用 worker threads 之类的东西,因为 Node.Js 在设计上是单线程的。

也许您可以看一下 JSTS 包,因为它可以为您节省一些地理空间计算时间。

另一种方法是将所有数据加载到具有地理空间支持的数据库中,添加所需的地理空间索引并使用该数据库的专门地理空间函数来计算距离并通过它对人群进行分组