【发布时间】:2014-12-09 15:36:58
【问题描述】:
我知道 LCS 问题需要时间 ~ O(mn) 其中 m 和 n 分别是两个序列 X 和 Y 的长度。但我的问题稍微容易一些,所以我希望算法比 ~O(mn) 更快。
这是我的问题:
输入:
一个正整数Q,两个序列X=x1,x2,x3.....xn 和Y=y1,y2,y3...yn,长度均为n。
输出:
如果 X 和 Y 的 LCS 的长度至少为 n - Q,则为真;
否则为假。
众所周知的算法在这里花费 O(n^2),但实际上我们可以做得更好。因为每当我们在任一序列中消除多达 Q 个元素而没有找到共同元素时,结果都会返回 False。有人说应该有O(Q*n)这样好的算法,但我想不通。
更新: 已经找到答案了!
有人告诉我我可以只计算表 c[i,j] 的对角线块,因为如果 |i-j|>Q,则意味着两个序列中已经有超过 Q 个不匹配的元素。所以我们只需要计算|i-j|
【问题讨论】:
-
所以本质上你只需要找到一个长度为 n-Q 的公共子序列,所以我们知道它必须从第一个 Q+1 位置开始。这一定会有所帮助。
标签: algorithm computer-science dynamic-programming lcs