2009-10-31 4 views
1

나는 개념을 갖고 있지만 들리지는 않지만 구현이 올바르다 고 생각됩니다. 여러 점이있는 클러스터 (ArrayList)가 있고 평균 거리를 계산하고 싶습니다. 예 : 클러스터 (A, B, C, D, E, F, ..., n), 거리 AB, 거리 AC, 거리 AD, ... 거리 A, N, 거리 (B, C) B, D) ... 거리 (B, N) ...클러스터의 평균 포인트 간 거리

미리 감사드립니다.

+2

매우 직설적입니다. 당신은 명백한 순서 N^2 알고리즘 이외의 것을 찾고 있습니까? –

답변

2

세그먼트를 두 번 집계하지 않으므로 알고리즘은 for 루프에 대해 이중이어야합니다. 바깥 쪽 루프는 A에서 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)입니다.

+0

예 이것은 아이디어가 내 마음에 왔지만 외부 루프 및 내부에서 조건을 설정하는 방법을 실제로 파악하지 못했던 것입니다. public double avgDistanceInCluster() { double avgDistance = 0.0; (int j = i + 1; j! = bigCluster [i]; j ++) { avgDistance = bigCluster [i] + bigCluster [j]에 대한 (int i = 0; i

+0

죄송합니다. 각 줄에 4 개의 공백을 추가했지만 서식이 작동하지 않았습니다. –

0

모든 도움을 주셔서 감사합니다. 때로는 포럼에 질문을 올리신 후 가끔씩 마음에 들려주세요. 이것이 내가 결국하는 일입니다.

나는 클러스터의 포인트를 가지고 있으며, 클러스터의 포인트 (쌍)의 평균 거리를 계산해야합니다. 그래서, 이것은 내가 한 일입니다. 나는 누군가가 더 좋은 대답을 할 것이라고 확신한다. 미리 감사드립니다.

/** 
* 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(); 
} 
+0

bigCluster는 ArrayList입니다. 미안합니다. 정의하기를 잊어 버렸습니다. 이것은 빌드하려는 코드의 일부일뿐입니다. –

+0

My (편집 된 버전) 예제는 첫 번째 for 루프에서 다른 테스트를 수행하고 거리와 평균을 다르게 계산합니다. 각 쌍의 점 사이에 거리를두고 모든 거리를 더하고 점 쌍의 수로 나눕니다. – PanCrit

관련 문제