- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2009-2010-2《算法分析》-7动态规划--2资料
最长公共子序列 两个一维事物比较: 相似 : LCS算法 比较 完全相等: 一一对应,概率算法等 相等 部分相等 :模式匹配----KMP算法 最长公共子序列: 应用:打字比赛(规则,中外区别) SARS病毒 文件比较等等 两个一维事物的比较 定义:与子串的区别 算法:穷举法,动态规划法 代码实现:用C 最长公共子序列的定义: 给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。 穷举法: 若要求两个序列X,Y的最长公共子序列, 先取得X,Y的所有子序列,并进行一一 比较,共有如下不同的组合: 共要进行不同的比较: 由此可见,2个序列的最长公共子序列包含了这2个序列的前缀的最长公共子序列。因此,最长公共子序列问题具有最优子结构性质。 时间复杂度: 由于在所考虑的子问题空间中,总共有θ(mn)个不同的子问题,因此,用动态规划算法自底向上地计算最优值能提高算法的效率。 例子:填充表格 从表中找出最长公共子序列的方法: (1)从(m,n) 到 (0,0) (2)若当前格与左边一格相同,则画“ ”; 若当前格与上边一格相同,则画“ ”; 上两者都不符合,从当前格到左上格画“ ” (3)从当前格向箭头方向前进一格,对此格进行(2) (4)从(m,n) 到 (0,0)的不同路径中,“ ”相对应的格的元素构成最长公共子序列。 找出最长公共子序列 求最长公共子序列 void LCS(char a[],int L[][],int m,int n) { int i,j,k; char c[m]; i=m;j=n;k=m; do { if(L[i][j]==L[i-1][j]) i--; else if(L[i][j]==L[i]j-1]) j--; else { c[k]=a[ii]; k--;i--;j--;} }while(i0j0); printf(“%s”,c+k+1); } 求最长公共子序列 时间复杂度为:m+n=O(n) 子串比较: G等搜索工具的目的是从信息海洋中进行串匹配查找。 最著名的子串匹配算法是KMP算法。 KMP算法利用关键词内部的相似特点,节省了时间复杂度:O(m+n) 数据结构中相关内容 矩阵连乘积问题 矩阵连乘积问题 矩阵连乘积可定义为: 给定n个矩阵 , 其中 与 是可乘的, 。考察这n个矩阵的连乘积 由于矩阵乘法满足结合律,所以计算矩阵的连乘可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。 矩阵连乘积问题 若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积。 设有四个矩阵 A,B,C,D,它们的维数分别是: A=50*10,B=10*40,C=40*30,D=30*5 总共有五中完全加括号的方式 (A((BC)D)) (A(B(CD))) ((AB)(CD)) (((AB)C)D) ((A(BC))D) 16000,10500,36000,87500,34500 回顾矩阵相乘: 回顾矩阵相乘: 单个乘法次数:n 单个加法次数:n-1 总的乘法次数:m*n*l 总的加法次数:m*(n-1)*l 矩阵连乘积问题 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 穷举法:列举出所有可能的计算次序,并计算出每一种计算次序相应需要的数乘次数,从中找出一种数乘次数最少的计算次序。 算法复杂度分析: 对于n个矩阵的连乘积,设其不同的计算次序为P(n)。由于每种加括号方式都可以分解为两个子矩阵的加括号问题:(A1...Ak)(Ak+1…An) 可以得到关于P(n)的递推式如下: 穷举法复杂度分析: 动态规划 将矩阵连乘积 简记为A[i:j] ,这里i≤j
文档评论(0)