LCS问题的深入探讨
2018-02-25 14:17
323 查看
在上一篇博客中我简单的说明了LCS的算法原理和DP方程,但这是远远不够的,我们还要考虑如何实现。
观察这个DP方程,我们感觉它的结构类似于树,就像这样:
我们可以用搜索的方法来求解,但是会有许多重复。
就像上图中(6 4)被搜了两遍,也许后面还会搜到。
大量的重复会导致效率的降低,所以我们要设计一种解决方法。
这种解决方法叫做备忘法,其实很简单,就好像你做了一个备忘录,每次搜索时都查询一次这个点是否搜过,如果搜过就不必再搜了。
这是代码:
其实没啥改动。
这种方法能有效的避免重复。
当然还有一种方法,那就是自底而上的搜(在树上可以这么说,实际就是递推)。
我们先列个表格:
这表格确实丑。。
这个表格是从上到下一行一行推过去的,每个点只与他上面,左面的,左上方的三个点有关系。
(这种顺序在树上确实是从底到上的。)
这一点符合动态规划的原理,所以说这种方法才是真正的动态规划。(这种比较充分体现了动态规划的高效)。
oh yes!
溜了。。。。
观察这个DP方程,我们感觉它的结构类似于树,就像这样:
我们可以用搜索的方法来求解,但是会有许多重复。
就像上图中(6 4)被搜了两遍,也许后面还会搜到。
大量的重复会导致效率的降低,所以我们要设计一种解决方法。
这种解决方法叫做备忘法,其实很简单,就好像你做了一个备忘录,每次搜索时都查询一次这个点是否搜过,如果搜过就不必再搜了。
这是代码:
LCS(i,j) { if(c[i][j]==nil)//说明没有搜过; then if(x[i]=y[j]) then c[i][j]=LCS(i-1,y-1)+1; else c[i][j]=max(LCS(i-1,j),LCS(i,j-1));//两种情况; return c[i][j]; }
其实没啥改动。
这种方法能有效的避免重复。
当然还有一种方法,那就是自底而上的搜(在树上可以这么说,实际就是递推)。
我们先列个表格:
这表格确实丑。。
这个表格是从上到下一行一行推过去的,每个点只与他上面,左面的,左上方的三个点有关系。
(这种顺序在树上确实是从底到上的。)
这一点符合动态规划的原理,所以说这种方法才是真正的动态规划。(这种比较充分体现了动态规划的高效)。
oh yes!
溜了。。。。
相关文章推荐
- 【转载文章】拜占庭将军问题深入探讨
- 拜占庭将军问题深入探讨
- 单例模式(5)- Java单例对象同步问题深入探讨
- 通过案例深入探讨PHP中的内存管理问题
- [share]深入探讨PHP中的内存管理问题
- 深入探讨各种背包算法问题
- [share]深入探讨PHP中的内存管理问题
- "top k"问题的深入探讨
- 深入探讨oracle字符编码问题,关于NLS_LANG
- css中margin:0 auto居中问题深入探讨
- 深入探讨PHP中的内存管理问题
- 深入探讨如何解决数据库中的死锁问题
- 庄子“知”问题的深入探讨(转载)
- 函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
- 拜占庭将军问题深入探讨
- 【Box2D】深入探讨Box2D中ghost collision问题解决方案
- 深入理解 Oracle 分区(2):分区方案中常见问题探讨
- 整体刷新和局部刷新frameset窗口问题深入探讨
- 拜占庭将军问题深入探讨
- [转]通过案例深入探讨PHP中的内存管理问题