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!
版权说明:本文禁止抄袭、转载 ,侵权必究!