收藏 分享(赏)

动态规划算法解矩阵连乘问题.doc

上传人:HR专家 文档编号:5295279 上传时间:2019-02-19 格式:DOC 页数:6 大小:63KB
下载 相关 举报
动态规划算法解矩阵连乘问题.doc_第1页
第1页 / 共6页
动态规划算法解矩阵连乘问题.doc_第2页
第2页 / 共6页
动态规划算法解矩阵连乘问题.doc_第3页
第3页 / 共6页
动态规划算法解矩阵连乘问题.doc_第4页
第4页 / 共6页
动态规划算法解矩阵连乘问题.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

1、动态规划算法解矩阵连乘问题一、实验目的通过上机实验,要求掌握动态规划算法的问题描述、算法设计思想、程序设计和算法复杂性分析等。二、实验环境VC6.0 C+,vs2005三、实验内容1 用动态规划算法解矩阵连乘问题(1)问题的描述给定 n 个矩阵A 1,A2,An,其中 Ai 与 Ai+1 是可乘的,i=1,2,n-1。要算出这n 个矩阵的连乘积 A1A2An。由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用 2 个矩阵相乘的标准算法计算出矩阵连乘积。

2、完全加括号的矩阵连乘积可递归地定义为: (1)单个矩阵是完全加括号的(当然实际上可以不加) ; (2)矩阵连乘积 A 是完全加括号的,则 A 可表示为 2 个完全加括号的矩阵连乘积 B 和 C 的乘积并加括号,即 A=(BC)。 例如,矩阵连乘积 A1A2A3A4 有 5 种不同的完全加括号的方式:(A 1(A 2(A 3A4) ) ) , (A 1(A 2A3)A 4) ) , (A 1A2)(A 3A4) ) , (A 1(A 2A3) )A 4) , (A 1A2)A 3)A 4) 。每一种完全加括号的方式对应于一个矩阵连乘积的计算次序,这决定着作乘积所需要的计算量。若 A 是一个 pq

3、 矩阵,B 是一个 qr 矩阵,则计算其乘积 C=AB 的标准算法中,需要进行pqr 次数乘。 (3)为了说明在计算矩阵连乘积时,加括号方式对整个计算量的影响,先考察 3 个矩阵A 1,A2,A3连乘的情况。设这三个矩阵的维数分别为10100,1005,550。加括号的方式只有两种:(A 1A2)A 3) , (A 1(A 2A3) ),第一种方式需要的数乘次数为 101005105507500,第二种方式需要的数乘次数为 100550101005075000。第二种加括号方式的计算量时第一种方式计算量的 10 倍。由此可见,在计算矩阵连乘积时,加括号方式,即计算次序对计算量有很大的影响。于是

4、,自然提出矩阵连乘积的最优计算次序问题,即对于给定的相继 n 个矩阵A 1,A2,An(其中矩阵 Ai 的维数为 pi-1pi,i1,2,n) ,如何确定计算矩阵连乘积 A1A2An 的计算次序(完全加括号方式) ,使得依此次序计算矩阵连乘积需要的数乘次数最少。 正如课堂中所分析,穷举法的计算量太大,它不是一个有效的算法,本实验采用动态规划算法解矩阵连乘积的最优计算次序问题。(2)算法设计思想动态规划算法的基本思想是将待求解问题分成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,动态规划法经分解得到的子问题往往不是相互独立的,前一子问题的解为后一子问题的解提供

5、有用的信息,可以用一个表来记录所有已解决的子问题的答案,不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。 本实验的算法思路是: 1)计算最优值算法MatrixChain():建立两张表(即程序中的*m和*s,利用二维指针存放),一张表存储矩阵相乘的最小运算量,主对角线上的值为0,依次求2个矩阵、3个矩阵、直到n个矩阵相乘的最小运算量,其中每次矩阵相乘的最小运算量都在上一次矩阵相乘的最小运算量的基础上求得,最后一次求得的值即为n个矩阵相乘的最小运算量;另一张表存储最优断开位置。 2)输出矩阵结合方式s,自己加括号,构造出最优加括号方式。当然也可以编程输出,这部分不作强制要求。(3

6、)程序设计/测试数据可以设为六个矩阵分别为/A130*35,A235*15,A315*5,A45*10,A510*20,A620*25/p 用来记录矩阵的行列,则 p1-7=30,35,15,5,10,20,25/mij用来记录第 i 个矩阵乘至第 j 个矩阵的最优解(即最小乘积次数) /s用来记录从哪里断开,才可得到该最优解 计算示例:注意上图(a)中的计算次序!(1)理解算法思想,读懂程序(2)给程序注上详细解释(3)通过矩阵 s 给出最优乘积次序 137520350475421263min52 51351p【程序及详解,最优乘积输出附此】程序及详解/ jzlc.cpp : 矩阵连乘#in

7、clude #include #include using std:cout;using std:endl;int main()int p=30,35,15,5,10,20,25; /p0,p1确定 A1 行列数,p1,p2确定 A2行列数,依次类推int n=sizeof(p)/sizeof(int)-1; /自动计算矩阵个数,增加程序灵活性int i,j,k,r;long *m=new long*n+1; int *s=new int*n+1;for(i=0;i=0)cout=0)coutsij“t“;elsecout“t“;coutendl;return 0;输出结果2 算法时间复杂度与空间复杂度分析时间复杂度分析:首先分析该算法有三大循环块,第一块初始化 m,第二块初始化 s,第三块是对出 m 和 s 的值,第四块是输出表(b) ,第五块是输出表(c) 。分别求出时间复杂度,第一块为 O(6),第二块为 O(6),第一块最大为 O(5*5*5)=O(125)第二块为 O(6*6)=O(36)第三块为 O(6*6)=O(36)因此时间复杂度 T=O(6)+O(6)+O(125)+0(36)+O(36)=O(125)空间复杂度分析:因为此算法时间复杂度为 O(53),因此空间复杂度为 O(1)。3 教师评分

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 工作计划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报