python算法设计 - 矩阵链乘法

python算法设计源码:https://github.com/MakerChen66/Python3Algorithm

版权声明:原创不易,本文禁止抄袭、转载,侵权必究!

一、矩阵链乘法

矩阵乘法是一个满足结合律的运算。显然,对于矩阵A、B、C来说,(AB)C 与 A(BC) 是等价的,我们可以根据自己的喜好选择运算顺序,总之,结果都是一样的。

但是对计算机来说可不是这么回事,若我们假定矩阵 A=[10,20], B=[20,30], C=[30,40],那么在以下两种运算顺序中,标量相乘的次数是天差地别:

(AB)C = 10 * 20*30 + 10 * 30 * 40 = 18000
A(BC) = 20 * 30 * 40 + 10 * 20 * 40 = 32000

我们可以使用递归关系来找到我们需要的最优解法,首先,我们要用一个函数来得到最小标量相乘次数,那么该函数也可用来定义在所有情况下的最优子段。

再使用动态规划和备忘录法即可得到结果,时间复杂度为O(n³)。

动态规划:是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。

备忘录法:是动态规划方法的变形。与动态规划算法不同的是,备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上的。

Python算法实现:

def mult(chain):
    n = len(chain)
    aux = {
    
    (i, i): (0,) + chain[i] for i in range(n)}
    # i: 子链的长度
    for i in range(1, n):
        # j: 子链开始的索引
        for j in range(0, n - i):
            best = float('inf')
            # k: 子链的分割点
            for k in range(j, j + i):
                # 分割点的多个子链
                lcost, lname, lrow, lcol = aux[j, k]
                rcost, rname, rrow, rcol = aux[k + 1, j + i]
                cost = lcost + rcost + lrow * lcol * rcol
                var = '(%s%s)' % (lname, rname)
                # 选择最优解
                if cost < best:
                    best = cost
                    aux[j, j + i] = cost, var, lrow, rcol
    matrixchain =  dict(zip(['cost', 'order', 'rows', 'cols'], aux[0, n - 1]))
    print(matrixchain)

mult([('A', 10, 20), ('B', 20, 30), ('C', 30, 40)])

输出结果:
在这里插入图片描述
如图可知,得到的最优解是(AB)C,和我们开始所写的一致

注意:zip()函数可以创建一个迭代器,把来自各个迭代器的元素聚合在一起


二、源码下载

python算法设计源码下载:

三、作者Info

作者:小鸿的摸鱼日常,Goal:让编程更有趣!

原创微信公众号:『小鸿星空科技』,专注于算法、爬虫,网站,游戏开发,数据分析、自然语言处理,AI等,期待你的关注,让我们一起成长、一起Coding!

版权说明:本文禁止抄袭、转载 ,侵权必究!

猜你喜欢

转载自blog.csdn.net/qq_44000141/article/details/121801083