Update MatrixChainMultiplication.java

This commit is contained in:
Libin Yang
2018-12-21 09:51:26 +08:00
committed by GitHub
parent 2da7d89123
commit 3183957ec7

View File

@ -1,7 +1,8 @@
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner; import java.util.Scanner;
public class MatrixChainMultiplicationTest { public class MatrixChainMultiplication {
private static Scanner scan = new Scanner(System.in); private static Scanner scan = new Scanner(System.in);
private static ArrayList<Matrix> mArray = new ArrayList<>(); private static ArrayList<Matrix> mArray = new ArrayList<>();
private static int size; private static int size;
@ -11,17 +12,17 @@ public class MatrixChainMultiplicationTest {
public static void main(String[] args) { public static void main(String[] args) {
int count = 1; int count = 1;
while(true) { while (true) {
String [] mSize = input("input size of matrix A("+count+") ( ex. 10 20 ) : "); String[] mSize = input("input size of matrix A(" + count + ") ( ex. 10 20 ) : ");
int col = Integer.parseInt(mSize[0]); int col = Integer.parseInt(mSize[0]);
if (col==0) break; if (col == 0) break;
int row = Integer.parseInt(mSize[1]); int row = Integer.parseInt(mSize[1]);
Matrix matrix = new Matrix(count, col, row); Matrix matrix = new Matrix(count, col, row);
mArray.add(matrix); mArray.add(matrix);
count++; count++;
} }
for(Matrix m : mArray) { for (Matrix m : mArray) {
System.out.format("A(%d) = %2d x %2d\n", m.count(), m.col(), m.row()); System.out.format("A(%d) = %2d x %2d\n", m.count(), m.col(), m.row());
} }
@ -30,35 +31,36 @@ public class MatrixChainMultiplicationTest {
s = new int[size + 1][size + 1]; s = new int[size + 1][size + 1];
p = new int[size + 1]; p = new int[size + 1];
for (int i=0; i<size+1; i++) { for (int i = 0; i < size + 1; i++) {
for (int j=0; j<size+1; j++) { Arrays.fill(m[i], -1);
m[i][j] = -1; Arrays.fill(s[i], -1);
s[i][j] = -1;
}
} }
for (int i=0; i<p.length; i++) { for (int i = 0; i < p.length; i++) {
if (i == 0) { p[i] = i == 0 ? mArray.get(i).col() : mArray.get(i - 1).row();
p[i] = mArray.get(i).col();
} else {
p[i] = mArray.get(i-1).row();
}
} }
matrixChainOrder(); matrixChainOrder();
for(int i=0; i<size; i++) { System.out.print("-------"); } for (int i = 0; i < size; i++) {
System.out.print("-------");
}
System.out.println(); System.out.println();
printArray(m); printArray(m);
for(int i=0; i<size; i++) { System.out.print("-------"); } for (int i = 0; i < size; i++) {
System.out.print("-------");
}
System.out.println(); System.out.println();
printArray(s); printArray(s);
for(int i=0; i<size; i++) { System.out.print("-------"); } for (int i = 0; i < size; i++) {
System.out.print("-------");
}
System.out.println(); System.out.println();
System.out.println("Optimal solution : "+ m[1][size]); System.out.println("Optimal solution : " + m[1][size]);
System.out.print("Optimal parens : "); System.out.print("Optimal parens : ");
printOptimalParens(1, size); printOptimalParens(1, size);
} }
private static void printOptimalParens(int i, int j) { private static void printOptimalParens(int i, int j) {
if (i == j) { if (i == j) {
System.out.print("A" + i); System.out.print("A" + i);
@ -69,9 +71,10 @@ public class MatrixChainMultiplicationTest {
System.out.print(")"); System.out.print(")");
} }
} }
private static void printArray(int[][] array) { private static void printArray(int[][] array) {
for (int i = 1; i < size+1; i++) { for (int i = 1; i < size + 1; i++) {
for (int j = 1; j < size+1; j++) { for (int j = 1; j < size + 1; j++) {
System.out.print(String.format("%7d", array[i][j])); System.out.print(String.format("%7d", array[i][j]));
} }
System.out.println(); System.out.println();
@ -79,17 +82,17 @@ public class MatrixChainMultiplicationTest {
} }
private static void matrixChainOrder() { private static void matrixChainOrder() {
for (int i = 1; i<size+1; i++) { for (int i = 1; i < size + 1; i++) {
m[i][i] = 0; m[i][i] = 0;
} }
for (int l = 2; l <size+1; l++) { for (int l = 2; l < size + 1; l++) {
for (int i = 1; i<size-l+2; i++) { for (int i = 1; i < size - l + 2; i++) {
int j = i+l-1; int j = i + l - 1;
m[i][j] = Integer.MAX_VALUE; m[i][j] = Integer.MAX_VALUE;
for (int k = i; k < j; k++) { for (int k = i; k < j; k++) {
int q = m[i][k] + m[k+1][j] + p[i-1] * p[k] * p[j]; int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (q < m[i][j]) { if (q < m[i][j]) {
m[i][j] = q; m[i][j] = q;
s[i][j] = k; s[i][j] = k;
@ -101,20 +104,31 @@ public class MatrixChainMultiplicationTest {
private static String[] input(String string) { private static String[] input(String string) {
System.out.print(string); System.out.print(string);
return (scan.nextLine().split(" ") ); return (scan.nextLine().split(" "));
} }
} }
class Matrix { class Matrix {
private int count; private int count;
private int col; private int col;
private int row; private int row;
public Matrix(int count, int col, int row) {
Matrix(int count, int col, int row) {
this.count = count; this.count = count;
this.col = col; this.col = col;
this.row = row; this.row = row;
} }
public int count() { return this.count; }
public int col() { return this.col; } int count() {
public int row() { return this.row; } return count;
}
int col() {
return col;
}
int row() {
return row;
}
} }