java矩阵连乘_算法设计与分析——矩阵连乘问题(动态规划)

本文探讨了矩阵连乘问题,指出计算矩阵连乘积的顺序对计算次数的影响,并提出了使用动态规划解决矩阵连乘的最优计算次序问题。通过分析最优解的结构、建立递归关系以及构造最优解的算法,展示了如何找到最小数乘次数的矩阵连乘次序。
摘要由CSDN通过智能技术生成

一、问题描述

引出问题之前我们先来复习一下矩阵乘积的标准算法。

int ra,ca;//矩阵A的行数和列数

int rb,cb;//矩阵B的行数和列数

voidmatrixMultiply()

{for(int i=0;i

{for(int j=0;j

{int sun=0;for(int k=0;k<=ca;k++)

{

sum+=a[i][k]*b[k][j];

}

c[i][j]=sum;

}

}

}

给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。例如,给定三个连乘矩阵{A1,A2,A3}的维数分别是10*100,100*5和5*50,采用(A1A2)A3,乘法次数为10*100*5+10*5*50=7500次,而采用A1(A2A3),乘法次数为100*5*50+10*100*50=75000次乘法,显然,最好的次序是(A1A2)A3,乘法次数为7500次。

加括号的方式对计算量有很大的影响,于是自然地提出矩阵连乘的最优计算次序问题,即对于给定的相继n个矩阵,如何确定矩阵连乘的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。

二、问题分析

29165b7b2a2b0d7a44174faf238fac51.png

92ff1ad9fccaa36ef84112fc69091557.png

矩阵连乘也是Catalan数的一个常用的例子,关于时间复杂度的推算需要参考离散数学关于Catalan的内容。

下面考虑使用动态规划法解矩阵连乘积的最优计算次序问题。

1、分析最优解的结构

5fa029b214c491b52123b09c272cf9de.png

问题的最优子结构性质是该问题可以用动态规划求解的显著特征!!!

2、建立递归关系

e4dd2889304d4d2c9879c0843e497cbe.png

b20f1a9068eb6f35ea193bf6ad82792a.png

3、计算最优值

39ba129abf05ee8801feeb3c4aaf9c37.png

public static void matrixChain(intn) {for (int i = 1; i <= n; i++) {

m[i][i]= 0;

}for (int r = 2; r <= n; r++) {//i与j的差值

for (int i = 1; i <= n - r + 1; i++) {int j = i + r - 1;

m[i][j]= m[i + 1][j] + p[i - 1] * p[i] *p[j];

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]=t;

s[i][j]=k;

}

}

}

}

}

72ed51993f80726272971a6f0e430905.png

658dbb0abdbfe997d74e53a6ae4a3ad2.png

4、构造最优解

56b6ee3887381e4d1f734aa6600abca0.png

public static void traceback(int i, intj) {if (i ==j) {

System.out.printf("A%d", i); //输出是第几个数据

return;

}

System.out.printf("(");

traceback(i, s[i][j]);//递归下一个数据

System.out.printf(" x ");

traceback(s[i][j]+ 1, j);

System.out.printf(")");

}

9e611e0cc7346cee0d4f0d6262e681d8.png

三、总结

a269c8e0928e082dda2dab9890324c87.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值