2009-09-22 5 views
0

두 개체 간의 유사성을 나타내는 값을 계산하는 프로그램을 작성하고 있습니다. 비교는 교환 가능합니다 (so compare(a, b) == compare(b, a)).Java : 계산 결과를 캐시 하시겠습니까?

프로그램의 콘솔 출력은 모든 결과 행렬입니다. 그러나 행렬은 각 비교를 두 번 ((a, b)(b, a)) 가지므로 한 번 계산하면 시간을 절약하고 싶습니다. 이러한 결과를 캐시하는 가장 좋은 방법은 무엇입니까? 출력이 어떻게 생겼는지

거친 예 : - 매트릭스에서 당신이 정말로 결과를 캐싱 이미을 것 같은

a  b  c 
a 0  20  9001 

b 20  0  333 

c 9001 333  0 

답변

0

계산 하나 개의 삼각형, 그리고 다른 사람이 언급 한 것처럼

get(int x, int y) { 
    if (x > y) { return matrix[x][y] }; 
    return matrix[y][x]; 
+0

다른 사람들이 좋은 답변을했지만, 이것이 내가 필요한 전부였습니다. –

3

소리가 난다. 그냥 매트릭스 중 하나 "삼각형"을 계산하고 그에서 나머지를 입력 :

// Compute one triangle 
for (int i=0; i < size; i++) 
{ 
    for (int j=0; j <= i; j++) 
    { 
     matrix[i][j] = computeValue(i, j); 
    } 
} 

// Now mirror it 
for (int i = 0; i < size; i++) 
{ 
    for (int j = i + 1; j < size; j++) 
    { 
     matrix[i][j] = matrix[j][i]; 
    } 
} 
+1

또는 matrix [i] [j] = matrix [j] [i] = computeValue (i, j); – jprete

+0

@jprete : 네, 정말로. –

2

같은 액세스 기능을 당신은해야 삼각형의 한면을 계산하십시오. 복사하거나 공간을 할당하지 않으려 고합니다. x와 y 좌표를 하나의 인덱스로 변환하기 만하면 정사각형 매트릭스의 크기의 절반을 약간 넘는 배열을 가질 수 있습니다. 예를 들면 :

class SymmetricMatrix { 
    private final double[]; 

    /** 
    * @param size the size of one dimension of the matrix. eg: 3 for a 3x3 matrix. 
    */ 
    SymmetricMatrix(int size) { 
    matrix = new double[index(size) + 1]; 
    } 

    private index(int x, int y) { 
    if (x > y) { 
     int tmp = x; 
     x = y; 
     y = tmp; 
    } 
    // now x <= y 
    i = (y * y + y)/2 + x; 
    } 

    public double get(int x, int y) { 
    return matrix[index(x, y)]; 
    } 

    public void set(int x, int y, double value) { 
    matrix[index(x, y)] = value; 
    } 
} 

이 예는 두 배 값을 사용하지만 (당신이 객체를 사용하려는 경우, 그것은 일반적인 만들 심지어 나) 당신은 쉽게 그것을 조정할 수 있습니다.

이 그것을 채우려면 :

SymmetricMatrix matrix = new SymmetricMatrix(size); 
for (int y = 0; y < size; y++) { 
    for (int x = 0; x <= y; x++) { 
     matrix.set(x, y, /* value */); 
    } 
} 
0

당신은 compareToequals 같은 방법의 캐싱 결과 오히려 조심해야합니다.

N 개의 배열 인스턴스가있는 경우 잠재적으로 N^2 비교 결과를 캐시해야합니다. (물론 응용 프로그램에 따라 달라집니다 ...)

또한 응용 프로그램에서 많은 수의 (행렬) 인스턴스를 만들고 폐기하면 캐시에 많은 항목이 생겨 가비지 보존 문제가 발생할 수 있습니다. 약한 참조를 사용하여이를 완화 할 수 있지만 가비지 수집을 상당히 느리게 만듭니다.

이 작업을 수행하는 경우 먼저 compareToequals 메서드가 실제로 병목 현상인지 확인하기 위해 응용 프로그램 프로필을 작성해야합니다. 그렇다면 캐싱 이외의 방법을 사용하여 메서드 속도를 높이는 것이 좋습니다. 예 : 각 배열에 대해 느리게 계산 된 해시를 저장하면 equals의 속도가 빨라질 수 있습니다.