我现在有一些代码。它可以处理小到中等大小的列表,但是当列表的大小n > 5000时,我的算法在移动设备上运行几乎需要1分钟。基本上,我正在将Java中的Coordinate对象与Coordinate对象的列表(Vector)进行比较。
以下是我的基本算法:
- 遍历列表nx中的每个元素 - 如果“10个最接近”的列表中少于10个项目,则将nx添加到该列表中并继续下一个元素 - 如果“10个最接近”的列表已经有10个项目,则计算nx和基本坐标之间的距离 - 如果距离小于“10个最接近列表”中最远的距离,则从该列表中删除最远的项目并用nx替换它
我一直在看这个问题,并试图找到更有效的方法。这有点像排序算法问题,因此必须有更好的方法。
以下是我的距离计算方法:
以下是我的基本算法:
- 遍历列表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);
}