DP之矩阵连乘问题

简介:

最优二叉查找树的一道思考习题

同最优二叉查找树一样,矩阵连乘问题也是一个卡特兰数问题(其动态规划的构造过程都很像)


分析解答:
a,铺垫的数学知识首先要搞清楚矩阵相乘是怎么乘的:

1)对于连续的n个矩阵相乘 A1 * A2 *A3.........An,其乘法顺序可以是任意的,可以在上面加括号,改变做乘法的顺序,例如 A*B*C三个矩阵相乘可以A*(B*C)

也可以直接按从左到右的顺序。连续的两个矩阵的位数必须满足m*p,p*n才能相乘,且相乘后的结果是个m*n的矩阵。(线性代数的知识)

2)对于2个m*p,p*n的矩阵相乘,共做乘法次数为 m*n*p 次。这是预备知识,知道矩阵连续的乘法的运算次数跟运算顺序有关后,就很容易举出例子了,略。
b,卡特兰数个,证明很麻烦,有时间看了组合数学再来看
c,重点是要解决这个问题。


设M[i , j]表示从第 i 个矩阵到第 j 个矩阵连乘的最少乘法次数,(i 从 0 编号),我们最终的目标是求 M[0 , n-1]。

Ai *.......Ak * Ak+1.....Aj

假设要得到这个式子的值(即从矩阵 i 连乘到矩阵 j),所作的最后一个矩阵乘法是在矩阵 k 后(注意准确的描述位置)断开的(即左右都已乘运算好),那么容易得到

其递推式:

M[i , j]  =  min{ M[i , k] + M[k+1 , j]  + p[i - 1] * p[ k ] * p[ j ] }         i   <=   k   <=   j-1

其中 di 是矩阵 Ai 的第一维,dk+1是断开处矩阵 Ak 的第二维(即Ak+1的第一维,是一样的),dj+1是最后一个矩阵 Aj 的第二维。

得到这个式子也是一个逆向思维的过程。


可以用矩阵连乘的动态规划构造过程与最优二叉查找树比较下,发现其构造非常相似(在前面一篇dp之什么叫做professional中提到过,不再详述)

实现:

初始条件:M[i , i] = 0

填表顺序:鉴于其递推式与最优二叉查找树相似,填表顺序也是按对角线的,自己画画就知道了。

代码也跟最优二叉查找树的控制逻辑相似:

 

package Section8;


/*第八章 动态规划   课后习题:矩阵连乘*/

public class MatEven {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] Dim = {30,35,35,15,15,5,5,10,10,20,20,25};
        int result = MatEven(Dim);

        System.out.println("\n动态规划求的的最优策略相乘顺序导致的最少乘法数为:" + result);
    }
    
    public static int MatEven(int[] Dim){
        //接受n个矩阵的维度数组Dim大小为2n
        int n = Dim.length / 2;        //有n个矩阵,编号0...n-1,编号为k的矩阵的维数是Dim[2k] * Dim[2k+1]
        
        int[][] Result = new int[n][n];        //最小代价矩阵
        
        //初始化
        for(int i = 0;i < n;i++)
            Result[i][i] = 0;
        
        //沿对角线填矩阵
        for(int d = 1;d <= n-1;d++)      //共n-1条对角线需要填
        {
            for(int i = 0;i <= n-d-1;i++)    //第d条对角线的第一个点横坐标为d
            {
                //int j = i - d;
                int j = i + d;        //在第d条对角线上的点,横纵坐标的关系是j = i + d
                
                //这样就确定了一个位置(i,j)的坐标,然后来填(i,j)
                int Min = 1000000000;
                for(int k = i;k <= j-1;k++)        //从第k个矩阵后面断开
                {
                    //动态规划状态转移方程
                    int temp = Result[i][k] + Result[k+1][j] + (Dim[2*i] * Dim[2*k + 1] * Dim[2*j+1]);
                    if( temp < Min)
                        Min = temp; 
                }
                
                Result[i][j] = Min;
            }
            
        }
        
        return Result[0][n-1];
    }
}

 



上面用一个数组接受一个连乘的矩阵的维数,

例如连乘的矩阵维数是:30*35  35*15  15*5  5*10  10*20  20*25

用动态规划求解得到的最佳乘法次数是:


动态规划求的的最优策略相乘顺序导致的最少乘法数为:15125

直接返回矩阵的话就可以得到整个M[i , j]的值

如果按照从左到右的顺序做乘法,是远远不止这个次数的。


-------------------------------------------------------------------------

当然,再做一些处理,就还可以得到具体的次序,类似于最优二叉查找树,就是要记录动态规划产生的过程,略

----------------------------------------------------------------------------------------------


总结:


矩阵连乘问题是个卡特兰数问题

其动态规划的构造过程非常类似于最优二叉查找树

矩阵连乘的最有子结构是什么?


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4466268.html,如需转载请自行联系原作者

相关文章
|
小程序 数据安全/隐私保护
吐血整理的几十款小程序登陆界面【附完整代码】(一)
吐血整理的几十款小程序登陆界面【附完整代码】
12076 1
吐血整理的几十款小程序登陆界面【附完整代码】(一)
|
Java API 数据库
Java一分钟之-JPA的懒加载与即时加载
【6月更文挑战第15天】**JPA中的懒加载与即时加载影响应用性能。懒加载推迟关联对象加载,减少初始数据量,但可能导致N+1查询。即时加载则在主实体加载时加载关联数据,适用于急需的情况,但会增加内存使用。选择合适的加载策略,如通过JOIN FETCH优化查询,是性能调优的关键。代码示例展示了`FetchType.LAZY`与`FetchType.EAGER`的使用。**
281 6
|
SQL 数据采集 DataWorks
DataWorks产品使用合集之如何把两列字符串拼接的数据各自拆分成多行并组合
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
159 0
|
程序员 测试技术 Docker
黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day3 全网最全
黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day3 全网最全(1)
1331 1
|
算法 测试技术 开发者
软件质量保证与测试知识点总结
【2月更文挑战第21天】软件质量保证与测试知识点总结
395 0
|
JavaScript 前端开发 API
一文深入了解Vue2和Vue3的区别
Vue3 相比 Vue2 来说,Vue3 重写了虚拟 Dom 实现,编译模板的优化,更高效的组件初始化,undate性能提高 1.3 ~ 2 倍,SSR 速度提高了 2 ~ 3 倍。
3774 0
一文深入了解Vue2和Vue3的区别
|
弹性计算 Ubuntu Linux
阿里云服务器“镜像”怎么选择?看这一篇文章就够了!
阿里云服务器镜像是服务器的“装机盘”,用于安装操作系统、初始化数据和预装软件。阿里云提供五种镜像类型:公共镜像(官方提供,正版授权)、自定义镜像(用户创建)、共享镜像(其他账户共享)、云市场镜像(官方或第三方发布)。选择镜像需考虑应用需求,如程序语言、服务器配置等。推荐Linux用户选择Alibaba Cloud Linux,Windows用户选择Windows Server 2022数据中心版。中国大陆地域的服务器支持免费无限次更换操作系统,而海外地域服务器更换系统有限制。Alibaba Cloud Linux是由阿里云官方推出并深度优化的Linux发行版,兼容RHEL/CentOS生态,
5208 1
|
JSON 前端开发 Java
优化用户体验:SpringBoot统一异常处理最佳实践
优化用户体验:SpringBoot统一异常处理最佳实践
234 0
|
Java 开发工具 Android开发
Android Studio (Android SDK) 配置与使用
Android Studio (Android SDK) 配置与使用
2726 0
|
关系型数据库 MySQL Windows
Windows端 五款 MySQL 客户端工具
Windows端 五款 MySQL 客户端工具
15348 1