zoukankan      html  css  js  c++  java
  • 作业8 矩阵乘法链

    1.     问题

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

    给定向量P,求出 一种乘法序列,使得基本运算的总次数达到最小。

    2.     解析

    主要用动态规划的策略来解决这个问题。因为要保存已经解决过的子问题,因此我们再引入一个值m[i,j],用来表示矩阵序列Ai…j所用的基本运算的最少次数。为了能够更好的应用子问题,因此我们再引入一个变量k,用来表示这个矩阵链的最后一次乘法运算的位置。因此我们可以得出递推方程

                   0     i = j

    m[i,j] =

                   min{m[i,k]+m[k+1,j]+Pi-1PkPj}其中i<=k<j   i<j   

    从最短的长度1即i = j开始计算,当i=1,j = n时,就可以得到整个矩阵乘法链的最小运算次数了。

    给定示例进行分析

    A1:20*50

    A2:50*70

    A3:70*5

    A4:5*10

    P = <20,50,70,5,10> n = 5

    (1)r = 1

    m[1,1] = 0

    m[2,2] = 0

    m[3,3] = 0

    m[4,4] = 0

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

    m[1,2] = 20*50*70 = 70000

    m[2,3] = 50*70*5 = 17500

    m[3,4] = 70*5*10 = 3500

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

    m[1,3]=min{m[1,1]+m[2,3]+A1(A2A3),min[1,2]+min[3,3]+(A1A2)A3}=min{0+17500+5000,70000+0+7000} = 22500 s[1,3] = 1

    m[2,4]=min{m[2,2]+m[3,4]+A2(A3A4),m[2,3]+m[4,4]+(A2A3)A4}=min{0+3500+35000,17500+0+2500}=20000 s[2,4]=3

    (4)r = 4 i = 1;j = 4

    m[1,4] = min{m[1,1]+[2,4]+A1(A2A3A4), m[1,2]+[3,4] +(A1A2)(A3A4), m[1,3]+[4,4] +(A1A2A3)A4} = min{0+20000+10000,70000+3500+14000,22500+0+1000} = 23500 s[1,4] = 3

    这时在s中就存储了序列的划分规则,通过s就可以得到最终结果了。

    3.     设计

    MatrixChain(p,n)

    给所有的m[i,j]赋值为0,

    For r = 2 to n do

           For I = 1 to n-r+1 do

                  J = i+r-1

                  m[I,j] = m[i+1,j]+Pi-1PkPj

                  s[I,j] = I;

                  for k = i+1 to j-1 do

                         t = m[i,k]+m[k+1,j]+Pi-1PkPj

                         if t < m[I,j]

                                m[I,j] = t

                                s[I,j] = k

    4.     分析

    算法的主要实现使用了迭代来实现,程序的主要结构就是三个循环,因此算法复杂度为O(n2)

    5.     源码

    https://github.com/fanchile/Algorithm

  • 相关阅读:
    电子商务概论【0351】
    数据库原理
    建筑结构CAD[0753]
    计算机图像处理基础[9124]
    计算机基础[1056]
    计算机组成原理【0013】
    C语言程序设计【0039】
    计算机基础1056
    专业英语[0089]
    double数据转换成char字符串的函数——dtostrf()用法
  • 原文地址:https://www.cnblogs.com/Fanchile/p/12702854.html
Copyright © 2011-2022 走看看