Я рассматривал Eugene Myers' Diff Algorithm Paper. Это алгоритм, реализованный в популярной программе diff
.Алгоритм диффузии Юджина Майерса: поиск самой длинной общей подпоследовательности «A» и «B»
На 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» и 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. Но это кажется неправильным, потому что нет общей подпоследовательности между «А» и «В». Комментарий к статье: «Если D < = 1, то B получается из A путем удаления или вставки не более одного символа» неверно, потому что «A» необходимо удалить и добавить «B».
Что я неправильно интерпретирую здесь?