Complessità dello spazio per calcolare l'allineamento ottimale della stringa per la distanza di modifica di Levenshtein


12

Se ci vengono date due stringhe di dimensione e n 2 , il calcolo standard della distanza di modifica di Levenshtein avviene mediante un algoritmo dinamico con complessità temporale O ( n 1 n 2 ) e complessità spaziale O ( n 1 n 2 ) . (Alcuni miglioramenti possono essere apportati in funzione della distanza di modifica d , ma non ipotizziamo dn1n2O(n1n2)O(n1n2)ddessendo particolarmente piccolo.) Se ti interessa solo il valore della distanza di modifica (ovvero il numero minimo di modifiche), un noto miglioramento del solito algoritmo (in cui mantieni solo la riga precedente e attuale della tabella di allineamento ) riduce la complessità dello spazio a .O(max(n1,n2))

Tuttavia, se si desidera ottenere le modifiche effettive di uno script di modifica ottimale, è possibile fare un uso della memoria migliore di , probabilmente a spese del tempo di esecuzione?O(n1n2)

Risposte:


15

O(nm)O(n+m)

Intuitivamente, l'idea di Hirschberg è di calcolare una singola operazione di modifica a metà della sequenza di modifica ottimale, quindi calcolare ricorsivamente le due metà della sequenza. Se pensiamo alla sequenza di modifica ottimale come un percorso da un angolo della tabella di memoization all'altro, abbiamo bisogno di una ricorrenza modificata per registrare dove questo percorso attraversa la riga centrale della tabella. Una ricorrenza che funziona è la seguente:

Half(i,j)={if i<m/2jif i=m/2Half(i1,j)if i>m/2 and Edit(i,j)=Edit(i1,j)+1Half(i,j1)if i>m/2 and Edit(i,j)=Edit(i,j1)+1Half(i1,j1)otherwise

I valori di possono essere calcolati contemporaneamente alla tabella delle distanze di modifica E d i t ( i , j ) , usando O ( m n ) time. Poiché ogni riga della tabella di memoization dipende solo dalla riga sopra di essa, calcolare sia E d i t ( m , n ) che H a l f ( m , n ) richiede soloHalf(i,j)Edit(i,j)O(mn)Edit(m,n)Half(m,n) spazio.O(m+n)

inserisci qui la descrizione dell'immagine

A[1..m]B[1..n]A[1..m/2]B[1..Half(m,n)]A[m/2+1..m]B[Half(m,n)+1..n]

T(m,n)={O(n)if m1O(m)if n1O(mn)+maxh(T(m/2,h)+T(m/2,nh))otherwise
T(m,n)=O(mn)O(m+n)

5
Perché mi è mancato questo quando Dan mi ha chiesto il mio esame di qualifica, ecco perché.
Jeffε,

ricordo di averlo fatto come un esercizio (guidato) e di aver pensato che fosse piuttosto fico
Sasho Nikolov,

3

O(n1+n2)O(n1+n2)O(n1n2)O(n1+n2)

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.