首页 > 编程语言 >算法设计与分析(矩阵连乘问题

算法设计与分析(矩阵连乘问题

时间:2024-09-24 16:21:25浏览次数:10  
标签:连乘 int 代码 矩阵 算法 最优 乘法



目录

  • 矩阵连乘
  • 代码
  • 代码说明
  • 小结:


矩阵连乘

矩阵连乘问题是一个经典的动态规划问题,旨在通过确定矩阵的乘法顺序来最小化所需的乘法运算次数。在矩阵连乘中,我们有一系列矩阵 ( A_1, A_2, …, A_n ),其维度由一个数组 ( p ) 定义,其中 ( p[i-1] ) 是矩阵 ( A_i ) 的行数,而 ( p[i] ) 是矩阵 ( A_i ) 的列数。为了计算两个矩阵 ( A_i ) 和 ( A_j ) 的乘积,所需的标量乘法次数为 ( p[i-1] * p[k] * p[j] ),其中 ( k ) 是乘法操作的一个中间矩阵。

代码

在本博客中,我们将使用动态规划来解决这一问题,通过构建一个表来存储每个子问题的最优解。以下是实现这一算法的完整代码。

#include <iostream> 
// N:矩阵个数 
#define N 6

using namespace std;

// 递推求最优值 
void MatrixChain(int *p, int n, int m[][N+1], int s[][N+1]){
	/*
	p:各矩阵大小 
	n:矩阵个数 
	m:最优值([i, j]相乘) 
	s:最优解 
	*/ 
	for (int i=1; i<=n; i++) m[i][i] = 0;	// 初始化自己乘以自己的次数为0 
	// r:相乘的矩阵的个数 
	for (int r=2; r<=n; r++){
		// i:[i, i+r-1] 矩阵相乘 
		for (int i=1; i<=n-r+1; i++){
			int j = i+r-1;
			// 初始 m[i][j] 为 [i, i]*[i+1, i+r-1]
			m[i][j] = m[i][i] + m[i+1][j] + p[i-1]*p[i]*p[j];
			s[i][j] = i;
			// 找出最小乘积次数 k = [i+1, j-1] 
			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[][N+1]){
	// 终止条件 
	if (i == j) cout<<"A"<<i;
	
	else{
		cout<<"(";
		TraceBack(i, s[i][j], s);
		TraceBack(s[i][j]+1, j, s);
		cout<<")";	
	}
} 

int main() {
	int p[N+1]={30,35,15,5,10,20,25};
	int m[N+1][N+1],s[N+1][N+1];
	
	MatrixChain(p, N, m, s);
	TraceBack(1, N, s);
}

代码说明

在这段代码中,我们定义了两个主要的函数:MatrixChain 和 TraceBack。

MatrixChain 函数负责计算矩阵的最优乘法次数,并填充两个表 ( m ) 和 ( s )。其中,( m[i][j] ) 存储从矩阵 ( A_i ) 到 ( A_j ) 的最小乘法次数,( s[i][j] ) 则存储实现该最小乘法次数的分割点。

TraceBack 函数用于递归地输出最优的矩阵乘法顺序。在找到最优解后,通过回溯函数,可以有效地重构出矩阵相乘的顺序。

通过运行 main 函数,我们为矩阵链的维度提供了示例输入,并调用这两个函数,输出矩阵相乘的最优顺序。矩阵连乘不仅在计算机科学中有广泛应用,还在图像处理、科学计算等多个领域发挥着重要作用。

标签:连乘,int,代码,矩阵,算法,最优,乘法
From: https://blog.51cto.com/u_16672541/12100850

相关文章

  • 日新月异 PyTorch - pytorch 基础: K-means 聚类算法(sklearn.cluster 的 KMeans 实现,
    源码https://github.com/webabcd/PytorchDemo作者webabcd日新月异PyTorch-pytorch基础:K-means聚类算法(sklearn.cluster的KMeans实现,对一个包含10个特征的数据做分类)示例如下:basic\demo07.py'''K-means聚类算法(sklearn.cluster的KMeans实现,对一个包含1......
  • 一、机器学习算法与实践_04信息论与决策树算法笔记
    1信息论基础知识介绍信息论是运用概率论与数理统计的方法,去研究信息、信息熵、通信系统、数据传输、密码学、数据压缩等问题的应用数学学科,熵(Entropy)是信息论中的一个重要概念,由克劳德·香农(ClaudeShannon)提出,用于衡量信息的不确定性或系统的混乱程度在机器学习中,熵的概念......
  • 文心一言 VS 讯飞星火 VS chatgpt (350)-- 算法导论24.1 1题
    一、在图24-4上运行Bellman-Ford算法,使用结点作为源结点。在每一遍松弛过程中,以图中相同的次序对每条边进行松弛,给出每遍松弛操作后的值和值。然后,把边的权重改为,再次运行该算法,这次使用作为源结点。如果要写代码,请用go语言。文心一言:首先,我们根据题目要求,手动通过Bellman-Ford算......
  • 文心一言 VS 讯飞星火 VS chatgpt (348)-- 算法导论23.2 7题
    七、假定图G的一棵最小生成树已经被计算出来。如果在图中加入一个新结点及其相关的新边,我们需要多少时间来对最小生成树进行更新?如果要写代码,请用go语言。文心一言:在图中加入一个新节点及其相关边后,要更新最小生成树(MST),通常意味着需要重新计算包含新节点的最小生成树,因为新节点的加......
  • 文心一言 VS 讯飞星火 VS chatgpt (347)-- 算法导论23.2 6题
    六、假定一个图中所有的边权重均匀分布在半开区间[0,1)内。Prim算法和Kruskal算法哪一个可以运行得更快?如果要写代码,请用go语言。文心一言:在比较Prim算法和Kruskal算法在特定条件下的性能时,我们需要考虑几个因素,主要是图的表示方式、边的数量、顶点的数量以及边的权重分布。由于在......
  • kl散度,K近邻估计法(K-Nearest Neighbors, KNN)是一种基本的分类与回归方法,通常用于分类
     K近邻估计法(K-NearestNeighbors,KNN)是一种基本的分类与回归方法,通常用于分类任务。在Python中,你可以使用scikit-learn库来实现KNN算法。下面是一个简单的示例,展示如何使用scikit-learn来实现KNN分类器。首先,确保你已经安装了scikit-learn库。如果没有安装,可以通过运行pipinsta......
  • 一种单目标A*算法设计与实现
    一种单目标A*算法设计与实现作者:吴屏珊最近在学习简单的单目标A*算法,其中在CSDN上阅读到的一篇博文给了我很大启发,于是在该博文的基础上,笔者记录了一点自己对于A*算法的体会和感悟。原文链接目录目录一种单目标A*算法设计与实现目录1.A*算法简单介绍1.1A*算法的基本要素1......
  • 回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测
    回归预测|Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测目录回归预测|Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料效果一览基本介绍1.Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预......
  • 聚类分析 | FCM模糊c均值聚类,三种优化算法(SSA、PSO、GA)对FCM初始中心点寻优
    聚类分析|FCM模糊c均值聚类,三种优化算法(SSA、PSO、GA)对FCM初始中心点寻优目录聚类分析|FCM模糊c均值聚类,三种优化算法(SSA、PSO、GA)对FCM初始中心点寻优效果一览基本介绍程序设计参考资料效果一览基本介绍聚类分析|FCM模糊c均值聚类,三种优化算法(SSA、PSO、GA)对FCM初始中心点......
  • 回归预测 | Matlab实现FA-ESN萤火虫算法优化回声状态网络多输入单输出回归预测
    回归预测|Matlab实现FA-ESN萤火虫算法优化回声状态网络多输入单输出回归预测目录回归预测|Matlab实现FA-ESN萤火虫算法优化回声状态网络多输入单输出回归预测效果一览基本介绍程序设计参考资料效果一览基本介绍1.Matlab实现FA-ESN萤火虫算法优化回声状态网络多输入单输出回归......