Micro-ottimizzazione per il calcolo della distanza di modifica: è valida?


10

Su Wikipedia , viene fornita un'implementazione per lo schema di programmazione dinamica dal basso verso l'alto per la distanza di modifica. Non segue completamente la definizione; le cellule interne sono calcolate così:

if s[i] = t[j] then  
  d[i, j] := d[i-1, j-1]       // no operation required
else
  d[i, j] := minimum
             (
               d[i-1, j] + 1,  // a deletion
               d[i, j-1] + 1,  // an insertion
               d[i-1, j-1] + 1 // a substitution
             )
}

Come puoi vedere, l'algoritmo sceglie sempre il valore dal vicino in alto a sinistra in caso di corrispondenza, salvando alcuni accessi alla memoria, operazioni ALU e confronti.

Tuttavia, l'eliminazione (o l'inserimento) può comportare un valore inferiore , pertanto l'algoritmo è localmente errato, ovvero si rompe con il criterio di ottimalità. Ma forse l'errore non cambia il risultato finale: potrebbe essere annullato.

Questa micro-ottimizzazione è valida e perché (no)?

Risposte:


6

Non penso che l'algoritmo sia difettoso. Se vengono abbinate due stringhe, confrontiamo prima i suoi ultimi due caratteri (e quindi ricorrono). Se sono uguali, possiamo abbinarli per ottenere un allineamento ottimale. Ad esempio, considera le stringhe teste testat. Se non abbini le ultime due ts, allora una delle ts rimane ineguagliata, poiché altrimenti la tua corrispondenza sarebbe simile a questa:

inserisci qui la descrizione dell'immagine

Questo è impossibile, dal momento che le frecce non possono "incrociarsi". L'abbinato tinduce diversi inserti (caselle verdi nella figura), come illustrato a sinistra:

inserisci qui la descrizione dell'immagine

Ma poi puoi semplicemente trovare un altrettanto buon allineamento, raffigurato a destra. In entrambi i casi abbini a te hai due inserti.

L'argomento per la sostituzione di uno degli ultimi ts è lo stesso. Quindi, se si sostituisce una delle ultime ts, è possibile invece abbinare le ultime due t e ottenere un migliore allineamento (vedere l'immagine).

inserisci qui la descrizione dell'immagine


Ah, un argomento top-down per un problema bottom-up. Bello!
Raffaello
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.