matlab递归求解最长公共子序列(LCS)问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab递归求解最长公共子序列(LCS)问题相关的知识,希望对你有一定的参考价值。

我想用递归的方法写一个求解最长公共子序列(LCS)问题。先求最长公共子序列的长度。
X、Y为两个序列,c为长度
分两种情况
1、X和Y的最末尾一个字符一样 →砍掉最后一个字符,c(i)=c(i-1)+1
2、X和Y的最末尾一个字符不一样,分两种情况:
(1)砍掉X最末尾一个字符,
(2)砍掉Y最末尾一个字符
剩下的中取最长的。
递归基是其中一个序列为空,那么空序列的子序列一定为空
然后我写代码,写到情况2,我就写不下去了,不知道怎么写递归调用。
function lc=lcsf(X,Y)
lx=length(X);
ly=length(Y);
lc=0;
if (isempty(X)==1) || (isempty(Y)==1)%序列两者中有一个为空
return;%抵达递归基
elseif X(lx)==Y(ly)%X、Y的最后一个字符做比较
lc=lc+1;%c长度增加1
lx=lx-1;
ly=ly-1;%两个都砍掉最后一个字符
elseif X(lx)~=Y(ly)
c(i)=max(lcsf(X(1:lx-1),Y),lcsf(X,Y(1:ly-1)));%这里不会
end
end
应该怎么写?谢谢!
我好像会了
function lc=lcsf(X,Y)
%用递归的方法求最长公共子序列的长度
%X、Y是输入的序列
%lc是输出的最长公共子序列的长度
lx=length(X);
ly=length(Y);
if (isempty(X)==1) || (isempty(Y)==1)
lc=0;%递归基
elseif X(1)==Y(1)%X、Y的最后一个字符做比较
lc=lcsf(X(2:lx),Y(2:ly))+1;%情况一的递归表达式!
elseif X(1)~=Y(1)
lc=max(lcsf(X(2:lx),Y),lcsf(X,Y(2:ly)));%情况二的递归表达式!
end
end

参考技术A 用递归不好,时间慢;递归是VC的做法,MATLAB与VC不同啊,它就是用矩阵来运算的;追问

我知道。但是在看数据结构,里面介绍了LCS的几种算法,都想自己写一写。对VC不如对MATLAB熟悉,所以一直用MATLAB写。

最长公共子序列(LCS),求LCS长度和打印输出LCS

主要参考:

算法导论-----最长公共子序列LCS(动态规划)

其中,理解递推公式之后,要理解代码中的c数组 是怎么变化的(结合下面这个图的过程,过程为:每一行,从左到右)

技术分享

该文章中,打印LCS的过程(C语言,包括递归和非递归版本)也容易看懂。

Java版本可以参考:最长公共子串、最长公共子序列的Java实现与NLP应用

但打印这一部分看得不太懂:

int i = 0, j = 0;
while (i < substringLength1 && j < substringLength2)
{
     if (str1[i] == str2[j])
      {
            System.out.print(str1[i]);
            i++;
            j++;
      }
       else if (opt[i + 1][j] >= opt[i][j + 1])
             i++;
        else
              j++;
}
System.out.println();

不如看上一篇C语言的打印,递归和非递归都很清楚

以上是关于matlab递归求解最长公共子序列(LCS)问题的主要内容,如果未能解决你的问题,请参考以下文章

最长公共子序列和最长公共子串

动态规划求解最长公共子序列问题

最长公共子序列(LCS)

最长公共子串和最长公共子序列(LCS问题)

最长公共子串和最长公共子序列(LCS问题)

最长公共子序列(LCS),求LCS长度和打印输出LCS