矩阵连乘备忘录算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
湖南涉外经济学院计算机科学与技术专业
《算法设计与分析》课程
矩阵连乘备忘录算法
实验报告
班级:
学号:
姓名:
教师:
成绩:
2012年5月
【实验目的】
1 掌握动态规划算法和备忘录方法;
2 利用动态规划备忘录思想实现矩阵连乘;
3 分析实验结果,总结算法的时间和空间复杂度。思考是否能将算法的时间复杂度提高到
O(nlgn)
【系统环境】
Windows 07 平台
【实验工具】
VC++6.0中文企业版
【问题描述】
描述:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1可乘的,i=1,2,…,n-1。找出这个n个矩阵的连乘A1A2…An所需相乘的最少次数的方式。
例:矩阵连乘积A1A2A3A4可以有一下五种不同的完全加括号方式:
(A1(A2(A3A4)))
(A1((A2A3)A4))
((A1A2)(A3A4))
((A1(A2A3))A4)
(((A1A2)A3)A4)
【实验原理】
原理:1、矩阵连乘满足结合律,且不同的结合方式,所需计算的次数不同。
2、利用备忘录方法,用表格保存以解决的子问题答案,降低重复计算,提高效率。
思路:m初始化为0,表示相应的子问题还位被计算。在调用LookupChain时,若m[i][j]>0,则表示其中储存的是所要求子问题的计算结果,直接返回此结果即刻。否则与直接递归算法一样,自顶而下的递归计算,并将计算结果存入m[i][j]后返回。因此,LookupChain总能返回正确的值,但仅在它第一次被调用时计算,以后调用就直接返回计算结果。
方法:用MemorizedMatrixChain函数将已经计算的数据存入表中,用LookupChain函数配合MemorizedMatrixChain函数递归调用计算。
【源程序代码】
#include
#include
#include
#define N 10
int p[N],m[N][N],s[N][N];
int LookupChain(int i,int j);
//备忘录算法函数
int MemorizedMatrixChain(int n,int **m,int **s)
{
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
m[i][j]=0;
return LookupChain(1,n);
}
//递归调用函数
int LookupChain(int i,int j)
{
if(m[i][j]>0)
return m[i][j];
if(i==j)
return 0;
int u=LookupChain(i,i)+LookupChain(i+1,j)+p[i-1]*p[i]*p[j];
s[i][j]=i;
for(int k=i+1;k { int t=LookupChain(i,k)+LookupChain(k+1,j)+p[i-1]*p[k]*p[j]; if(t { u=t; s[i][j]=k; } } m[i][j]=u; return u; } //输出格式函数