【动态规划算法】【Python实现】矩阵连乘问题

文章目录

问题描述

  • 给定 n n n个矩阵 A 1 A_{1} A1 A 2 A_{2} A2 ⋯ \cdots A n A_{n} An,其中 A i A_{i} Ai A i + 1 A_{i + 1} Ai+1是可乘的( i = 1 i = 1 i=1 2 2 2 ⋯ \cdots n − 1 n - 1 n1), A i A_{i} Ai的维数为 p i − 1 × p i , i = 1 , 2 , ⋯   , n p_{i - 1} \times p_{i} , i = 1 , 2 , \cdots , n pi1×pi,i=1,2,,n,确定这 n n n个矩阵的连乘积 A 1 A 2 ⋯ A n A_{1} A_{2} \cdots A_{n} A1A2An的计算次序,使得以此计算矩阵连乘积需要的数乘次数最少

穷举搜索法

  • 对于 n n n个矩阵的连乘积,设有不同的计算次序 P ( n ) P(n) P(n)
  • 可以先在第 k k k个( k = 1 k = 1 k=1 2 2 2 ⋯ \cdots n − 1 n - 1 n1)和第 k + 1 k + 1 k+1个矩阵之间将原矩阵序列分为两个矩阵子序列,然后分别对这两个矩阵子序列完全加括号,最后对所得的结果加括号,得到原矩阵序列的一种完全加括号方式
  • P ( n ) P(n) P(n)递归方程

P ( n ) = { 1 , n = 1 ∑ k = 1 n − 1 P ( k ) P ( n − k ) , n > 1 P(n) = \begin{cases} 1 , & n = 1 \\ \displaystyle\sum\limits_{k = 1}^{n - 1}{P(k) P(n - k)} , & n > 1 \end{cases} P(n)= 1,k=1n1P(k)P(nk),n=1n>1

    • P ( n ) P(n) P(n)实际上是 C a t a l a n Catalan Catalan数,即 P ( n ) = C ( n − 1 ) P(n) = C(n - 1) P(n)=C(n1) C ( n ) = 1 n + 1 ( 2 n n ) = Ω ( 4 n / n 3 / 2 ) C(n) = \cfrac{1}{n + 1} \left(\begin{matrix} 2n \\ n \end{matrix}\right) = \Omega(4^{n} / n^{3 / 2}) C(n)=n+11(2nn)=Ω(4n/n3/2) P ( n ) P(n) P(n)是随 n n n的增长呈指数增长的

动态规划算法

分析最优解的结构
  • 考察计算 A [ 1 : n ] A[1 : n] A[1:n]的最优计算次序
  • 设这个计算次序在矩阵 A k ( 1 ≤ k < n ) A_{k} (1 \leq k < n) Ak(1k<n) A k + 1 A_{k + 1} Ak+1之间将矩阵链断开
  • 计算 A [ 1 : n ] A[1 : n] A[1:n]的最优次序所包含的计算矩阵子链 A [ 1 : k ] A[1 : k] A[1:k] A [ k + 1 : n ] A[k + 1 : n] A[k+1:n]的次序也是最优的
    • 如果计算 A [ 1 : k ] A[1 : k] A[1:k]的次序需要的计算量更少,则用此次序替换原来计算 A [ 1 : k ] A[1 : k] A[1:k]的次序,得到的计算 A [ 1 : n ] A[1 : n] A[1:n]的计算量将比最优次序所需计算量更少,这是一个矛盾
  • 矩阵连乘积计算次序问题的最优解包含其子问题的最优解,这种性质称为最优子结构性质
建立递归关系
  • 设计算 A [ i : j ] ( 1 ≤ i ≤ j ≤ n ) A[i : j] (1 \leq i \leq j \leq n) A[i:j](1ijn)所需的最少数乘次数为 m [ i ] [ j ] m[i][j] m[i][j]
  • i = j i = j i=j时, m [ i ] [ i ] = 0 ( i = 1 , 2 , ⋯   , n ) m[i][i] = 0 (i = 1 , 2 , \cdots , n) m[i][i]=0(i=1,2,,n)
  • i < j i < j i<j时,若计算 A [ i : j ] A[i : j] A[i:j]的最优次序在 A k ( i ≤ k < j ) A_{k} (i \leq k < j) Ak(ik<j) A k + 1 A_{k + 1} Ak+1之间断开,则 m [ i ] [ j ] = m [ i ] [ k ] + m [ k + 1 ] [ j ] + p i − 1 p k p j m[i][j] = m[i][k] + m[k + 1][j] + p_{i - 1} p_{k} p_{j} m[i][j]=m[i][k]+m[k+1][j]+pi1pkpj
  • 将对应 m [ i ] [ j ] m[i][j] m[i][j]的断开位置 k k k记为 s [ i ] [ j ] s[i][j] s[i][j]
m [ i ] [ j ] m[i][j] m[i][j]递归方程

m [ i ] [ j ] = { 0 , i = j min ⁡ i ≤ k < j {   m [ i ] [ k ] + m [ k + 1 ] [ j ] + p i − 1 p k p j   } , i < j m[i][j] = \begin{cases} 0 , & i = j \\ \min\limits_{i \leq k < j}{\set{m[i][k] + m[k + 1][j] + p_{i - 1} p_{k} p_{j}}} , & i < j \end{cases} m[i][j]= 0,ik<jmin{m[i][k]+m[k+1][j]+pi1pkpj},i=ji<j

计算最优值
  • 对于 1 ≤ i ≤ j ≤ n 1 \leq i \leq j \leq n 1ijn不同的有序对 ( i , j ) (i , j) (i,j)对应不同的子问题
  • 不同子问题的个数最多只有 ( n 2 ) + n = θ ( n 2 ) \left(\begin{matrix} n \\ 2 \end{matrix}\right) + n = \theta(n^{2}) (n2)+n=θ(n2)
构造最优解
  • s [ i ] [ j ] s[i][j] s[i][j]中的数表明,计算矩阵链 A [ i : j ] A[i : j] A[i:j]的最佳方式是在矩阵 A k A_{k} Ak A k + 1 A_{k + 1} Ak+1之间断开,即最优加括号方式为 ( A [ i : k ] ) ( A [ k + 1 : j ] ) (A[i : k])(A[k + 1 : j]) (A[i:k])(A[k+1:j])
Python实现
def matrix_chain_order(p):
    n = len(p) - 1  # 矩阵的数量

    m = [[float('inf')] * (n + 1) for _ in range(n + 1)]  # 存储最小乘法次数的矩阵
    s = [[0] * (n + 1) for _ in range(n + 1)]  # 存储最佳分割位置的矩阵

    # 对角线上的子问题, 乘法次数为 0
    for i in range(1, n + 1):
        m[i][i] = 0

    # l 表示子问题的规模
    for l in range(2, n + 1):
        for i in range(1, n - l + 2):
            j = i + l - 1

            for k in range(i, j):
                # 计算 m[i][j] 的值
                q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j]

                if q < m[i][j]:
                    m[i][j] = q
                    s[i][j] = k

    return m, s


def print_optimal_parens(s, i, j):
    if i == j:
        print(f'A{i}', end='')
    else:
        print('(', end='')

        print_optimal_parens(s, i, s[i][j])
        print_optimal_parens(s, s[i][j] + 1, j)

        print(')', end='')


matrix_sizes = [30, 35, 15, 5, 10, 20, 25]

m, s = matrix_chain_order(matrix_sizes)

n = len(matrix_sizes) - 1

print('最佳乘法顺序:', end='')
print_optimal_parens(s, 1, n)
print()

minimum_multiplications = m[1][n]
print('最小乘法次数:', minimum_multiplications)
最佳乘法顺序:((A1(A2A3))((A4A5)A6))
最小乘法次数: 15125
时间复杂性
  • 三重循环的总次数为 O ( n 3 ) O(n^{3}) O(n3),计算时间上界为 O ( n 3 ) O(n^{3}) O(n3)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/596742.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文2500字Robot Framework自动化测试框架超强教程

1、Robot Framework简介 Robot Framework是一个基于Python的可扩展关键字驱动的自动化框架&#xff0c;用于验收测试&#xff0c;验收测试驱动开发&#xff08;ATDD&#xff09;&#xff0c;行为驱动开发&#xff08;BDD&#xff09;和机器人流程自动化&#xff08;RPA&#xf…

SqlException 口令已经失效

Orcle密码过期了 //查看过期时间 SELECT * FROM dba_profiles s WHERE s.profileDEFAULT AND resource_namePASSWORD_LIFE_TIME;//修改过期时间 alter PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

Debian是什么?有哪些常用命令

目录 一、Debian是什么&#xff1f; 二、Debian常用命令 三、Debian和CentOS的区别 四、Debian和CentOS的优缺点 五、Debian和CentOS的运用场景 一、Debian是什么&#xff1f; Debian是一种流行的开源Linux操作系统。 Debian是一个以Linux内核为基础的操…

轻松上手的LangChain学习说明书

一、Langchain是什么&#xff1f; 如今各类AI模型层出不穷&#xff0c;百花齐放&#xff0c;大佬们开发的速度永远遥遥领先于学习者的学习速度。。为了解放生产力&#xff0c;不让应用层开发人员受限于各语言模型的生产部署中…LangChain横空出世界。 Langchain可以说是现阶段…

强化学习:时序差分法【Temporal Difference Methods】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实例分析:GridWorld…

硬盘遭遇误删分区?这些恢复技巧你必须掌握!

在日常使用电脑的过程中&#xff0c;我们有时会遇到一些棘手的问题&#xff0c;其中误删分区无疑是一个令人头疼的难题。误删分区意味着我们不小心删除了硬盘上的某个分区&#xff0c;导致该分区内的所有数据瞬间消失。对于许多用户来说&#xff0c;这可能会引发极大的恐慌和焦…

模拟电路设计与分析

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 计算机工作原理存储单元 计算机工作原理 计算机最底层语言是二进制&#xff0c;和我们生活中使用的阿拉伯数字是十进制数&#x…

【算法】滑动窗口——长度最小的子数组

本篇文章是用一个实例来介绍常用算法之一“滑动窗口”的相关概念&#xff0c;有需要借鉴即可。 目录 1.题目2.暴力求解2.1暴力求解思路&#xff1a;2.2时间复杂度是多少&#xff1f; 3.暴力求解的优化3.1固定left的情况下&#xff0c;优化right的次数。3.2sum求值优化3.3不同组…

2.5W字 一文读懂汽车智能座舱的FLASH 存储市场、技术

吃瓜群众&#xff1a;机哥&#xff0c;存储是什么玩意&#xff0c;我买手机、电脑的时候导购员都说买内存大的&#xff0c;三星的好&#xff0c;品牌大&#xff0c;问题少&#xff0c;我也只有看哪个内存大就买那个。 机哥&#xff1a;额&#xff0c;这个嘛&#xff0c;说来话长…

设计模式之建造者模式BuilderPattern(七)

一、建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 二、代码实例 1、OrderItem类 Data&#xff1a;这是Lombok中提供的Ge…

淡茶和浓茶的标准

按照《品深淡茶冲泡标准》&#xff0c;淡茶茶汤中的咖啡碱不得高于31.67mg/100mL&#xff0c;可可碱不得高于2.67mg/mL&#xff0c;茶碱不得高于1.50mg/100mL&#xff0c;茶多酚不得高于143mg/mL&#xff0c;按照各类茶叶中各物质的含量情况&#xff0c;茶水比例不得高于1:150&…

一个JDBC小工具

pom.xml 结构 <properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><mysql5>5.1.44<…

CellMarker | 人骨骼肌组织细胞Marker大全!~(强烈建议火速收藏!)

1写在前面 分享一下最近看到的2篇paper关于骨骼肌组织的细胞Marker&#xff0c;绝对的Atlas级好东西。&#x1f44d; 希望做单细胞的小伙伴觉得有用哦。&#x1f60f; 2常用marker&#xff08;一&#xff09; general_mrkrs <- c( MYH7, TNNT1, TNNT3, MYH1, MYH2, "C…

文心一言 VS 讯飞星火 VS chatgpt (253)-- 算法导论18.2 6题

六、假设 B-TREE-SEARCH 的实现是在每个结点内采用二分查找&#xff0c;而不是线性查找。证明&#xff1a;无论怎样选择 t ( t 为 n 的函数)&#xff0c;这种实现所需的 CPU 时间都为 O(lgn)。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 首先&#xff0c;我…

tkinter/python:第一个GUI程序——制作一个数据录入界面

下图是在网上搜寻的一个案例图样&#xff0c;经过了调整修改&#xff0c;登录时界面图如下&#xff1a; 登录后点击百货店铺按钮&#xff0c;界面如下 一、创建root窗口&#xff1a; geometry接收一个字符串&#xff0c;也就是需要建立的窗口尺寸和位置&#xff0c;geometry(…

【Osek网络管理测试】[TG3_TC6]等待总线睡眠状态_2

&#x1f64b;‍♂️ 【Osek网络管理测试】系列&#x1f481;‍♂️点击跳转 文章目录 1.环境搭建2.测试目的3.测试步骤4.预期结果5.测试结果 1.环境搭建 硬件&#xff1a;VN1630 软件&#xff1a;CANoe 2.测试目的 验证DUT在满足进入等待睡眠状态的条件时是否进入该状态 …

Vue 基础语法

【1】模板语法 &#xff08;1&#xff09;差值表达式 {{}}是 Vue.js 中的文本插值表达式。 它用于在模板中输出数据或表达式的值。当数据或表达式的值发生变化时&#xff0c;插值表达式会自动更新。 补充&#xff1a;三目运算符 它的基本语法是 Condition ? A : B&#xff0…

解密SSL/TLS:密码套件扫描仪的深度解析(C/C++代码实现)

解密SSL/TLS流量通常是为了分析和审计加密通信&#xff0c;以确保数据传输的安全性和合规性。密码套件扫描仪是实现这一目的的一种工具&#xff0c;它可以提供关于SSL/TLS配置的详细信息&#xff0c;帮助安全专家评估潜在的风险。 SSL/TLS协议基础 SSL/TLS协议是网络安全中不…

Redis探索之旅(基础)

目录 今日良言&#xff1a;满怀憧憬&#xff0c;阔步向前 一、基础命令 1.1 通用命令 1.2 五大基本类型的命令 1.2.1 String 1.2.2 Hash 1.2.3 List 1.2.4 Set 1.2.5 Zset 二、过期策略以及单线程模型 2.1 过期策略 2.2 单线程模型 2.3 Redis 效率为什么这么高 三…

AI人才争夺战,华尔街入局:豪掷百万美元年薪抢人 | 最新快讯

量子位公众号 QbitAI 继硅谷之后&#xff0c;华尔街也入局“AI 人才争夺大战”。 他们的目标非常明确——抢的就是高精尖的 AI 专家。 △图源&#xff1a;Business Insider 现在这条“街”上&#xff0c;不论是银行、对冲基金还是私募股权公司都已纷纷下场&#xff0c;可谓是豪…