从集合中确定最近位置的快速/有效方法

Posted

技术标签:

【中文标题】从集合中确定最近位置的快速/有效方法【英文标题】:Fast/Efficient way to determine closest location from collection 【发布时间】:2017-07-12 01:10:08 【问题描述】:

我正在考虑如何在我的应用程序中构建数据,最重要的查找之一将是位置集合(10,000 多个位置)中最近的位置,我正在寻找最快和最有效的方法这个。

我的想法:

    使用 Core Data 并存储 cllocations 或 doubles,使用谓词查询以最接近参考位置进行排序

    将它们存储在sqlite数据库中,并在sql查询中使用距离公式

    将所有位置加载到内存中的某种数据结构(数组、链表、哈希图等)中,并以不同的方式计算距离

在这些解决方案中,哪一个是最快/最有效的?或者您有其他推荐的解决方案吗?

【问题讨论】:

检查 SQLite RTree 是否有帮助:sqlite.org/rtree.html 这是速度和内存使用之间的权衡;哪个更有效取决于您的环境。 使用 CoreData 和 SQLite 后备存储,无法使用计算值对 fetchRequest 进行排序,因此您的 (1) 会很困难。您可以使用谓词将数据过滤到给定框或半径内的数据,然后在内存中排序以获得最近的。 @pbasdf - 如果直接使用 SQLite,您可以通过实现自定义函数使用计算值进行排序。我认为它会比将整个数组加载到内存中并在那里排序要慢得多,但你当然可以做到。但是,如果他真的只对最近的匹配感兴趣,那么排序可能不是最好的方法,因为这具有 O(n log n) 的时间复杂度,而找到最近的匹配实际上是 O( n) 问题。 @Rob - 我猜想直接使用 SQLite 可能是可能的,但我自己没有这方面的经验,所以感谢您的澄清。关于找到最近的 v 排序的好点:这确实为在 CoreData 获取中实现它开辟了一些途径。但我怀疑你是对的:在内存中做会更快。 【参考方案1】:

正如其他人所提到的,您无法使用 Core Data 按计算值排序,因此很遗憾无法查询最近的位置。我使用了以下“装箱”方法来近似,这可能会也可能不会满足您的需求:

    围绕目标位置计算一个框。度数偏移是您需要解决的问题,但decimal degrees 上的***文章可能是一个很好的起点。将您的目标偏移 +/- 一些度数以获得一个粗略的矩形。 获取该矩形内的每个位置。 对内存中的结果进行排序以找到最接近的结果。

如果您想向最近的位置发出一次请求,您可能必须直接使用 SQLite。如果不仔细检查这样做的总内存影响,并了解您的应用同时出于其他原因使用了多少内存,我不会将所有点加载到内存中。

【讨论】:

以上是关于从集合中确定最近位置的快速/有效方法的主要内容,如果未能解决你的问题,请参考以下文章

快速从2个List集合中找出相同/不同元素

从其他集合构建集合的有效方法

基于某些集合大小处理单数/复数单词的有效方法[关闭]

有效地为集合中的每个类别选择顶行

横向解决方法:将参数从查询中的其他位置传递给集合返回函数

getBoundingClientRect的快速理解