簡體   English   中英

矩陣和數組索引超出范圍時出錯

[英]Error with matrices and array index out of bounds

因此,我需要實現此代碼,該代碼將從java中矩陣的乘法返回最佳的括號解決方案。 我制作了一個用於打印“(”“)”的函數,主要是為分辨率(動態編程)構造了矩陣M和S。 在打印第一個“(”)之后,我一直收到此錯誤:


Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
    at ProgramacaoDinamica.parenterizacao(ProgramacaoDinamica.java:13)
    at ProgramacaoDinamica.main(ProgramacaoDinamica.java:46)

碼:

public class ProgramacaoDinamica {
    private static int[][] s;

    public static void parenterizacao(int[][] s, int i, int j) {
        if (i == j) {
            System.out.println("M" + i);
        } else {
            System.out.println("(");
            parenterizacao(s, i, s[i][j]);
            parenterizacao(s, s[i][j] + 1, j);
            System.out.println(")");
        }
    }

    public static void main(String[] args) {

        int[] p = {15, 5, 10, 20, 25}; //VETOR P DO ENUNCIADO (alteracoes aqui!!!)

        int n = p.length - 1;


        int[][] m = new int[n][n];
        int[][] s = new int[n - 1][n - 1];

        for (int i = 0; i < n; i++) {
            m[i][i] = 0;
        }

        for (int l = 1; l < n; l++) {
            for (int i = 1; i <= l - n + 1; i++) {
                int j = i + l - 1;
                m[i][j] = 9999;
                for (int k = i; k <= j - 1; k++) {
                    int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
                    if (q < m[i][j]) {
                        m[i][j] = q;
                        s[i][j] = k;
                    }
                }
            }
        }
        parenterizacao(s, 1, n);
    }

}

有人可以幫我嗎? 我開始迷失了代碼? 我遵循此半代碼: java1 java2

簡短的答案是,您要創建一個3x3數組,然后嘗試訪問第二行中的第五個元素,該元素顯然不存在。

如代碼所示,您正在將偽代碼中s[0..n-1][0..n-2] s[1..n-1,2..n]映射s[1..n-1,2..n]中的s[0..n-1][0..n-2] ,例如偽代碼說s[1,2]您的Java使用s[0][0]但您並未在對parenterizacao(s,1,n)調用中減去1和2

您可能在某些地方混合使用索引將索引從零開始,而在其他地方則沒有映射,因此您應該使索引保持一致-要么像使用偽代碼一樣直接使用索引,然后使用未使用的元素使數組變大(例如而不是s[0..2][0..2]具有s[0..3][0..4] ),或者確保每次訪問數組時都映射索引。

下面,我修改了您的代碼,並保留了偽代碼中ijkln的原始值,但在每次數組訪問時都適當地減去了1或2:

public static void parenterizacao(int[][] s, int i, int j) {
    if (i == j) {
        System.out.println("M" + i);
    } else {
        System.out.println("(");
        parenterizacao(s, i, s[i-1][j-2]);
        parenterizacao(s, s[i-1][j-2] + 1, j);
        System.out.println(")");
    }
}

    for (int i = 1; i <= n; i++) {
        m[i-1][i-1] = 0;
    }

    for (int l = 2; l <= n; l++) {
        for (int i = 1; i <= n - l + 1; i++) {
            int j = i + l - 1;
            m[i-1][j-1] = 9999;
            for (int k = i; k <= j - 1; k++) {
                int q = m[i-1][k-1] + m[k][j-1] + p[i - 1] * p[k] * p[j];
                if (q < m[i-1][j-1]) {
                    m[i-1][j-1] = q;
                    s[i-1][j-2] = k;
                }
            }
        }
    }
    parenterizacao(s, 1, n);

(還需要在內循環中切換nl以匹配偽代碼)

問題是您的嵌套循環。

for (int l = 1; l < n; l++)
    for (int i = 1; i < l - n; i++)

在這里, n = 3並已綁定到l上,已經是3。然后,您將i = 3賦值,並嘗試通過遞增i達到2。

還有一件事,你應該放return; 遞歸函數中的某處。 否則,您將陷入無限循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM