矩阵链乘法

矩阵链乘法

1.问题

设A1,A2,……,An为n个矩阵的序列,其中Ai为Pi-1×Pi阶矩阵,这个矩阵链的输入用向量P=<P0,P1,……,Pn>给出。

给定向量P,确定一种乘法次序,使得具备运算的总次数达到最小。

在这里插入图片描述

2.解析

Ai…j:表示矩阵链相乘的子问题Ai,Ai+1…Aj; M[i…j]:表示得到乘积Ai…j所用的最少基本运算次数;

假定最后一次相乘发生在矩阵链Ai…k Ak+1…j之间

在这里插入图片描述
满足优化原则。也就是说,m[i,j]最小值时,m[i,k],m[k+1,j]也是最小的。

实例:
在这里插入图片描述
以上述问题为例:
在这里插入图片描述

3. 设计

       for r from 2 to n     //r为当前问题规模(长度)for I from 1 to n-r+1 
                   j=i+r-1  //不同终点
                   m[i , j] = m[i+1,j]+P[i-1] * P[k]* P[j]       //划分为Ai(Ai+1…Aj),此时k=i
                   s[i , j] = i
            for k from i+1 to j-1
                   t =min (t, m[i, k]+m[k+1, j] + P[i-1]*P[k]*P[j]  //划分不同的位置
                   s[i,j]=k
void MatrixChain(int n)
{
 for (int r = 2; r <= n; r++) {               //r为当前问题规模(长度)
    for (int i = 1; i <= n - r + 1; i++) {    //i的起点不断变化,各种r长
     	int j = i + r - 1;                    //不同终点
   	m[i][j] = m[i + 1][j] + P[i - 1] * P[i] * P[j];//划分为Ai(Ai+1...Aj),此时k=i
   	s[i][j] = i;
   	for (int k = i+1; k <= j - 1; k++){
    		int t = m[i][k] + m[k + 1][j] + P[i - 1] * P[k] * P[j];
    		if (t < m[i][j]){
     		m[i][j] = t;
     		s[i][j] = k;
    		}
   	}
     }
   }
 }

4.分析

在这里插入图片描述

5.源码

https://github.com/Bacsonlx/Algorithm-analysis

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值