当前位置: 首页 > news >正文

矩阵链相乘(动态规划法)

问题分析

矩阵链相乘问题是一个经典的动态规划问题。给定一系列矩阵,目标是找到一种最优的乘法顺序,使得所有矩阵相乘所需的标量乘法次数最少。矩阵链相乘问题的关键在于利用动态规划来避免重复计算子问题。

算法设计

  • 定义子问题:设 𝑤[𝑖,𝑗]表示计算矩阵 𝐴𝑖 到 𝐴𝑗的最小乘法次数。
  • 递归关系:根据递归关系式:

    其中 𝑝 是矩阵的维度数组,𝑝𝑖表示第 𝑖个矩阵的行数,​ p_{i+1}表示第 𝑖个矩阵的列数。   
  •  w[i,j]  表示第 i个矩阵到第 j个矩阵,路径上的矩阵链的最小代价
  •  p_{i-1}p_{k}p_{j} 代表从最优子解向它的最优父解构造时需要的代价
  • 边界条件:当 𝑖=𝑗 时,𝑤[𝑖,𝑗]=0,因为单个矩阵不需要乘法。
  • 计算顺序:从小规模问题开始,逐步计算较大规模问题。

其他的情况以此类推.....

伪代码

function MatrixChainOrder(p):n = length(p) - 1let w be a 2D array of size n x nfor i = 1 to n:w[i, i] = 0for l = 2 to n:  // l is the chain lengthfor i = 1 to n - l + 1:j = i + l - 1w[i, j] = infinityfor k = i to j - 1:q = w[i, k] + w[k + 1, j] + p[i - 1] * p[k] * p[j]if q < w[i, j]:w[i, j] = qreturn w[1, n]

C实现

#include <stdio.h>
#include <limits.h>void MatrixChainOrder(int p[], int n) {int w[n][n];int i, j, k, l, q;for (i = 1; i < n; i++)w[i][i] = 0;for (l = 2; l < n; l++) {for (i = 1; i < n - l + 1; i++) {j = i + l - 1;w[i][j] = INT_MAX;for (k = i; k <= j - 1; k++) {q = w[i][k] + w[k + 1][j] + p[i - 1] * p[k] * p[j];if (q < w[i][j])w[i][j] = q;}}}printf("Minimum number of multiplications is %d\n", w[1][n - 1]);
}int main() {int arr[] = {1, 2, 3, 4};int size = sizeof(arr) / sizeof(arr[0]);MatrixChainOrder(arr, size);return 0;
}

结果如下:

总结

时间复杂度:算法的时间复杂度描述了算法执行所需要的时间与输入规模之间的关系。对于矩阵链相乘问题的动态规划算法,其时间复杂度通常为 𝑂(𝑛3)O(n3),其中 𝑛n 表示矩阵链中矩阵的个数。这样的时间复杂度在实际应用中通常是可以接受的。

空间复杂度:算法的空间复杂度描述了算法所需的额外空间与输入规模之间的关系。对于矩阵链相乘问题的动态规划算法,通常需要创建一个二维数组来存储子问题的解,因此空间复杂度为 𝑂(𝑛2)O(n2)。空间复杂度较低,适用于大部分计算机内存空间充足的情况。

初来乍到,蠢蠢小白,欢迎各路大神批评指正!!

相关文章:

  • 前端vue搭建
  • 7 步解决Android Studio模拟器切换中文输入
  • go语言初学03 连接mysql
  • python数据分析——数据预处理
  • 【CH32V305FBP6】调试入坑指南
  • list 的实现
  • Kubernetes (K8s) 普及指南
  • golang开发 gorilla websocket的使用
  • Python代码:二十五、有序的列表
  • 英伟达A100算力卡性能及应用
  • 基于Spring前后端分离版本的论坛系统-自动化测试
  • spring管理bean
  • 数据标准的制定落地
  • 使用Python爬取华为市场游戏类APP应用
  • Redis用GEO实现附近的人功能
  • 收藏网友的 源程序下载网
  • 0x05 Python数据分析,Anaconda八斩刀
  • Bytom交易说明(账户管理模式)
  • ECMAScript入门(七)--Module语法
  • Facebook AccountKit 接入的坑点
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Twitter赢在开放,三年创造奇迹
  • Web设计流程优化:网页效果图设计新思路
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 动态魔术使用DBMS_SQL
  • 面试遇到的一些题
  • 前端面试总结(at, md)
  • 如何进阶一名有竞争力的程序员?
  • 如何实现 font-size 的响应式
  • 如何使用 JavaScript 解析 URL
  • 使用SAX解析XML
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 突破自己的技术思维
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 国内开源镜像站点
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​Java并发新构件之Exchanger
  • ​用户画像从0到100的构建思路
  • #pragma pack(1)
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (0)Nginx 功能特性
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (39)STM32——FLASH闪存
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (TOJ2804)Even? Odd?
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)Dubbo快速入门、介绍、使用
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)iOS字体
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .NET BackgroundWorker