我收集了一堆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,
答案 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