我知道 LCS 问题需要时间 ~ O(m n) 其中 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] 的对角线块,因为如果 |ij|>Q,则意味着两个序列中已经有超过 Q 个不匹配的元素。所以我们只需要计算|ij|<=Q时的c[i,j]。