Java:通过递归的方阵乘法

时间:2014-06-03 00:56:55

标签: java algorithm recursion matrix

我需要编写一个递归方法,将2个平方矩阵(大小为n-by-n)相乘。 它需要在θ(N ^ 3)时间内运行,但它不是Strassen的算法。 我已经编写了一个方法但是我得到了堆栈溢出。

Matrix A is       Matrix B is
1 2 1 0           3 2 3 0
2 3 2 0           2 1 2 0
1 2 1 0           3 2 3 0

两个矩阵都是int [] []。这是我写的代码:

public int[][] ncubed(int [][]A, int [][]B){
    int w = A.length;
    int [][] C = new int[w][w];
    if (w==1){ 
        C[0][0] = A[0][0] * B[0][0];
    }
    else{
    int [][]A1 = partition(1,A);
    int [][]A2 = partition(2,A);
    int [][]A3 = partition(3,A);
    int [][]A4 = partition(4,A);
    int [][]B1 = partition(1,B);
    int [][]B2 = partition(2,B);
    int [][]B3 = partition(3,B);
    int [][]B4 = partition(4,B);
    int [][]C1 = partition(1,C);
    int [][]C2 = partition(2,C);
    int [][]C3 = partition(3,C);
    int [][]C4 = partition(4,C);

    C1 = add(ncubed(A1,B1),ncubed(A2,B3));
    C2 = add(ncubed(A1,B2),ncubed(A2,B4));
    C3 = add(ncubed(A3,B1),ncubed(A4,B3));
    C4 = add(ncubed(A3,B2),ncubed(A4,B4));

    join(C1, C, 0 , 0);
    join(C2, C, w/2 , 0);
    join(C3, C, 0, w/2);
    join(C4, C, w/2, w/2);

    }
    return C;
}

public int [][] partition(int quadrant, int[][] array){
    int n = array.length;
    int[][] Q = new int[array.length][array.length];
    if(quadrant>4 || quadrant<1) return null;
    switch(quadrant){
    case(1): 
        for(int i = 0; i<(n/2); i++){
            for(int j = 0; j<(n/2); j++){
                Q[i][j] = array[i][j];
            }
        }
        break;
    case(2):
        for(int i = n/2; i<n; i++){
            for(int j = 0; j<(n/2); j++){
                Q[i][j] = array[i][j];
            }
        }
        break;
    case(3):
        for(int i = 0; i<(n/2); i++){
            for(int j = (n/2); j<n; j++){
                Q[i][j] = array[i][j];
            }
        }
        break;
    case(4):
        for(int i = (n/2); i<n; i++){
            for(int j = (n/2); j<n; j++){
                Q[i][j] = array[i][j];
            }
        }
        break;
    }
    return Q;
}

这些方法添加和加入工作正常,因为我已对它们进行了测试,因此它不属于该部分。 我只是无法在实际的ncubed方法中找出问题(矩阵乘法)。 如果有人能够帮助我理解我做错的事情,或者告诉我另一种方法来做到这一点,那么这将是很棒的。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

天真的方法会给你theta(n ^ 3)时间 - 你签出了something simpler吗?

如果做不到,你看过these similar个问题吗?