计算最长公共子序列复杂度的数学递推关系
Posted
技术标签:
【中文标题】计算最长公共子序列复杂度的数学递推关系【英文标题】:Mathematic recurrence relation for calculating the complexity of the Longest Common Subsequence 【发布时间】:2013-03-08 09:39:26 【问题描述】:我想以数学方式计算 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));
任何人都可以解释如何推动这种重复关系?
【问题讨论】:
在最坏的情况下,当字符串不同时,在每次调用lcs()
时,您的工作量几乎翻了一番(您调用lcs()
2 次)。这会给您带来指数级的复杂性。
@AlexeyFrunze 你能给出这个的递归关系吗?
【参考方案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 相等。
【讨论】:
你能告诉我 n & m 是什么吗?它们是树的左/右分支吗?还有 X 和 Y 是从哪里来的? @Auston 请检查问题中提供的“int lcs(...)”函数以获得答案。以上是关于计算最长公共子序列复杂度的数学递推关系的主要内容,如果未能解决你的问题,请参考以下文章
HDU 1159 Common Subsequence 最长公共子序列