1

我正在寻找一种快速访问一些缓冲数据的解决方案:

我有一堆(假设最多 200 个)缓存的位置信息,包括纬度和经度以及一些附加信息。现在我想(非常频繁地)比较我当前的位置并从这个缓存列表中找到最接近当前位置的位置。对所有缓存位置进行距离计算以找到最近的位置是消耗资源的事情,我希望避免这样做。

此外,还需要有可能将新位置添加到缓存列表并删除旧位置 - 但这是一件容易的事情,因为它不是时间关键的,而且很少做。

那么有什么想法吗?如何尽可能高效地评估缓存位置列表中最近的位置?

谢谢!

4

4 回答 4

1

如果您想避免使用SQLiteDB,我认为您可以这样做的唯一方法是将您的位置保存到文件 ( text file/xml file) 中,并在访问您的应用程序时将此文件解析为内存中的结构,如List/ArrayList.

您必须在每次访问您的应用程序时检查此结构是否为空,如果为空,则再次对其进行解析。

于 2013-05-16T07:05:45.100 回答
1

我真的认为您应该为此使用 SQLite,尤其是在性能对您很重要的情况下。它不必很复杂,您只需要一个带有标记的简单表格

CREATE TABLE markers(_id INTEGER PRIMARY KEY, lat REAL, lon REAL);

先填表

BEGIN TRANSACTION;
INSERT INTO markers VALUES (NULL,lat1,lon2);
....
INSERT INTO markers VALUES (NULL,lat200,lon200);
COMMIT;

然后一个简单的查询将完成工作以找到最接近位置 (x,y) 的标记

SELECT * FROM markers ORDER BY (x-lat)*(x-lat)+(y-lon)*(y-lon) LIMIT 1;

您不需要平方根,ORDER BY因为 sqrt 是一个单调的函数。

于 2013-05-16T07:47:25.477 回答
0

创建文件并访问它与 SQL 相同,差异如此之小以至于无关紧要,因为它们都在访问“硬盘”(在 Mobile 中,存储空间),因此延迟相同。

我喜欢 SQLite 数据库的想法,因为您可以使用一条语句检查整个表以获得正确的答案(您只需正确构造语句)。请记住,SQL 是一种极其智能和高效的数据库存储类型,从“磁盘”(表)缓存的数据会一直缓存,直到需要空间为止。

但是,如果您愿意,您可以读取该表一次,将其放入内存(一些全局可访问的变量),然后从那里继续。

PS:我想说重新考虑 SQLite DB 并为您的应用程序做一些测试时间并查看结果。让我知道发生了什么,我很感兴趣。

于 2013-05-16T07:53:01.760 回答
0

如果您不想使用数据库,请考虑使用某种形式的二进制空间分区树将数据存储在内存中。如果您只对 2D 空间感兴趣,那么Quadtree就可以了。与简单的线性搜索相比,这可以显着降低搜索的复杂性,并且可以很好地处理人口稀少的区域(例如,如果很多点聚集在特定区域,彼此相距很远)。

还有其他 BSP 树可能更有效,但通常更难实现和调试。您可能希望找到一个库来省去从头开始编写数据结构的麻烦。

于 2013-05-17T13:58:56.377 回答