📜  门| GATE-CS-2017(套装2)|问题 37(1)

📅  最后修改于: 2023-12-03 15:42:19.255000             🧑  作者: Mango

问题 37

这个问题涉及矩阵乘法。如果我们有两个矩阵 AB,并且要计算它们的乘积,则必须确保矩阵 A 的列数等于矩阵 B 的行数。

现在,假设我们有 n 个矩阵, A1,A2,……,An,我们想计算它们的乘积。也就是说,我们要计算 A1 * A2 * ...... * An。请注意,此操作不是相关的。也就是说,无论以哪种顺序计算它们的乘积,最终都会得到相同的结果。

下面是一个简单的递归解决方案,可以计算它们的乘积:

其中,A1 和 A2 是要相乘的矩阵,i、j 和 k 是矩阵的维度。

请通过编写代码实现上述递归方法的动态编程版本。使用下面的签名:

def matrixMultiplication(dims: List[int]) -> int:

要求:

  • dims 是一个大小为 n + 1 的整数列表。其中,第 i 个矩阵的维度是 dims [i-1] x dims [i]。因此,对于上面的递归方法,给定的第一个矩阵将是 A1 = dims [0] x dims [1],而第二个矩阵将是 A2 = dims [1] x dims [2],等等。
  • 代码的时间复杂度应该是 O(n^3) 或 O(n^2 log n)。

示例:

输入: dims = [10, 30, 5, 60]

输出: 4500

解释:

输入的矩阵见下图:

因此,我们可以通过以下方式求得其乘积,其中括号表示相乘的矩阵:

(AB)(CD)(EF)

(10x30)x(30x5)x(5x60)

      (AB)

(10x30) x (CD) x (30x5) (EF) x (5x60)

括号中的每个矩阵的维度如下:

AB => 10x5

CD => 30x60

(AB)(CD) => 10x60

EF => 5x60

(AB)(CD)(EF) => 10x60 x 5x60 = 6000

因此,最终的输出将为 4500,所以我们的函数应该返回 4500。

以下是动态编程解决方案的Python实现:

from typing import List

def matrixMultiplication(dims: List[int]) -> int:
    n = len(dims)
    
    # 初始化矩阵乘法的结果矩阵
    m = [[0 for x in range(n)] for y in range(n)]
    
    # 初始化单元矩阵
    for i in range(n):
        for j in range(n):
            if i == j:
                m[i][j] = 0
                
    # 计算矩阵乘积的最小代价
    for L in range(2, n):
        for i in range(1, n-L+1):
            j = i + L - 1
            m[i][j] = float('inf')
            for k in range(i, j):
                q = m[i][k] + m[k+1][j] + dims[i-1]*dims[k]*dims[j]
                if q < m[i][j]:
                    m[i][j] = q
    
    return m[1][n-1]

该算法的时间复杂度为 $O(n^3)$。