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

Ios 从集合中快速/高效地确定最近位置的方法,ios,swift,sqlite,core-data,cllocation,Ios,Swift,Sqlite,Core Data,Cllocation,我正在考虑如何在我的应用程序中构建数据结构,最重要的查找之一将是距离位置集合(10000多个位置)最近的位置,我正在寻找最快、最有效的方法 我的想法是: 使用核心数据并存储cllocations或Double,使用谓词按最接近引用位置的顺序进行查询 将它们存储在sqlite数据库中,并在sql查询中使用距离公式 将所有位置加载到内存中的某种数据结构(数组、链表、hashmap等),并以不同的方式计算距离 在这些解决方案中,哪一种最快/最有效?或者您会推荐另一种解决方案吗?正如其他人所提到的,您无

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

我的想法是:

  • 使用核心数据并存储cllocations或Double,使用谓词按最接近引用位置的顺序进行查询

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

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


  • 在这些解决方案中,哪一种最快/最有效?或者您会推荐另一种解决方案吗?

    正如其他人所提到的,您无法根据核心数据的计算值进行排序,因此查询最近的位置是很不幸的。我使用了以下“装箱”方法来近似计算,这可能满足您的需求,也可能不满足您的需求:

  • 计算目标位置周围的方框。以度为单位的偏移量是需要计算出来的,但维基百科上的文章可能是一个很好的起点。将目标偏移+/-若干度,得到一个粗略的矩形
  • 获取该矩形内的每个位置
  • 对内存中的结果进行排序,以查找最接近的结果

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

    正如其他人所提到的,您无法使用核心数据按计算值进行排序,不幸的是,最近位置的查询失败了。我使用了以下“装箱”方法来近似计算,这可能满足您的需求,也可能不满足您的需求:

  • 计算目标位置周围的方框。以度为单位的偏移量是需要计算出来的,但维基百科上的文章可能是一个很好的起点。将目标偏移+/-若干度,得到一个粗略的矩形
  • 获取该矩形内的每个位置
  • 对内存中的结果进行排序,以查找最接近的结果

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

    检查SQLite RTree是否有帮助:这是速度和内存使用之间的折衷;哪个更有效取决于您的环境。使用CoreData和SQLite备份存储,无法使用计算值对fetchRequest进行排序,因此您的(1)将很困难。您可以使用谓词将数据筛选到给定框或半径内的数据,然后在内存中进行排序以获得最接近的数据。@pbasdf-如果直接使用SQLite,则可以通过实现自定义函数,使用计算值进行排序。我假设它比将整个数组加载到内存中并在内存中排序要慢得多,但您肯定可以做到。但是,如果他真的只对最近的匹配感兴趣,那么排序可能不是最好的方法,因为排序的时间复杂性与O(n log n)类似,而查找最近的匹配实际上是一个O(n)问题。@Rob-我猜直接使用SQLite是可能的,但我自己没有经验,谢谢你的澄清。查找最近的v排序的好处:这确实为在CoreData获取中实现它打开了一些途径。但我怀疑你是对的:在内存中运行会更快;哪个更有效取决于您的环境。使用CoreData和SQLite备份存储,无法使用计算值对fetchRequest进行排序,因此您的(1)将很困难。您可以使用谓词将数据筛选到给定框或半径内的数据,然后在内存中进行排序以获得最接近的数据。@pbasdf-如果直接使用SQLite,则可以通过实现自定义函数,使用计算值进行排序。我假设它比将整个数组加载到内存中并在内存中排序要慢得多,但您肯定可以做到。但是,如果他真的只对最近的匹配感兴趣,那么排序可能不是最好的方法,因为排序的时间复杂性与O(n log n)类似,而查找最近的匹配实际上是一个O(n)问题。@Rob-我猜直接使用SQLite是可能的,但我自己没有经验,谢谢你的澄清。查找最近的v排序的好处:这确实为在CoreData获取中实现它打开了一些途径。但我怀疑你是对的:在内存中运行会更快。