更快找到最近点的方法

时间:2012-03-05 16:56:38

标签: performance algorithm

我正在尝试将数组的所有元素相互比较。我可以用嵌套循环来做到这一点,但这是一个非常低效的算法,我可以告诉它不是正确的方法。这就是我现在正在做的事情。

下面的PER答案我已经改变了这段代码,我正在扩展这个问题。

// Point from java.awt.Point;
private static void findShortestDistance(Point[] pt) {

  ArrayList<Double> distance = new ArrayList<Double>(1000);    

  for(int i=0; i<pt.length; i++) {
    for(int j=i+1; j<pt.length; j++) {
      double tmp = pt[i].distance(pt[j]);
      distance.add(tmp);        
    }
  }

  double min = distance.get(0);
  for(Double d : distance) {
    if(d < min) { min = d; }
  }

}

到目前为止,我已经有了完整的代码。我试图找到给定数组中两点之间的最短距离。

5 个答案:

答案 0 :(得分:3)

答案 1 :(得分:0)

j初始化为i+1将跳过冗余比较。

for(int i = 0; i < pt.length; i++) {
  for(int j = i + 1; j < pt.length; j++) {
    if(pt[i] != pt[j]) { /* do stuff */ }
  }
}

(顺便说一句,更改了if语句,假设您打算使用ij作为数组的索引。)

对于最基本的情况,你需要获得数组与自身的交叉乘积,减去所有元素{x, y} | x == y,这是最好的。 (即无序元素的无序对的详尽列表。)如果您需要有序的不同元素对,那么您的代码是最好的。

答案 2 :(得分:0)

只要您说上面的代码正是您想要的,以下将是您想要的实现:

for(int i=0; i<pt.length; i++) {
  for(int j = i + 1; j<pt.length; j++) {
     /* do stuff */
  }
}

但是,我觉得你真的有兴趣比较数组值,或者我错了吗?

答案 3 :(得分:0)

for(int i=0; i<pt.length; i++) {
  for(int j=i+1; j<pt.length; j++) {
    if(pt[i] != pt[j]) { /* do stuff */ }
  }
}

答案 4 :(得分:0)

for(int i=0; i<pt.length; i++) {
  for(int j=i; j--; ) {
     { /* do stuff */ }
  }
}

而且,为了完整性:

for(int i=pt.length; i--; ) {
  for(int j=i; j--; ) {
     { /* do stuff */ }
  }
}