Ho esaminato Eugene Myers' Diff Algorithm Paper. Questo è l'algoritmo implementato nel popolare programma diff
.Algoritmo di diffusione di Eugene Myers: trovare la più lunga sequenza di "A" e "B"
A pagina 12 del documento, esso presenta la pseudo-codice per l'algoritmo per trovare la più lunga comuni sotto-sequenza di A
e 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].
Supponiamo che A = "A" e B = " B". In questo caso, N = 1 e M = 1. Il serpente medio sarebbe (x, y) = (0, 1) e (u, v) = (0, 1) perché non ci sono diagonali. In questo caso D = 1 perché l'algoritmo ha solo fatto un passo.
L'algoritmo dice che l'unica cosa da fare in questo scenario è Output B[1..M]
, uguale a "B", perché N> 0, M> 0, D = 1 e M = N. Ma questo sembra sbagliato, perché non esiste una sotto-sequenza comune tra "A" e "B". Il commento del paper che "Se D < = 1 allora B è ottenuto da A eliminando o inserendo al massimo un simbolo" non è corretto perché "A" deve essere rimosso e "B" aggiunto.
Cosa sto interpretando male qui?