您的位置:首页 > 其它

LCS问题的深入探讨

2018-02-25 14:17 323 查看
在上一篇博客中我简单的说明了LCS的算法原理和DP方程,但这是远远不够的,我们还要考虑如何实现。



观察这个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!

溜了。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: