现在要计算矩阵链乘积A1A2A3A4A5A6其中各矩阵维数分别为4X33x55x88x 77x66x10则计算矩阵链乘积A1A2A3A4A5A6的最佳链乘次序。要求给出存储矩阵链乘开销的最优解的表m66和存储最优分裂位置的表S66
根据矩阵链乘的动态规划思路,可以先初始化存储矩阵链乘开销的最优解的表m和存储最优分裂位置的表S。其中,m[i][j]表示第i个矩阵到第j个矩阵的乘积的最小代价,S[i][j]表示第i个矩阵到第j个矩阵的乘积的最优分裂位置。
初始化m和S的对角线为0,即m[i][i]=0,S[i][i]=i。
接下来按照矩阵链乘的动态规划转移方程进行计算:
m[i][j] = min{m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]},其中i≤k<j,p[i-1]表示第i-1个矩阵的行数,p[k]表示第k个矩阵的列数,p[j]表示第j个矩阵的列数。
S[i][j] = argmin{m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]},其中i≤k<j,argmin表示取得最小值的k。
最终得到的m表和S表如下所示:
| | 1 | 2 | 3 | 4 | 5 | 6 | |---|---|---|---|---|---|---| | 1 | 0 |121|236|328|580|946| | 2 | | 0 |120|240|456|876| | 3 | | | 0 |280|420|840| | 4 | | | | 0 |420|720| | 5 | | | | | 0 |600| | 6 | | | | | | 0 |
| | 1 | 2 | 3 | 4 | 5 | 6 | |---|---|---|---|---|---|---| | 1 | 1 | 1 | 2 | 3 | 4 | 4 | | 2 | | 2 | 2 | 3 | 4 | 4 | | 3 | | | 3 | 3 | 4 | 4 | | 4 | | | | 4 | 4 | 4 | | 5 | | | | | 5 | 6 | | 6 | | | | | | 6 |
根据S表可以得到最佳链乘次序为(A1(A2(A3(A4(A5A6)))),其乘积的最小代价为946。
原文地址: https://www.cveoy.top/t/topic/bVNl 著作权归作者所有。请勿转载和采集!