矩阵连乘问题C++实现

2023-11-11

1.认真审阅题目,明确题目的已知条件和求解的目标;

给定n个矩阵{A1,A2,A3……,An},其中Ai与Ai+1(i = 1,2 ,3,4……n-1)是可乘的,加括号的方法表示矩阵连乘的次序,不同加括号的方法所对应的计算次序是不同的。

2.问题建模

【例4-2】三个矩阵 A1 A2 A3 连乘,用加括号的方法表示其计算次序。

3个矩阵相乘,其加括号的方法一共有两种,具体如下:

【例4-3】4个矩阵连乘,用加括号的方法表示其计算次序。

4个矩阵连乘,其加括号的方法共有5种,具体如下:
在这里插入图片描述

不同加括号的方法所对应的计算量也是不同的,甚至差别很大。由于在矩阵相乘的过程中,仅涉及加法和乘法两种基本运算,乘法耗时远远大于加法耗时,故采用矩阵连乘所需乘法的次数来对不同计算次序的计算量进行衡量。

【例4-4】三个矩阵 A1 ,A2 ,A3 的行列分别为10×100、100×5、5×50,求例4-2中的两种加括号方法所需要乘法的次数。

两种加括号方法所需要乘法的次数分别为

那么,矩阵连乘问题就是对于给定n个连乘的矩阵,找出一种加括号的方法,使得矩阵连乘的计算量最小。

容易想到的解决方法是穷举法,即对n个矩阵连乘的每一种加括号方法进行乘法次数的统计,从中找出最小的计算量所对应的加括号方法。这种方法的复杂性取决于加括号的方法的种数。对于n个矩阵连乘,其加括号的方法有多少种呢?

考查矩阵连乘,不管哪种加括号的方法,最终都归结为两部分结果矩阵相乘,这两部分从n个连乘矩阵中的哪个矩阵处分开呢?设可能从A k 和A k+1 处将n个矩阵分成两部分,其中k=1,2,…,n-1。令P(n)代表n个矩阵连乘不同的计算次序,即不同加括号的方式,则n个矩阵连乘加括号的方式可通过两步操作来实现:①分别完成对两部分加括号;②对所得的结果加括号。由此

解此递推方程可得P(n)实际上是Catalan数,即P(n)=C(n-1),其中 。故穷举法的复杂性非常高,是n的指数级函数,显然,该方法不可行。

3.算法设计;

采用自低向上的方法求解最优质的具体的求解步骤设计如下:
步骤1:确定合适的数据结构,采用二维数组m来存放各个子问题的最优值,二维数组来存放来存放各个子问题的最优策略,(如果s[i][j]=k,则最优加括号的 方法为(Ai……Ak)(Ak+1……,Aj),一维数组P
步骤2:初始化。令m[i][j] = 0 , s[i][j] = 0,其中 i = 1, 2, ……
步骤3:循环阶段
步骤3-1:按照递归关系式计算两个矩阵AiAi+1,相乘时的最优值,并将其存入m[i][i+1],同时将最优决策计入s[i][i+1],i = 1, 2, ……
步骤3-2:按照递归关系式计算3个矩阵AiAi+1Ai+2相乘时的最优值并将其存入m[i][i+2],同时最优决策计入s[1][i+2],i = 1, 2, ……, n – 2
以此类推
步骤3-(n-1):按照递归关系式计算n个矩阵A1,A2,……An相乘时的最优质的并将其存入m[1][n],同时将最优决策计入s[1][n]
至此,m[1][n]即为原问题的最优值
步骤4:根据二维数组s记录的最优决策信息来构造最优解
步骤4-1:递归构造A1,……,As[1][n]的最优解,直到包含一个矩阵结束
步骤4-2:递归构造As[1][n]+1……An的最优解,直到包含一个矩阵结束
步骤4-3:将步骤4-1和步骤4-2递归的结果加括号

4.编码实现;


```cpp
#include <iostream>
using namespace std;
void MatrixChain(int *p, int n, int  * * m, int * * s)//用于求最优值
{
	//初始化 
	for(int i = 1; i <= n; i ++){
		m[i][i] = 0;
		s[i][i] = 0;
	}
	for(int r = 2; r <= n; r++){//不同规模的子问题 
		for(int i = 1; i <= n - r + 1; i++){//每一个规模为r的矩阵连乘序列的首矩阵Ai 
			int j = i + r - 1;//每个规模为r的矩阵连乘序列的尾矩阵为Aj
			m[i][j] = m[i+1][j] + p[i-1] * p[i]*p[j];//决策为k=i的乘法次数
			s[i][j] = i;
			for(int k = i + 1; k < j; k++){
				int  t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
				if(t < m[i][j]){
					m[i][j] = t;
					s[i][j] = k;
				}
			} 
		}
		 
	} 
} 
void Traceback(int i, int j, int ** s){
	//s[i][j]记录了断开的位置,即计算A[i:j]的加括号方式为(A[i:s[i][j]]) * A [s[i][j] + 1: j])
	if(i == j) return;
	Traceback(i, s[i][j], s);//递归打印A[i:s[i][j]的加括号方式
	Traceback(s[i][j] + 1, j, s);//递归打印A[s[i][j]+1:j ]的加括号的方式
	cout << "A" << "[" << i << ":" << s[i][j] << "]" << "乘以" << "A""[" << (s[i][j] + 1) << ":" << j << "]"<< endl; 
}
int main(){
	
	
	return 0;
}

## 5.算法分析;

显然,语句int t = m[i][k] + m[k+1][j] + p [i-1= * p[k]*p[j]为算法MatriChain的基本语句,最坏的情况下该语句的执行次数为O(n的三次方)故散发的最坏时间复杂度为O(n的三次方)
9.总结。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

矩阵连乘问题C++实现 的相关文章

随机推荐

  • 【Try to Hack】宽字节注入

    博客主页 开心星人的博客主页 系列专栏 Try to Hack 欢迎关注 点赞 收藏 留言 首发时间 2022年7月4日 作者水平很有限 如果发现错误 还望告知 感谢 导航小助手 编码 魔术引号 宽字节注入产生原因 指定表名时单引号问题 数
  • JS逆向——一个新的视频爬虫

    仅限技术交流和学习记录 严禁用于任何商业用途 否则后果自负 侵删 个人觉得坑还挺多 但难度不算大的一篇js逆向 来吧 先分析 起初解析pc网页端 感觉有点难度 然后就转到移动网页端了 其实是一模一样的 除了接口和接口非加密参数不一样 所以没
  • html页面刷新或关闭前的操作

    页面会触发beforeunload或者pagehide事件 1 代码实现 const listenerCallbacks new Set const listenerCenter add listener listenerCallbacks
  • python unpack infinity,Python-输入包含NaN、infinity或对于dtype(“float64”)来说太大的值...

    我是新来的Python 我正在尝试使用sklearn cluster 这是我的代码 from sklearn cluster import MiniBatchKMeans kmeans MiniBatchKMeans n clusters
  • 安装JAVA 并配置环境变量

    1 在官网下载安装包 这里选择的是Java8 选择对应版本 本人使用的windows10 x86系统 JDK1 8官网下载地址 https www oracle com java technologies downloads java8 2
  • poi 导出word工具类,支持模板内容换行

    package com sinosoft sinoep modules taskOrder common import org apache poi xwpf usermodel import java util List import j
  • Log4j详细使用教程

    林炳文Evankaka原创作品 转载请注明出处http blog csdn net evankaka 日志是应用软件中不可缺少的部分 Apache的开源项目Log4j是一个功能强大的日志组件 提供方便的日志记录 在apache网站 jaka
  • 关于设计与实现毕业设计题目

    设计与实现毕业设计题目1 10题 1 基于知识图谱构建人物关系的设计与实现 2 电子资源使用统计平台USSER的设计与实现 3 工业机器人焊缝跟踪与自动涂胶系统的设计与实现 4 初中语文微课的设计与实现研究 5 新型5G红外热成像测温系统设
  • pimpl 惯用法

    现在这里有一个名为 CSocketClient 的网络通信类 定义如下 网络通信的基础类 SocketClient h zhangyl 2017 07 11 class CSocketClient public CSocketClient
  • 深度神经网络中的Inception模块介绍

    深度神经网络 Deep Neural Networks DNN 或深度卷积网络中的Inception模块是由Google的Christian Szegedy等人提出 包括Inception v1 Inception v2 Inception
  • 机器学习之SVM

    文章目录 一 SVM基本介绍 二 SVM工作原理 1 线性支持向量机 数据可分 2 软边距支持向量机 数据不可分 三 sklearn实现SVM 注 SVM涉及距离 需要先数据标准化处理 1 线性SVM LinearSVC 构造函数的参数及默
  • sql删除所有binglog日志

    删除所有binglog日志 SQL PURGE BINARY LOGS BEFORE DATE SUB NOW INTERVAL 0 DAY 注意 命令执行后还会保留最新的一个binlog 应该是处于打开状态删除不掉
  • TestNG 测试套件(二)

    1 配置类 package com course testng suite import org testng annotations AfterMethod import org testng annotations AfterSuite
  • HTML 基础

    HTML 标题 HTML 标题 Heading 是通过 h1 h6 标签来定义的 实例 h1 这是一个标题 h1 h2 这是一个标题 h2 h3 这是一个标题 h3 尝试一下 HTML 段落 HTML 段落是通过标签 p 来定义的 实例 p
  • 分析师:芯片短缺至少还将持续一年

    众所周知 半导体行业对需求突然增加的反应很慢 一些分析家认为 现在芯片需求超过供应约30 要赶上需求将需要三到四个季度 从本质上讲 这意味着芯片短缺将一直持续到2022年 芯片需求正在蓬勃发展 如今 几乎所有电子设备中都装有芯片 因此对半导
  • 面试官:谈谈你对大数据平台架构的理解?

    笼统的来说 大数据的架构一共有五层 首先是数据源层 即最原始的数据层 数据在这一层里 还只是杂草地里的野菜 如果要问这片地的具体信息 目前来讲有三个地方 一个地方是企业内部自有数据 例如淘宝 京东等电商平台的用户信息 订单信息 商品信息等
  • 数字化转型成熟度模型介绍

    中关村信息技术和实体经济融合发展联盟提出了一种数字化转型成熟度模型系列标准 目前已经被众多央企采用 作为数字化转型战略框架和评价的依据 用友作为全球领先的数智化服务商 也参与了这一系列标准的制定 今天我们就来介绍一下这套成熟度模型 并讨论对
  • k8s基础概念:port ,targetport,nodeport

    在Kubernetes中 有三种类型的端口与Service相关 port targetPort和NodePort 它们分别用于不同的用途 port port字段定义了Service暴露给集群内部和外部的端口号 当你创建一个Service时
  • web前端职业规划(转)

    关于一个WEB前端的职业规划 其实是有各种的答案 没有哪种答案是完全正确的 全凭自己的选择 只要是自己选定了 坚持去认真走 就好 在这里 我只是简要说一下自己对于这块儿内容的理解 有一个观点想要分享给大家的是 任何规划和目标的实现都依赖于知
  • 矩阵连乘问题C++实现

    矩阵连乘问题C 1 认真审阅题目 明确题目的已知条件和求解的目标 2 问题建模 3 算法设计 4 编码实现 1 认真审阅题目 明确题目的已知条件和求解的目标 给定n个矩阵 A1 A2 A3 An 其中Ai与Ai 1 i 1 2 3 4 n