【发布时间】:2010-10-31 18:39:08
【问题描述】:
我现在有一些代码在做这个。它适用于中小型列表,但是当我有一个大小为 n > 5000 的列表时,我的算法在移动设备上可能需要将近 1 分钟才能运行。我基本上是将 Java 中的 Coordinate 对象与 Coordinate 对象的列表(向量)进行比较。
这是我的基本算法:
- 遍历列表nx中的每个元素
- 如果“10 个最接近”列表中的项目少于 10 个,则将 nx 添加到列表中 并转到下一个元素
- 如果“10 最接近”列表已经有 10 个项目,则计算 nx 与底座之间的距离 坐标
- 如果距离小于“10 个最近距离”中的最远距离 列表”,然后删除最远的项目 从该列表中并用 nx 替换它
我一直在关注这一点,并试图找到一种更有效的方法。这有点像排序算法问题,所以一定有更好的方法。
这是我的距离计算方法:
public static double distance(double lat1, double lon1, double lat2, double lon2, char unit) {
double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
dist = acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
if (unit == 'K') {
dist = dist * 1.609344;
} else if (unit == 'N') {
dist = dist * 0.8684;
}
return (dist);
}
【问题讨论】:
-
您如何比较距离,如果您计算实际距离,请告诉我们如何。这里的一些简化(比如避免计算平方根)可以为您节省大量的执行时间。下一步可能是使用优先级队列而不是 10 个元素的向量,但 10 是一个很小的数字,所以队列的优势可能很小
-
@Steve C - 如果您的算法实现正确,即使 N = 100000,它也应该可以快速运行。
-
您有使用
Vector的特定理由吗?最好使用ArrayList。 -
@Petar Minchev 请注意,这是在嵌入式设备上,它可能比 PC 慢得多。
-
@starblue 我错过了,谢谢:) 我发布的答案只是原则上。如果
NlogN不适合他,他当然必须使用其他算法。
标签: java algorithm math gps coordinates