从大量积分中有效搜索

时间:2012-09-21 20:07:42

标签: java android graph

我收集了一堆gps点,现在我需要用18000分来匹配这些积分。我有两个arraylists。有更好的搜索方式吗?我在Java中执行此操作。

以下是大量数据的示例。它们还包含一个附加参数ID1,通过它可以对一组点进行分组。

ID1     ID2     ID3      longi          lati,
2   1   1   -79.911635  39.609849,
2   1   2   -79.91151   39.60956,
2   1   3   -79.9115    39.609489,
2   1   4   -79.911496  39.609433,
3   1   1   -79.908162  39.609841,
3   1   2   -79.908447  39.610019,
4   1   1   -79.911136  39.608433,
4   1   2   -79.910961  39.608446,
4   1   3   -79.910629  39.608451,
4   1   4   -79.910064  39.608493,
4   1   5   -79.909117  39.608586,

2 个答案:

答案 0 :(得分:1)

如果您正在寻找完全匹配,那么您可以将点放在一个集合中(HashSet和TreeSet都可以),并找到交叉点:set1.intersect(set2)。您必须相应地实现compare()或hashcode(),并且在任何情况下都必须等于(),但这很容易。

如果您正在寻找“比X更近”,则应使用quadtree。将第一个arraylist中的所有节点放在四叉树中,然后使用此数据结构执行快速查找(每次查找可以产生O(log N)中最接近的点,而不是每次查找蛮力方法时的O(N) )。有一个四叉树的开源实现,例如,geotools

答案 1 :(得分:1)

您还可以使用称为RTREE的空间索引。它通常比quadtree快。

例如,本文发现它在Oracle数据库中的速度提高了2-3倍:http://pdf.aminer.org/000/300/406/incorporating_updates_in_domain_indexes_experiences_with_oracle_spatial_r.pdf

Java拓扑套件(JTS)包含rtree的良好实现:http://www.vividsolutions.com/jts/javadoc/com/vividsolutions/jts/index/strtree/STRtree.html

请注意GeoTools基于JTS,因此潜在的rtree潜伏在其空间索引功能中:http://docs.geotools.org/latest/userguide/library/main/collection.html