2013-04-07 5 views
-1

이 코드는 일반적인 알고리즘 책에서 가져온 것입니다. 이 책은 m에 대해 0 대신 1 대신에 대해 0부터 시작하는 배열을 사용합니다. 나는 그것을 어떻게 해결합니까 ?? ArrayIndexOutOfBoundsException이 항상 표시되는 이유는 무엇입니까?

는 오류입니다 :

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 
at MMC_Test.MemoizedMatrixChain(MMC_Test.java:8) 
at MMC_Test.main(MMC_Test.java:36) 

여기에 코드

public class MMC_Test { 

public static int MemoizedMatrixChain(int[] p) { 
    int n = p.length - 1; 
    int[][] m = new int[n][n]; 
    for (int i = 1; i <= n; i++) { 
     for (int j = i; j <= n; j++) { 
      m[i][j] = Integer.MAX_VALUE; 
     } 
    } 
    return lookUpChain(m, p, 1, n); 
}// MemoizedMatrixChain 

public static int lookUpChain(int[][] m, int[] p, int i, int j) { 
    if (m[i][j] > Integer.MAX_VALUE) { 
     return m[i][j]; 
    } 
    if (i == j) { 
     m[i][j] = 0; 
    } else { 
     for (int k = i; k <= j - 1; k++) { 
      int q = lookUpChain(m, p, i, k) 
        + lookUpChain(m, p, k + 1, j) 
        + p[i - 1] * p[k] * p[j]; 
      if (q < m[i][j]) { 
       m[i][j] = q; 
      } 
     } 
    } 
    return m[i][j]; 
} 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    int[] arr = { 30, 35, 15, 5, 10, 20, 25 }; 
    int result = MemoizedMatrixChain(arr); 
    System.out.println(result); 

}// main 

}

+0

'm [i]'(또는 유사)를 어디에서나'm [i-1]'로 대체하십시오. –

+4

나는이 라인을 좋아한다. if (m [i] [j]> Integer.MAX_VALUE) {' – SJuan76

+0

@ SJuan76 인덱스가 춤을 추는 곳이다. –

답변

3

변경

for (int i = 1; i <= n; i++) { 
    for (int j = i; j <= n; j++) { 

for (int i = 0; i < n; i++) { 
    for (int j = i; j < n; j++) { 

과에 내가 제대로 코드를 분석하지 않은,하지만 추측은

return lookUpChain(m, p, 1, n); 

이 배열 작성하여

return lookUpChain(m, p, 1, n - 1); 
+0

에 동일한 문제가 있습니다 –

+0

마지막 줄에 오타가 있습니다. 나는 당신의 프로그램을위한 올바른 결과가 무엇인지 잘 모르겠다. 그러나 위의 변화로 결과는 적어도 나온다. – Keppil

+0

아니, 나는 그것을 변경했지만 여전히 동일한 오류가 –

0

을해야한다는 것입니다 :

int[][] m = new int[n][n]; 

범위를 벗어난 다차원 배열을 만들었습니다. s의 :

m[0][0] => m[n-1][n-1] 

이 배열의 n 공간이 여전히 있지만 루프에 대한 당신의 코드 문제는 당신이 때해야하는 <= 연산자를 사용하고 있습니다 0

에서 우리가 시작 < 연산자입니다.

+0

나는 그것을 시험해 보았지만 여전히 같은 문제가있다 –

0

인덱스는 항상 n-1까지이어야합니다.

public static int MemoizedMatrixChain(int[] p) { 
    int n = p.length - 1; 
    int[][] m = new int[n][n]; 
    for (int i = 1; i < n; i++) { //change here 
     for (int j = i; j < n; j++) { //change here 
      m[i][j] = Integer.MAX_VALUE; 
     } 
    } 
    return lookUpChain(m, p, 1, n); 
}// MemoizedMatrixChain 
+0

는 여전히 동일한 오류가있다. –

0

0에서 (n - 1)까지의 배열이 있지만 1부터 n까지의 인덱스를 사용하면 액세스 할 수 있습니다. 따라서 첫 번째 요소를 사용하지 않고 마지막 요소가 아닌 요소에 액세스하려고합니다.

오류 메시지 (8 행)에서 처음 발생한 위치를 볼 수 있습니다. 나중에 코드에 오류가있을 수 있습니다.

일반적으로 인덱스는 항상 0부터 (n - 1)까지의 인덱스를 사용합니다. 여기서 n은 배열의 길이입니다. 그런 다음 루프는 i = 0에서 시작하여 i < n 동안 실행됩니다. 바운드에서 무언가를 더하거나 빼기 시작하자 마자 배열 전체에 액세스하고 싶지 않다면 잘못된 생각을해야합니다.

+0

나는 그것을 알고 있지만 어떻게 해결할 수 있는가? –

관련 문제