【中等】算法nodeJs:矩阵乘法计算量估算

88 阅读2分钟

描述

image.png 在计算 A×B×C 时,不同的运算顺序会带来不同的运算量。例如,(A×B)×C 的运算量是 a×b×c+a×c×d,而 A×(B×C) 的运算量是 b×c×d+a×b×d。

现在,对于给定的 n 个矩阵的大小与运算式,请你计算出所需要的运算量。

输入描述:

第一行输入一个整数 n(1≦n≦15) 代表矩阵的个数。
此后 n 行,第 i 行输入两个整数 ai​ 和 bi​(1≦ai​,bi​≦100) 代表第 i 个矩阵的行数和列数。
最后一行输入一个长度为 1≦len(s)≦103 的字符串 s 代表运算式。运算式中只包含前 n 个大写字母与括号,第 i 个大写字母对应输入的第 i 个矩阵,括号成对出现,保证运算式合法且正确。

输出描述:

在一行上输出一个整数,代表计算需要的运算量。

image.png

  1. 解析输入:首先读取矩阵的数量和每个矩阵的行数和列数。然后读取运算式。
  2. 使用栈:我们使用栈来模拟矩阵乘法的运算顺序。当遇到矩阵时,将其行数和列数压入栈中;当遇到右括号时,弹出栈顶的两个矩阵,计算它们的乘法运算量,并将结果矩阵的行数和列数压回栈中。
  3. 计算运算量:每次弹出两个矩阵时,计算它们的乘法运算量,并累加到总运算量中。
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();

void (async function () {
    function calculateOperations(n, matrices, expression) {
        let stack = [];
        let totalOperations = 0;

        for (let i = 0; i < expression.length; i++) {
            let char = expression[i];

            if (char === "(") {
                // 遇到左括号,不做任何操作
            } else if (char === ")") {
                // 遇到右括号,弹出栈顶的两个矩阵进行计算
                let matrix2 = stack.pop();
                let matrix1 = stack.pop();

                // 计算运算量
                totalOperations += matrix1[0] * matrix1[1] * matrix2[1];

                // 将结果矩阵压回栈中
                stack.push([matrix1[0], matrix2[1]]);
            } else {
                // 遇到矩阵,将其行数和列数压入栈中
                let index = char.charCodeAt(0) - "A".charCodeAt(0);
                stack.push(matrices[index]);
            }
        }

        return totalOperations;
    }

    // 读取输入
    const readline = require("readline");
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout,
    });

    let n;
    let matrices = [];
    let expression;

    rl.question("", (input) => {
        n = parseInt(input);

        let count = 0;
        rl.on("line", (line) => {
            if (count < n) {
                let [a, b] = line.split(" ").map(Number);
                matrices.push([a, b]);
                count++;
            } else {
                expression = line;
                rl.close();
            }
        });
    });

    rl.on("close", () => {
        // 计算并输出结果
        let result = calculateOperations(n, matrices, expression);
        console.log(result);
    });
})();