Java

时间:2015-08-29 21:30:57

标签: java algorithm

问题:

我的程序在读取非常大的输入文件时耗时太长,例如 n > 10000。 它实际上正确地输出了所有结果,但花了超过30分钟来计算最后的结果......

我无法找到我在哪里出错,因为Eclipse控制台没有提供错误消息,但我假设问题可能来自计算距离的方法,我不知道我可以做什么改进我的代码和我应该使用什么样的算法。

该计划的目的:

鉴于 n 以及每个商店在纬度和经度方面的位置,并报告最近的商店对和它们之间的距离。

我的计算距离代码:

    private static void calculateDistances(){
    for (int i = 0; i < noOfStores; i++) {
        double[] distances = new double[noOfStores];
        for (int j = 0; j < noOfStores; j++) {
            if (i == j) {
                distances[j] = Double.POSITIVE_INFINITY;
            } else {
                distances[j] = distance(cities[i].getLatitude(), cities[i].getLongitude(), cities[j].getLatitude(), cities[j].getLongitude(), 'K');
            }
        }
        int minDistanceCity = findMin(distances);
        cities[i].setNearestCity(cities[minDistanceCity].getName());
        cities[i].setMinimumDistance(distances[minDistanceCity]);
    }
}

private 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));
    if (dist > 1) {
        dist = 0;
        }
    else if (dist < -1) {
        dist = Math.PI;
        } else {
        dist = Math.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);
    }

1 个答案:

答案 0 :(得分:3)

您的嵌套循环将针对 n 2 迭代运行,因此每次输入大小加倍时,它会慢四倍。存在algorithm that uses only about n lg n operations

相关问题