2013-04-07 69 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

相关问题