Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 找到最近点对的更快方法_Performance_Algorithm - Fatal编程技术网

Performance 找到最近点对的更快方法

Performance 找到最近点对的更快方法,performance,algorithm,Performance,Algorithm,我试图比较数组中的所有元素。我可以用嵌套循环来做,但这是一个非常低效的算法,我可以说这不是正确的方法。这就是我现在正在做的 根据下面的答案,我已经更改了此代码,并且正在扩展此问题 // Point from java.awt.Point; private static void findShortestDistance(Point[] pt) { ArrayList<Double> distance = new ArrayList<Double>(1000);

我试图比较数组中的所有元素。我可以用嵌套循环来做,但这是一个非常低效的算法,我可以说这不是正确的方法。这就是我现在正在做的

根据下面的答案,我已经更改了此代码,并且正在扩展此问题

// 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; }
  }

}
//来自java.awt.Point的点;
专用静态void findShortDistance(点[]pt){
ArrayList距离=新ArrayList(1000);

对于(int i=0;i初始化
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 */ }
  }
}
for(int i=0;i
(顺便说一句,更改了if语句,假设您打算使用
i
j
作为数组的索引。)


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

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

for(int i=0; i<pt.length; i++) {
  for(int j = i + 1; j<pt.length; j++) {
     /* do stuff */
  }
}
查看一下维基百科。

这个问题似乎和

用j=i+1开始第二个循环?需要什么样的比较?传递性?@MatthewVines否这是一个点数组(来自java.awt)。我正在运行距离公式,并将得到的距离放入一个列表中,这样我就可以找到给定点之间的最短距离。@Calwellysr-你能发布你的完整代码
/*做一些事情吗*/
?我不知道你想做什么。你的意思是你想要最小距离(pt[I],pt[j])?有一种使用分治的算法,O(nlogn)实际上我正在运行
pt[I]。distance(pt[j]);
来设置一个距离列表,这样我就可以找到给定点列表之间的最短距离。使用KD树可以更快地做到这一点:。对于二维点,它会将算法从O(n^2)减少到O(n*sqrt(n))啊…看来我的整个方法都错了哈哈!谢谢你提供的信息。我会接受这个答案,因为它回答了我原来问题背后的问题。很抱歉没有描述这个算法的细节。我记不太清楚。没关系,如果可能的话,我想找出实际的代码。我还在学习谢谢你的维基链接,这会很有帮助的。
for(int i=0; i<pt.length; i++) {
  for(int j=i+1; j<pt.length; j++) {
    if(pt[i] != pt[j]) { /* do stuff */ }
  }
}
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 */ }
  }
}