码迷,mamicode.com
首页 > 其他好文 > 详细

矩阵链乘法

时间:2021-06-23 16:44:29      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:min   解析   algo   targe   原则   tar   最小值   stat   string   

矩阵链乘法

1.问题

设A1,A2,A3,…,An为 n 个矩阵的序列,其中Ai为Pi-1*Pi阶矩阵,这个矩阵链的输入用向量P=<P0,P1,…,Pn>给出。
给定向量 P,确定一种乘法次序,使得基本运算的总次数达到最小。

2.解析

蛮力法

枚举所有可能的乘法次序,针对每种次序计算基本运算的次数,从中找出具有最小运算次数的乘法次序,每一种乘法次序对应了一种 在n个项中加n-1对括号。

动态规划法

Ai..j表示矩阵链相乘的子问题AiAi+1...Aj;

m[i..j] 表示得到乘积Ai..j所用的最少基本运算次数;

满足优化原则,即m[i,j]最小值时,m[i,k]和m[k+1,j]也是最小的。

实例:P=<30,35,15,25,10,5>,n=5

A1=30*35

A2=35*15

A3=15*25

A4=25*10

A5=10*5

(1)r=1

m[1,1]=0

m[2,2]=0

m[3,3]=0

m[4,4]=0

m[5,5]=0

(2)r=2,i=1,2,3,4 ;j=2,3,4,5

m[1,2]=303515=15750

m[2,3]=351525=13125

m[3,4]=152510=3750

m[4,5]=25105=1250

(3)r=3,i=1,2,3 ;j=3,4,5

m[1,3]=min{m[1,2]+m[3,3]+(A1A2)A3, m[1,1]+ m[2,3]+A1(A2A3)}

m[2,4]=min{m[2,3]+m[4,4]+(A2A3)A4, m[2,2]+ m[3,4]+A2(A3A4)}

m[3,5]=min{m[3,4]+m[5,5]+(A3A4)A5, m[3,3]+ m[4,5]+A1(A2A3)}

(4)r=4,i=1,2 ;j=4,5

m[1,4]=min{ m[1,1]+ m[2,4]+A1(A2A3A4), m[1,2]+ m[3,4]+(A1A2)(A3A4),m[1,3]+ m[4,4]+(A1A2A3)A4};

m[2,5]=min{ m[2,2]+ m[3,5]+A2(A3A4A5), m[2,3]+ m[4,5]+(A2A3)(A4A5),m[2,4]+ m[5,5]+(A2A3A4)A5};

(5)r=5,i=1 ;j=5

m[1,5]=min{m[1,1]+m[2,5]+A1(A2A3A4A5),m[1,2]+m[3,5]+(A1A2)(A3A4A5),m[1,3]+m[4,5]+(A1A2A3)(A4A5),m[1,4]+ m[5,5]+ (A1A2A3A4)A5};

3.设计

第K小问题

    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        for (int i = 0; i <= n; i++)
        {
            p[i] = scan.nextInt();
            m[i][i] = 0;
        }
 
        for (int l = 2; l <= n; l++)
        {
            for (int i = 1; i <= n - l + 1; i++)
            {
                int j = i + l - 1;
                m[i][j] = MAX;
                for (int k = i; k <= j - 1; k++)
                {
                    int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
                    if (q < m[i][j])
                    {
                        m[i][j] = q;
                        s[i][j] = k;
                    }
                }
            }
        }
        print(1, n);
        System.out.printf(" %d\n", m[1][n]);
    }
 

4.分析

T(n)=O(n3)

5.源码

https://github.com/JessySnow/Algorithm/blob/master/src/T8/matrix.java

矩阵链乘法

标签:min   解析   algo   targe   原则   tar   最小值   stat   string   

原文地址:https://www.cnblogs.com/jessysnow/p/14920742.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!