题
听起来好像我有这个概念,但不能似乎得到执行正确的。 EI具有多个点的簇(一个ArrayList),并且我想要计算平均距离。例如:在群集点(A,B,C,d,E,F,...,n)时,距离AB,AC的距离,距离AD,...的距离A,N,距离(B,C)的距离( B,d)...距离(B,N)...
预先感谢。
解决方案
您不想重复计算任何部分,所以你的算法应该是循环双。外环从前进到M(你不需要检查N,因为在那里我有什么留给它来连接),每次循环从curPoint N,那么计算每个距离。您可以通过点(N-1)^ 2/2号添加所有的距离和鸿沟。应该是相当简单的。
有没有关于改进这一点,我所知道的任何标准算法,这是不是一个被广泛研究的问题。我猜想,你可以通过采样每个点的距离,以他人的少数得到相当合理的估计(如果估计是有用的)。但是,这是一个猜测。
下面是另一次尝试(看到你的代码示例后):
public double avgDistanceInCluster() { double totDistance = 0.0; for (int i = 0; i < bigCluster.length - 1; i++) { for (int j = i+1; j < bigCluster.length; j++) { totDistance += distance(bigCluster[i], bigCluster[j]); } } return totDistance / (bigCluster.length * (bigCluster.length - 1)) / 2; }
注意,对于第一次循环的限制是不同的。
两点之间的距离可能是sqrt((x1 - x2)^2 + (y1 -y2)^2)
。
其他提示
感谢所有帮助,有时解释在论坛上回答问题后,只弹出你的头脑。这是我最后做。
我点的集群,并且我需要计算的点(双)集群中的平均距离。所以,这就是我所做的。我相信有人会拿出一个更好的答案如果是的话请给一个音符。提前致谢。
/**
* Calculate avg distance between points in cluster
* @return
*/
public double avgDistanceInCluster() {
double avgDistance = 0.0;
Stack<Double> holder = new Stack<Double>();
for (int i = 0; i < cluster.size(); i++) {
System.out.println(cluster.get(i));
for (int j = i+1; j < cluster.size(); j++) {
avgDistance = (cluster.get(i) + cluster.get(j))/2;
holder.push(avgDistance);
}
}
Iterator<Double> iter = holder.iterator();
double avgClusterDist = 0;
while (iter.hasNext()) {
avgClusterDist =+ holder.pop();
System.out.println(avgClusterDist);
}
return avgClusterDist/cluster.size();
}
不隶属于 StackOverflow