为什么我总是得到一个ArrayIndexOutOfBoundsException?

时间:2013-04-07 17:47:14

标签: java algorithm matrix-multiplication chain mmc

此代码取自常见的算法手册。本书使用从1开始的数组,而不是m的0,但从p的0开始。我该如何解决?

这些是错误:

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

}

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

通过创建此数组:

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

您创建了一个多维数组,其范围为:

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

数组中仍有n个空格,但我们从0开始。

您的代码存在的问题是您在for循环中使用<=运算符,而它应该是<运算符。

答案 2 :(得分: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

答案 3 :(得分:0)

你有一个从0到(n - 1)的数组,但你使用从1到n的索引来访问它。因此,您不使用第一个元素,而是尝试在最后一个元素之后访问不存在的元素。

您可以在错误消息中找到它首先出现的位置(第8行)。稍后可能会在代码中出现进一步的错误。

根据经验,始终使用从0到(n - 1)的索引,其中n是数组的长度。然后你的循环从i = 0开始并在i&lt; ñ。一旦你开始在任何一个边界中添加或减去某些东西,它应该感觉不对(除非你不想访问整个数组)。