计算二维数组中两个值之间的最大欧几里得距离

时间:2019-01-25 00:19:32

标签: java arrays multidimensional-array

我正在尝试计算2d数组中2个值之间的欧式距离。我需要最大的存储空间,因此我有2个for循环遍历数组,并且我还有一个maxDistance变量来存储比较时的最大距离。

我的代码如下

  //Returns the largest Euclidean distance between any two cities 
 within the cities array
 public static double furthestDistance(int[][] x)
 {
int power;
double sum = 0.0;
int distance = 0;
int maxDistance = 0;
for (int i = 0; i < x.length; i++)
{
  for(int j = 0; j<x[0].length; j++) 
  {
     sum = (x[i][j] - x[i][i+1]) + (x[i][j] - x[i][j+1]);

    power = (int) Math.pow(sum, 2);
    distance = (int)Math.sqrt(power);                     

    if (distance > maxDistance) 
    {
      maxDistance = distance;
    }



  }
}
return Math.sqrt(sum);
}

我遇到了问题,并收到一条错误消息,指出我的arrayIndex超出范围,但是我不确定遍历数组以找到2d数组中任何两个值之间的最大距离(大约10英寸)的最简单方法x,y坐标”

x是一个看起来像这样的城市

int[][] cities0 = {{22,-45},{-20,-43},{-45,29},{41,35},{21,4}, 
{23,-37},{16,-19},{-44,-10},{26,15},{6,-30},{2,35},{6,-19}}; 

我不确定我是否能够正确计算距离,甚至无法正确计算距离?

2 个答案:

答案 0 :(得分:1)

欧几里德距离是

public static double calculateDistance(int[] array1, int[] array2)
    {
        double Sum = 0.0;
        for(int i=0;i<array1.length;i++) {
           Sum = Sum + Math.pow((array1[i]-array2[i]),2.0);
        }
        return Math.sqrt(Sum);
    }

现在,问题是您有了一个点数组,每个点都由一个两个元素的数组表示。索引越界错误源于您拥有

sum = (x[i][j] - x[i][i+1]) + (x[i][j] - x[i][j+1]);

假设存在下一个i和下一个j,并且还假设x的第i个元素至少具有i + 2个元素,如果i> 0则会崩溃。使用我在回答开始时描述的方法,您的解决方案将如下所示:

double maxDistance = -1;
int firstPoint = -1;
int secondPoint = -1;
//notice that the limit is x.length - 1, because we will compare the penultimate
//item with the last
for (int i = 0; i < x.length - 1; i++) {
    for (int j = i + 1; j < x.length; j ++) {
        double d = calculateDistance(x[i], x[j]);
        if (d > maxDistance) {
            maxDistance = d;
            firstPoint = i;
            secondPoint = j;
        }
    }
}

答案 1 :(得分:0)

您的欧几里德距离计算在初始代码中是错误的。

此外,语句x[i][i+1]也是有问题的,因为您将元组作为数据点,并且每个元组都位于不同的行中,这意味着 数组中的元素可以通过x[i][0]x[i][1]访问,第二个括号中的任何大于1的值都将导致IndexOutOfBounds错误。 修改代码的内部循环可以为您提供帮助:

for(int j = i + 1; j<x.length; j++) 
{
    sum = Math.pow((x[i][0] - x[j][0]), 2) + Math.pow((x[i][1] - x[j][1]), 2);
    distance = Math.sqrt(sum);                     
    System.out.println(distance);
    if (distance > maxDistance) 
    {
        maxDistance = distance;
    }
}

因为我们有元组作为坐标,所以x[i][0] - x[j][0]表示两点的x坐标之差,x[i][1] - x[j][1]表示y坐标的差。使用该表示法,我们计算出欧几里得距离。剩下的就是您之前写的内容。另外,将变量更改为double而不是int可以更精确地计算! 注意:此示例是针对您在问题中提供的输入进行硬编码的,您可能需要对其进行修改才能与其他数组配合使用。