- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
王典 学号Y201005009
PAGE 1
矩阵连乘_实验报告
设计分析
问题描述:
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
设计思路:
设X=(x1,...xm), Y=(y1,y2,...yn)是两个序列,Z=(z1,z2,...zk)是X与Y的LCS。下列结论成立:
⑴ 如xm=yn, 则zk=xm=yn, Zk-1是Xm-1和Yn-1的LCS,即,
LCSXY=LCSXm-1Yn-1+xm=yn.
⑵ 若xm≠yn,且zk≠xm,则Z是Xm-1和Y的LCS,即
LCSXY=LCSXm-1Y
⑶ 若xm≠yn,且zk≠yn,则Z是X与Yn-1的LCS,即
LCSXY=LCSXYn-1
由此可见,2个序列的最长公共子序列包含了这2个序列的前缀的最长公共子序列。因此,最长公共子序列问题具有最优子结构性质。
由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。用c[i][j]记录序列xi和yj的最长公共子序列的长度。其中, Xi={x1,x2,…xi};Yj={y1,y2,…,yj}。当i=0或j=0时,空序列是Xi和Yj的最长公共子序列。故此时C[i][j]=0。其它情况下,由最优子结构性质可建立递归关系如下:
复杂度分析
算法的计算时间上界为O(n3)。算法所占用的空间显然为O(n2)。
程序代码c语言实现
#include stdlib.h #include stdio.h #include limits.h #define N 6 //6个矩阵 A1到A6
#include stdlib.h
#include stdio.h
#include limits.h
#define N 6 //6个矩阵 A1到A6
int p[N+1] = {30, 35, 15, 5, 10, 20, 25};
int m[N+1][N+1]; //为了方便,m[0][x]这一行与m[x][0]这一列不使用, m[i][j]表示矩阵Ai到矩阵Aj的最少(即最优)连乘次数, m[1][6]即为所求
int s[N+1][N+1]; //最优断开位置的数组
void MatrixChain(int *p, int n, int m[][N+1], int s[][N+1]);//计算m[i][j]数组
void Output(int (*m)[N+1], int (*s)[N+1], int n); //输出m[][]数组
void AddBrackets(int (*s)[N+1], int begin, int end); //输出加括号的方案
int main()
{
MatrixChain(p, N, m, s);
Output(m, s, N);
printf(The Best Times: %d\n, m[1][N]);
printf(The Best Locations: );
printf(Add Brackets: \n);
AddBrackets(s, 1, N);
return 0;
}
//计算m[i][j]数组
void MatrixChain(int *p, int n, int m[][N+1], int s[][N+1])
{
int loop, i, j, k, tmp, d=0; //d为步长
for(loop=n-1; loop=1; --loop)
{
++d;
for(i=1; i=loop; ++i)
{
j = i+d;
m[i][j] = INT_MAX;
for(k=i; kj; ++k)
{
tmp = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
if(tmp
文档评论(0)