码迷,mamicode.com
首页 > 编程语言 > 详细

算法 动态规划 ------最长公共子序列

时间:2017-09-29 21:22:37      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:错误   包括   图书馆   地方   blog   子序列   nbsp   个人   总结   

这篇博客是我 听完这位老师讲完课的 记录。https://www.youtube.com/watch?v=mgDUoITB24I&t=645s    还有我个人的理解,如果有错误或者有争议的地方,欢迎留言。谢谢大家~

技术分享

 

子序列  就是说 从原有列表中按照出现先后顺序从中选择部分 元素 组成的新的列表。

技术分享

 

最长公共子序列的含义:  选择两个列表中公共的子序列的最大长度,这个子序列即为最长公共子序列。

技术分享

用蛮力的方法求解,对于长度为 M的 列表,它所有的子序列的个数有  2^m  ,每个元素有两种情况,被选入子序列或者不被选入。

 

技术分享

 

接下来是  动态规划中非常重要的问题,子问题的界定。 对于 长度分别为 M, N的 子列表, 原始的问题是  长度 为 M,N两个子序列的最长子序列,那么,子问题是  对于 长度为M的子序列,我们取 X1到 Xi, 对于长度为 N的子序列,我们取  Y1到 Yj, 那么,由这个子问题界定的范围就是  上图中黄色区域所包括的范围。

在这里,我们看到子问题也有两个参数,一个是代表 x的最后的位置,一个是代表 y的最后的位置。这是两个不同序列的参数。

 

现在考虑 子问题 和  大问题 有着怎么样的依赖关系。 

技术分享

 

递推方程:

技术分享

 

注意,我们的目标是 求得最长的公共子序列,所以,当子问题中的两个序列最后的字符不相同,那么,我们就要 裁出  其中的一部分, 同时,要选择 使 子序列长度最大的区间走。

 

标记函数的目标是 追踪我们找到的最长子序列的路径。 我们最开始存的是最长公共子序列的最后那个元素。

技术分享

 

技术分享

 

注意: 我们的 C[i,j]存的是  子序列的长度,当  序列X或序列Y的长度为0,那么,最长的公共子序列的长度 C[i,j]当然为0

得到结果后,开始追踪解,也就是获得最长的公共子序列具体是哪些元素。

技术分享

 

来来来,看老师在课上给的例子。

技术分享

 

讨论下复杂度。空间+时间

 

技术分享

 

 

最后老师的总结:

技术分享

 

 

具体的代码 下次贴咯,在华科的图书馆,窗外下着小雨。学校广播台在放着不知名的音乐,是点歌节目。

 

算法 动态规划 ------最长公共子序列

标签:错误   包括   图书馆   地方   blog   子序列   nbsp   个人   总结   

原文地址:http://www.cnblogs.com/lixing-nlp/p/7612351.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!