第3章动态规划1

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 通过上两步的结果可以得到所有矩阵链长度为3的 子问题的最优计算量
………………………………
Software College, NEU
21
例3-2 设要计算矩阵连乘积A1A2A3A4A5A6 , 其中各矩阵的维数分别为
A1
A2
A3
A4
A5
A6
30×35 35×15 15×5 5×10 10×20 20×25
9
3.1矩阵连乘问题
两个矩阵的乘法
void MatrixMultiply(int **a, int **b, int **c, int ra, int ca, int rb, int cb)
{ if(ca! = rb ) error(“矩阵不可乘”); for(int i = 0; i < ra; i ++) for(int j = 0; j < cb; j ++) { int sum = a[i][0]* b[0][j]; for(int k = 1; k < ca; k ++) sum + = a[i][k]* b[k][j]; c[i][j] = sum; }
T (n) 1O(1kn)11 (T (k) T (n k) 1)
因此,当n>1时,
n 1 n 1
n1
n1
n1
T (n) 1 (n 1) T (k) T (n k) n 2T (k)
k 1
k 1
k 1
可用数学归纳法证明 T (n) 2n1 (2n )
Software College, NEU
第3章 动态规划 Dynamic
Programming
Software College, NEU
1
本章主要内容
矩阵连乘问题 Matrix-Chain Multiplication 动态规划算法的基本要素 Elements of Dynamic Programming 流水作业调度 Scheduling to Maximize Profit 0-1背包问题 0-1 knapsack problem 最优二叉搜索树 Optimal Binary Search Trees
3······34······42······23······3
2······2 3······3 1······1 2······2
Software College, NEU
16
3.1矩阵连乘问题
• 可以证明该算法的计算时间T(n)有指数下界, 设算法中判断语句和赋值语句花费常数时间, 则由算法的递归部分可得关T(n)的递归不等 式如下:
• 总计算量为A[ 1: k ]的加上A[ k+1: n ]的计 算量,再加上A[ 1: k ]和A[ k+1: n ]相乘的 计算量。
Software College, NEU
12
3.1矩阵连乘问题
最优子结构特征
• 计算A[1:n]的一个最优次序所包含的计算矩 阵子链A[1:k]和A[k+1:n]的次序也是最优的。
Software College, NEU
22
3.1矩阵连乘问题 3.计算最优值
void MatrixChain(int p, int n, int * *m, int * *s)
{ for (int i=1; i<=n; i++) m[i][i]= 0 ;//单个矩阵的计算量
for (int r=2; r<=n; r++) {//r为每次循环矩阵链的长度
}
Software College, NEU
10
3.1矩阵连乘问题
穷举搜索法
• 对于n个矩阵的连乘积,设有p(n)个计算次序。我们 可以在第k个和第k+1个矩阵之间将原矩阵划分为两 个子矩阵序列,然后分别对这两个矩阵子序列完全加 括号,最后对所得的结果加括号,则
P(n)
n1
P(k
1 )P(n
k
Software College, NEU
2
动态规划算法
例3-1 Fibonacci numbers
F(n)=
1
n=0
1
n=1
F(n-1)+F(n-2) n>1
F(4)
F(3)
F(2)
F(2)
F(1) F(1)
F(0)
F(1)
F(0)
Software College, NEU
3
Computing the nth fibonacci number using bottom-up iteration:
则共需要pqr次数乘。
A1, A2, A3大小分别为10×100,100×5,5×50,
(A1( A2 A3)), ((A1A2) A3)的结果相同,都是10×50的 矩阵,计算量分别为75000,7500。
Software College, NEU
8
3.1矩阵连乘问题
完全加括号的矩阵连乘积 – 单个矩阵是完全加括号的; – 矩阵连乘积A是完全加括号的,则A可表示为2个完
Software College, NEU
20
3.1矩阵连乘问题
3.计算最优值
计算m[ i ][ j ]时,只用到已计算出的m[ i ][ k ]和 m[ k+1 ][ j ]
• 置所有只有一个矩阵的矩阵链计算量为0,即 m[i][i]=0, i=1,2,···,n。
• 通过上一步的结果可以得到所有矩阵链长度为2的 子问题的最优计算量。
for (int i=1; i<= n – r + 1 ; i++) {
int j=i+r-1;
取第一个可 取位置,即 断开位置为i
循环取k 的可取
位置
m[i][j]= m[i+1][j]+p[i-1]*p[i]*p[j]; s[i][j]=i; for (int k=i+1; k<j; k++)
{ int t= m[i][k]+ m[k+1][j]+ p[i-1]*p[k]*p[j];
• 矩阵连乘积计算次序问题的最优解包含着其 子问题的最优解,也就是最优子结构性质。
考虑A[1:k ]和A[k+1:n]相乘所需的 计算量,A[ i: k ]和A[ k+1:j ]相乘呢?
A[1:k ]的结果为r1*rk的 矩阵,A[k+1:n]的结果 为rk+1*rn的矩阵,则它们 相乘的计算量为p1*pk*pn
+p[i-1]*p[i]*p[j];
s[i][j]=i;
for(int k=i+1; k<j; k++)
{
记 录
int t=RecurMatrixChain(i,k)+RecurMatrixChain(k+1,j) +p[i-1]*p[k]*p[j];

if (t<u)

{

u=t;
循环取k的可取

j
i
1
2
3
4
5
6
1.
0 15750 7875 9375 11875 15125
2.
0
2625 4375 7125 10500
3.
0
750 2500 5375
4.
0
1000 3500
5.
0 5000
6.
0
m[1][1] + m[2][3]+p0p1p3=7875
m[1][3]=min
m[1][2] + m[3][3] + p0p2p3=18000
对于m[1][n]可以按照下面顺序构成 m[1][2] m[2][3] m[3][4] m[4][5] …… m[n-1][n] m[1][3] m[2][4] m[3][5] …… m[n-2][n] m[1][4] m[2][5] m[3][6]…… m[n-3][n]
m[1][n-1] m[2][n] m[1][n]
s[i][j]=k;
断开位置

}
置}
return u;
}
Software College, NEU
15
3.1矩阵连乘问题
递归树
1······4
1······1
2······4
1······2
源自文库
3······4
1······3
4······4
2······2 3······42······34······4 1······1 2······2 3······3 4······41······12······3 1······2 3······3
• f(0) = 0 • f(1) = 1 • f(2) = 0+1 = 1 • f(3) = 1+1 = 2 • f(4) = 1+2 = 3 • f(5) = 2+3 = 5 • • •f(n-2) = • f(n-1) = • f(n) = f(n-1) + f(n-2)
Software College, NEU
m[ i ][ j ]=m[ i ][ k ] + m[ k+1 ][ j ] + pi-1pkpj k∈ { i, i+1, ···, j-1 }
m[i][
j]
0 mikin j{m[i][k]
m[k
1][
j]
pi1
pk
pj}
i j i j
Software College, NEU
14
3.1矩阵连乘问题 取第一个断开位
Software College, NEU
13
3.1矩阵连乘问题
2.建立递归关系
• 设计算A[ i: j ]所需的最少次数为m[i][j],原问题的最 优解为m[1][n]。
• 当 i = j 时: A[ i : j ]= Ai ,m[ i ][ i ] = 0,i=1,2,···,n。
当 i < j 时:
置时计算量
采用递归方参法加运计算矩算阵链起始位置
int RecurMatrixChain( int i, int, j, int p[])
矩阵链终止位置
{
if ( i==j ) return 0;
int u=RecurMatrixChain(i, i)+RecurMatrixChain(i+1,j)
Software College, NEU
6
3.1 矩阵连乘问题 Matrix-Chain Multiplication
问题提出
给定n个矩阵{A1, A2, …, An},其中Ai 是 一个ri-1×ri 矩阵( 1≤i≤n),即Ai×Ai+1是 可乘的,求出n个矩阵相乘的最优计算 次序,使得计算量最小。
)
n 1 n 1
k1
• 其中P(n)=C(n-1),
C(n)
1 n 1
2n n
(4n
/
3
n2
)
Software College, NEU
11
3.1矩阵连乘问题
1.分析最优解的结构
• 设A[ i: j ]为矩阵连乘积AiAi+1···Aj
• 计算A[1: n]的最优次序,设该次序在矩阵 Ak和Ak+1之间断开,1≤k<n,则完全加括号 方式为((A1···Ak) (Ak+1···An))
17
3.1矩阵连乘问题
• 对于1≤i ≤j ≤n,不同的有序对(i,j)对应于不同的子 问题m[i][j],因此,不同的子问题的个数最多只有
n 2
n
(n2
)
• 用动态规划解此问题时,在计算过程中,保存已解
决的子问题答案,每个子问题只计算一次,而在后
面用到时简单地查一下,从而避免了大量的重复计
算。
Software College, NEU
18
3.1矩阵连乘问题
3.计算最优值
1······4
1······3
2······4
1······2
2······3
3······4
1······1
2······2
3······3
4······4
Software College, NEU
19
3.1矩阵连乘问题
3.计算最优值
计算m[ i ][ j ]时,只用到已计算出的m[ i ][ k ]和 m[ k+1 ][ j ]
4
动态规划算法
算法思想
将待求解的问题分解成若干个子问题, 先求解子问题,并存储子问题的解
而避免计算重复的子问题,再由子
问题的解得到原问题的解。
Software College, NEU
5
动态规划与分治的联系区别
• 都是分解成子问题,由子问题的解得到原 问题的解。
• 分治中子问题相互独立,而动态规划中子 问题互相有联系,且存在重复计算,即存 在重叠子问题。
全加括号的矩阵连乘积B和C的乘积并加括号,即 A=(BC)。
考虑n=4 的情况,此时矩阵运算A*B*C*D可按
以下方式(顺序)计算(完全加括号方式):
A* ( (B*C) *D) , A* (B* (C*D)) , (A*B) * (C*D) , (A* (B*C) ) *D
Software College, NEU
设三个矩阵A1, A2, A3大小分别为10×100,
100×5,5×50,考虑(A1( A2 A3)), (A1A2) A3)的 结果与相乘的次数。
Software College, NEU
7
3.1矩阵连乘问题
矩阵相乘满足结合律,连乘积可以有许多不同的次序。 这种次序可以用加括号的方式确定。 考查两个矩阵相乘的情形:C=AB。如果矩阵A,B分 别时p×r和r×q 矩阵,则它们的乘积C 将是p×q 矩 阵,其(i, j)元素为
相关文档
最新文档