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