寻找一种 JavaScript 算法来匹配给定半径内的 2 个人
Posted
技术标签:
【中文标题】寻找一种 JavaScript 算法来匹配给定半径内的 2 个人【英文标题】:Looking for an JavaScript algorithm to match 2 persons within a given radius 【发布时间】:2020-12-20 14:54:22 【问题描述】:以下问题: 我有一个包含数千个条目的数组(具有 id 和 geolocation (lat,long) 的人)。目的是将每个人与给定半径(例如 20 公里)内的另一个人联系起来。我正在寻找一种有效的方法来做到这一点。我已经尝试过 Geohashes,但是由于数组的每个条目都需要与其他每个条目进行比较,因此缩放时的执行时间很糟糕。我将不胜感激任何伟大的提示!非常感谢。我正在使用 NodeJS 服务器进行匹配算法。
【问题讨论】:
【参考方案1】:我不明白您为什么需要将每个条目的 geohash 与其他每个条目进行比较?
从一个空 Map 开始,其中每个键是一个 geohash,每个值是一组 id。 对于每个条目,计算 geohash 并将条目 id 添加到相关集。 现在,对于每个条目,您可以从集合中选择任何其他 id,如果没有其他 id,则需要降低精度。 (如果一个条目不能与多个其他条目匹配,则实现会有所不同。)
【讨论】:
geohash
是什么意思?
@Anatoly 所以,如果你对地理哈希不满意,你可以把纬度和经度当作一个向量的值(Long, Lat),计算两个向量之间的距离,然后使用它们来确定距离是否是您想要的值,这可以是替代方法:)
@Anatoly “Geohash ...将地理位置编码为一串字母和数字。”见en.wikipedia.org/wiki/Geohash。任何其他会失去一些位置精度的算法也可以工作。这个想法是靠近的位置将映射到相同的值。【参考方案2】:
我可以在这里想到几个改进:
-
如果您计算从 Ai 点到 Aj 点的距离,那么您已经有了从 Aj 到 Ai 的距离。这意味着您有
N*(N-1)/2
比较而不是 N*(N-1)
。
因为你有一个恒定的半径你可以取radius * radius
(即radius^2
)而不是使用平方根来比较计算距离与给定半径
如果所有计算都是同步的,您应该使用 worker threads
之类的东西,因为 Node.Js 在设计上是单线程的。
也许您可以看一下JSTS
包,因为它可以为您节省一些地理空间计算时间。
另一种方法是将所有数据加载到具有地理空间支持的数据库中,添加所需的地理空间索引并使用该数据库的专门地理空间功能来计算距离并按其分组人
【讨论】:
以上是关于寻找一种 JavaScript 算法来匹配给定半径内的 2 个人的主要内容,如果未能解决你的问题,请参考以下文章