- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个包含约 10.000 个点的坐标列表 A(纬度、十进制形式的经度)和另一个包含约 100 万个点的相同类型的坐标列表 B。
我想为列表 B 中的每个元素找到列表 A 中最近的点。
我已经完成的是创建两个列表的笛卡尔积,并使用半正弦公式找到所有组合的距离。
然后我得到列表 A 中的点,这些点与列表 B 中的每个点具有最小距离。
由于总组合超过100亿,计算距离的时间太长。
有没有办法确保列表 B 中的每个点都与列表 A 中的一个点匹配,同时还能提高性能?
最佳答案
如果您已经创建了叉积并计算出所有的半正弦距离,那么您已经完成了大部分工作,所以我假设问题是关于如果您有新的集合 A 和 B 该怎么办。
为了反复找到 A 中的最近点,我会构建某种包含 A 中的点的树结构,并在树的每个节点存储信息,这相当于一个边界框或包含其所有后代的等效项。然后当试图找到 A 中最近的点时,你递归地搜索包含 A 的树,当你到达一个节点时从递归调用返回并且你可以从存储在那里的信息计算出它的所有后代都离目标点更远比目前最接近的匹配。
要使这段代码起作用,边界框信息需要准确,但如果树是愚蠢的,它会减慢搜索速度,但不会阻止他们找到正确答案。这尤其意味着,当您构建树时,您可以安全地忽略经度在 180W = 180E 处环绕的不便习惯。你可以假装经纬度是一个矩形网格并构建一个 k-d 树,你可以将纬度和经度组合起来并对其进行位交错并在结果上构建一个一维搜索树,你可以计算 https://en.wikipedia.org/wiki/Geohash并以此为基础构建一个搜索树,或者你可以计算大量的 haversines 并构建一个 https://en.wikipedia.org/wiki/Cover_tree - 所有这些都应该有效,我不知道哪个最好 - 这可能取决于您的数据和可用的库。
关于algorithm - 从另一个点有效地找到最近的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43355116/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!