我想以数学方式计算LCS算法问题的递归关系。我的目的是应用主定理来计算复杂度O(2 ^ n)。
/* Returns length of LCS for X[0..m-1], Y[0..n-1] */
int lcs( char *X, char *Y, int m, int n )
{
if (m == 0 || n == 0)
return 0;
if(X[m-1] == Y[n-1])
return 1 + lcs(X, Y, m-1, n-1);
else
return max(lcs(X, Y, m, n-1), lcs(X, Y, m-1, n));
}
任何人都可以解释如何推动这种递归关系?
答案 0 :(得分:1)
重现关系是:
T(n,m) = T(n-1,m-1)+O(1), if (X[m-1] = Y[n-1])
or
T(n-1,m)+T(n,m-1)+O(1), otherwise
我们必须考虑最坏的情况,即:
T(n,m) = T(n-1,m)+T(n,m-1)+O(1)
贯穿始终。这将归结为:
T(n,m) <= 2^(n-1) T(0,m) + ... , if m<n (longest branch of height n)
or
2^(m-1) T(n,0) + ... , if n<m (longest branch of height m)
如果最长的分支长度为k,如果假设所有其他分支都是高度k,我们得到一个上限。 由于T(0,k)和T(k,0)都是常数,我们有
T(n,m) = O(2^(max(n,m)))
或
T(n,m) = O(2^n)
如果n和m相等。