【发布时间】:2015-04-14 20:45:53
【问题描述】:
我一直在查看Eugene Myers' Diff Algorithm Paper。这是在流行的diff 程序中实现的算法。
在论文的第 12 页,它给出了算法的伪代码,用于查找 A 和 B 的最长公共子序列:
LCS(A, N, B, M)
If N > 0 and M > 0 Then
Find the middle snake and the length of an optimal path for A and B.
Suppose it is from (x, y) to (u, v).
If D > 1 Then
LCS(A[1..x], x, B[1..y], y)
Output A[x+1..u]
LCS(A[u+1..N], N-u, B[v+1..M], M-v)
Else If M > N Then
Output A[1..N].
Else
Output B[1..M].
假设 A = "A" 且 B = "B"。在这种情况下,N = 1 和 M = 1。中间的蛇将是 (x, y) = (0, 1) 和 (u, v) = (0, 1),因为没有对角线。在这种情况下,D = 1,因为算法只采取了一步。
算法说在这种情况下唯一要做的就是Output B[1..M],等于“B”,因为N > 0,M > 0,D = 1,并且M = N。但这似乎是错误的,因为“A”和“B”之间没有共同的子序列。该论文的评论“如果D
我在这里误解了什么?
【问题讨论】: