Java機試題*: 矩陣乘法計算量估算(使用FILO佇列進行運算)
阿新 • • 發佈:2022-01-14
描述
矩陣乘法的運算量與矩陣乘法的順序強相關。
例如:
A是一個50×10的矩陣,B是10×20的矩陣,C是20×5的矩陣
計算A*B*C有兩種順序:((AB)C)或者(A(BC)),前者需要計算15000次乘法,後者只需要3500次。
編寫程式計算不同的計算順序需要進行的乘法次數。 本題含有多組樣例輸入! 資料範圍:資料組數:,矩陣個數:,行列數: 進階:時間複雜度:,空間複雜度:輸入描述:
輸入多行,先輸入要計算乘法的矩陣個數n,每個矩陣的行數,列數,總共2n的數,最後輸入要計算的法則
計算的法則為一個字串,僅由左右括號和大寫字母('A'~'Z')組成,保證括號是匹配的且輸入合法!
輸出描述:
輸出需要進行的乘法次數
import java.util.ArrayList; import java.util.Deque; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Scanner; import java.util.stream.Collector; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { Scanner sc= new Scanner(System.in); // 獲取矩陣相關資訊 while (sc.hasNextInt()) { int matrixNum = sc.nextInt(); char matrixName = 'A'; List<Matrix> matrixs = new ArrayList<Matrix>(); for (int i = 0; i < matrixNum; i++) { Matrix matrix= new Matrix(); matrix.setName(String.valueOf(matrixName)); matrix.setRow(sc.nextInt()); matrix.setCol(sc.nextInt()); matrixs.add(matrix); matrixName++; } // 使用Deque佇列做一個先進後出計算,並生成計算後的矩陣到matrixs String cal = sc.next(); Deque<String> queueMatrix = new LinkedList<String>(); // 乘法次數 int multiplication = 0; for (int i = 0; i < cal.length(); i++) { if(cal.charAt(i) == ')') { List<String> matrixNames = new ArrayList<String>(); // 彈出兩個矩陣 matrixNames.add(queueMatrix.pollLast()); matrixNames.add(queueMatrix.pollLast()); // 彈出左括號 queueMatrix.pollLast(); // 獲取要計算的兩個矩陣 List<Matrix> matrixCal = matrixs.stream().filter(o->matrixNames.contains(o.getName())).collect(Collectors.toList()); Matrix matrix1 = matrixCal.get(0); int row1 = matrix1.getRow(); int col1 = matrix1.getCol(); String name1 = matrix1.getName(); Matrix matrix2 = matrixCal.get(1); int row2 = matrix2.getRow(); int col2 = matrix2.getCol(); String name2 = matrix2.getName(); // 兩個矩陣可以相乘的條件是一個矩陣的列等於一個矩陣的行 // 兩個矩陣乘法的次數 = 不相等的行數 * 不相等的列數 * 相等的行列數 if(col1 == row2) { multiplication += row1 * col1 * col2; // 若佇列中還有元素則,將計算的新佇列構建到矩陣集合以及FILO佇列中 if(!queueMatrix.isEmpty()) { Matrix temp = new Matrix(); temp.setRow(row1); temp.setCol(col2); temp.setName(name1 + name2); queueMatrix.add(name1 + name2); matrixs.add(temp); } } else { multiplication += row1 * col1 * row2; if(!queueMatrix.isEmpty()) { Matrix temp = new Matrix(); temp.setRow(row2); temp.setCol(col1); temp.setName(name1 + name2); queueMatrix.add(name1 + name2); matrixs.add(temp); } } } else { queueMatrix.add(String.valueOf(cal.charAt(i))); } } System.out.println(multiplication); } } public static class Matrix { private int row; private int col; private String name; public int getRow() { return row; } public void setRow(int row) { this.row = row; } public int getCol() { return col; } public void setCol(int col) { this.col = col; } public String getName() { return name; } public void setName(String name) { this.name = name; } } }