zoukankan      html  css  js  c++  java
  • 动态规划实现矩阵链乘法问题

    矩阵链乘法问题( matrix-chain multiplication problem  )

      (1)问题描述

      给定n个矩阵的链<A 1 ,A 2 ,…,A n >,其中i=1,2,…,n,矩阵A i的维数为p i-1 ×p i 。求一个完全“括号化方案”,使得计算乘积A 1 A 2 …A n 所需的标量乘法次数最小
      (2)最优括号化方案的结构特征

      用记号 A i,j 表示 A i A i+1 …A j 通过加括号后得到的一个最优计算模式,且恰好在A k 与A k+1 之间分开。则“前缀”子链A i A i+1 …A k 必是一个最优的括号化子方案,记为A i,k ;同理“后缀”子链A k+1 A k+2 …A j 也必是一个最优的括号化子方案,记为A k+1,j。

      (3)一个递归求解的方案

      对于矩阵链乘法问题,我们将所有对于1≤i≤j≤n确定A i A i+1 …A j 的最小代价括号方案作为子问题。令m[i,j]表示计算矩阵A i,j 所需要的标量乘法的次数最小值,则最优解就是计算A i...n所需的最低代价就是m[1,n] 

      递归定义m[i,j]。

      ①对于i=j的情况下,显然有m=0,不需要做任何标量乘法运算。所以,对于所有的i=1、2......n,m[i,i] = 0.

      ②当i < j的情况,就按照最优括号化方案的结构特征进行计算m[i,j]。假设最优括号化方案的分割点在矩阵Ak和Ak+1之间,那么m的值就是Ai...k和Ak+1...j的代价加上两者量程的代价的最小值。即。该公式的假设是最优分割点是已知的,但是实际上不知道。然而,k只有j-i中情况取值。由于最优分割点k必定在i~j内取得,只需要检查所有可能的情况,找到最优解即可。可以得出一个递归公式

      

      m只是给出了子问题最优解的代价,但是并未给出构造最优解的足够信息(即分割点的位置信息)。所以,在此基础之上,我们使用一个二维数组s[i,j]来保存 A i A i+1 …A 的分割点位置k。

      (4)我们采用自底向上表格方法来代替上述递归公式算法来计算最优代价。过程中假定矩阵A的规模为Pi-1Xpi,输入是一个序列p=<p0,p1,......,pn>,长度为p.length = n+1.其中使用一个辅助表m来记录代价m[i,j],另一个表s来记录分割点的位置信息,以便于构造出最优解。

      

      简单介绍一下算法:首先在3~4行对所有的i=1、2......n计算m[i,i]=0。然后在5~13行中的第一个for循环,使用(3)中的递归公式对所有的i=1~n-1计算m[i,i+1](长度为l=2的最小计算代价)的值。在第二个循环中,对所有的i=i~n-2计算m[i,i+2](长度为l=3的链的最小计算代价)的值。到最后,10~13行中计算代价m[i,j]的时候仅仅依赖于上面计算的表项m[i,k]和m[k+1,j]

      (5)给一个简单的例子 

      ①给出一个n=6的矩阵如下图所示

       

      ②由上述表我们按照下面这样的计算方式来得到m[i,j]所对应的表,下图所示的表格中代表的m[i,j]的最小值

      

      ③可以得到下面这样一张表

      首先将矩阵化为一张一维数组表

      

      ④简单结算其中的一些表项,给出一个m[1,3]的值的计算过程如下:

      

      可以得出上面的比较小的分割点为1,所以s[1,3] = 1。

      

      可以得出分割点的位置为s[2,5] = 3。

      上面给出了一个简单的两个点的计算。下图是计算完成的矩阵m和s

      

       由上面表s可以得到,最优解为(A1(A2A3))((A4A5)A6)

  • 相关阅读:
    阿里云 redis 通过rinetd 进行端口透传
    Linux文件系统的实现
    门外汉的IT
    被解放的姜戈05 黑面管家
    被解放的姜戈04 各取所需
    被解放的姜戈03 所谓伊人
    统计Go, Go, Go
    被解放的姜戈02 庄园疑云
    被解放的姜戈01 初试天涯
    亚马逊云架设WordPress博客
  • 原文地址:https://www.cnblogs.com/fsmly/p/10228767.html
Copyright © 2011-2022 走看看