2013-04-07 43 views
-1

此代碼取自一個常見的算法書籍。本書使用從1開始的數組,而不是從0開始m,但從p開始。我如何解決它?爲什麼我總是得到一個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

只是用'米替換'米[I]'(或類似)[I-1]'無處不在。 – 2013-04-07 17:48:27

+4

我喜歡這行'if(m [i] [j]> Integer.MAX_VALUE){' – SJuan76 2013-04-07 17:49:38

+0

@ SJuan76這是索引跳舞的地方。 – 2013-04-07 17:58:03

回答

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

有同樣的問題 – 2013-04-07 17:55:28

+0

我在最後一行有一個錯字。我不確定你的程序的正確輸出應該是什麼,但是通過上面的更改,至少會得到一個結果。 – Keppil 2013-04-07 17:57:10

+0

不,我改變了它,但仍然有相同的錯誤 – 2013-04-07 18:01:31

0

通過創建此數組:

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

您已經創建了一個多維數組,範圍期從:

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

還有n空間陣列中,但我們開始從0

與您的代碼的問題是你在你的for循環使用<=運營商,當它應該是一個<運營商。

+0

我曾嘗試過,但仍然有同樣的問題 – 2013-04-07 18:04:23

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

仍然有相同的錯誤 – 2013-04-07 18:03:25

0

您有一個從0到(n - 1)的數組,但您使用從1到n的索引來訪問它。因此,您不使用第一個元素,而是嘗試在最後一個元素之後訪問不存在的元素。

你可以看到的地方,它首先發生在錯誤信息(8號線)。代碼後面可能會有更多錯誤。

作爲一個經驗法則,總是使用從0到(n - 1)的索引,其中n是陣列的長度。然後你的循環從i = 0開始,並運行而我< n。一旦你開始添加或減去任何一個綁定的東西,它應該感覺不對(除非你不想訪問整個數組)。

+0

我知道,但我怎麼能解決它? – 2013-04-07 18:03:50

相關問題