资源简介 (共16张PPT)数据结构与算法效率1 斐波那契数列为什么用动态规划算法?3 最长公共子序列动态规划算法如何用?5.1数据结构与算法效率2 最长递增子序列什么是动态规划算法?1第1项1第2项2第3项3第4项?第5项 第100项……为什么n的值越大输出越慢??第40项……(1)问题呈现1.斐波那契数列第1项第2项2第3项3第4项?第5项 第100项……为什么n的值越大输出越慢??第40项……F(5)F(4)F(3)F(2)F(1)F(3)F(2)F(2)F(1)F(3)F(3)程序存在重复计算!O(2n)F(2)F(2)F(2)(2)问题分析1.斐波那契数列第1项第2项2第3项3第4项?第5项 第100项……如何提高算法的效率??第40项……将函数的值记录下来。(3)问题解决1.斐波那契数列第1项第2项2第3项3第4项?第5项 第100项……?第40项……S[i]记录函数F(i)的值,减少重复计算。★递推 + 记录(空间换时间)(4)程序实现1.斐波那契数列例1 求最长递增子序列的长度。如:nums = [1,7,5,6,8,2]最长递增子序列为[1,5,6,8],其长度为4。(1)问题分析2.最长递增子序列设L(i)表示以nums[i]结尾的最长递增子序列的长度L(5) [1,2],[2] [1,2] 2L(4) [1,8],[1,7,8],[1,5,8],[1,5,6,8],[8] [1,5,6,8] 4L(3) [1,6],[1,5,6],[6] [1,5,6] 3L(2) [1,5],[5] [1,5] 2L(1) [1,7],[7] [1,7] 2L(0) [1] [1] 1③求出最大值递增最长长度L(4) [1,8],[1,7,8],[1,5,8],[1,5,6,8],[8] [1,5,6,8] 4最优解最优子结构①列出②找出L(5)L(3)L(2)L(1)L(0)L(4)××××L(4)L(3)L(2)L(1)L(0)L(3)L(2)L(1)L(0)×L(2)L(1)L(0)L(2)×L(0)L(1)L(2)L(1)L(0)L(2)×L(5) = max({L(0)}) +1L(4) = max({L(0),L(1), L(2), L(3))+1L(3) = max({L(0), L(2)})+1L(2) = max({L(0)})+1L(1) = max(L(0))+1L(0) = 1max(L(j))+1 , 0≤j1, 其他情况求最大值L(i) =(2)抽象建模例1 求最长递增子序列的长度。如:nums = [1,7,5,6,8,2]最长递增子序列为[1,5,6,8],其长度为4。L(2)L(2)自顶向下分析,计算L(i)需要用到L(j)的值,自底向上实现,先计算较小的L(j)再计算较大的L(i)。2.最长递增子序列动态规划算法将一个问题划分成较小规模的子问题,先解决小规模的子问题,使用数组或列表存储动态产生的结果,需要这个结果时无须重新计算就能直接使用。特点:(1)重复子问题(2)最优子结构动态规划算法应用:组合优化问题。(3)设计算法2.最长递增子序列例1 求最长递增子序列的长度。如:nums = [1,7,5,6,8,2]最长递增子序列为[1,5,6,8],其长度为4。(3)设计算法d[i]记录函数L(i)的值,减少重复计算。★递推 + 记录(空间换时间)2.最长递增子序列175682nums[i]d[i]i10 1 2 3 4 511i725682234275682iiii (4)程序实现2.最长递增子序列3.最长公共子序列(1)问题分析例2 求最长公共子序列的长度。(教材P49)如:S1为 TAGCCTAGCGS2为 TACAGA最长的公共子序列是TACAG,长度为5。选取部分进行分析,X序列:CCTA,Y序列:TACA(2)抽象建模选取部分进行分析,X序列:CCTA,Y序列:TACA设LCS(Xi,Yj)表示序列X的前i个元素和序列Y的前j个元素的最长公共子序列长度0 , i=0或j=0LCS(Xi-1,Yj-1)+1, i,j>0 且 Xi=Yjmax(LCS(Xi-1,Yj), LCS(Xi,Yj-1)) i,j>0 且 Xi≠YjLCS(Xi,Yj) =计算LCS(Xi,Yj)需要用到LCS(Xi-1,Yj-1)、 LCS(Xi-1,Yj)、 LCS(Xi,Yj-1)的值先计算较小的子问题的最优解,再计算较大的子问题的最优解。LCS(X3,Y3)LCS(X2,Y2)LCS(X1,Y2)LCS(X2,Y1)LCS(X2,Y0)LCS(X1,Y1)LCS(X0,Y1)LCS(X0,Y1)LCS(X1,Y0)LCS(X0,Y1)LCS(X0,Y1)3.最长公共子序列[练一练]请暂停视频,写出函数的形式化表达。T A C A0 0 0 0 0C 0C 0T 0A 0(3)设计算法LCS[i][j]记录LCS(Xi,Yj)值,减少重复计算。if X[i] == Y[j]: LCS[i][j] = LCS[i- 1][j - 1] + 1if X[i] != Y[j]: LCS[i][j] = max(LCS[i - 1][j],LCS[i][j-1])↑0011最长公共子序列为TA或CA,长度为2。↑00111111↑12223.最长公共子序列0 1 2 3 40 1 2 3 4(4)程序实现3.最长公共子序列动态规划算法小问题推大问题大问题分小问题算法思想重复子问题最优子结构适用范围自顶向下分析自底向上实现求解步骤斐波那契数列最长递增子序列最长公共子序列应用实例 展开更多...... 收起↑ 资源预览