title: Algoritmo di Hirschberg
text: # Algoritmo di Hirschberg
  
  L'algoritmo di Hirschberg, dal nome del suo creatore, Dan Hirschberg, è un algoritmo di programmazione dinamica che trova l'allineamento ottimale della sequenza tra due stringhe. L'ottimalità si misura con la distanza di Levenshtein, definita come la somma dei costi di inserimenti, sostituzioni, eliminazioni e azioni nulle necessarie per cambiare una stringa nell'altra. L'algoritmo di Hirschberg è semplicemente descritto come una versione più efficiente in termini di spazio dell'algoritmo Needleman-Wunsch che utilizza divide et impera. L'algoritmo di Hirschberg è comunemente usato nella biologia computazionale per trovare il numero massimo di allineamenti globali di DNA e sequenze proteiche.
  
  ## Concetti di base
  
  L'algoritmo di Hirschberg è un algoritmo generalmente applicabile per l'allineamento ottimale della sequenza. BLAST e FASTA sono euristiche non ottimali. Se x ed y sono stringhe,dove la lunghezza (x) = n e lunghezza (y) = m, l'algoritmo di Needleman-Wunsch constata un allineamento ottimale O (nm) tempo, utilizzando O (nm) spazio. L'algoritmo di Hirschberg è una modifica intelligente dell'algoritmo di Needleman–Wunsch, che richiede ancora tempo O(nm), ma necessita solo di O(min{n, m}) spazio ed è molto più veloce in pratica. Un'applicazione dell'algoritmo è trovare allineamenti di sequenze di DNA o sequenze proteiche. È anche un modo efficiente in termini di spazio per calcolare la massima sottosequenza comune tra due insiemi di dati, ad esempio con lo strumento diff comune.
  
  L'algoritmo di Hirschberg può essere derivato dall'algoritmo di Needleman-Wunsch osservando che:
  
  * si può calcolare il punteggio di allineamento ottimale memorizzando solo la riga corrente e precedente della matrice del punteggio di Needleman–Wunsch;
  * Se $(Z,W)=\operatorname {NW} (X,Y)$ è l'allineamento ottimale di $(X,Y)$, e $X=X^{l}+X^{r}$ è una partizione arbitraria di $X$, esiste una partizione $Y^{l}+Y^{r}$ di $Y$ tale che $\operatorname {NW} (X,Y)=\operatorname {NW} (X^{l},Y^{l})+\operatorname {NW} (X^{r},Y^{r})$.
  
  ## Descrizione dell'algoritmo
  
  $X_{i}$ indica l'i -esimo carattere di $X$, dove $1\leqslant i\leqslant \operatorname {length} (X)$ . $X_{i:j}$ denota una sottostringa di dimensione $j-i+1$, dove i limiti vanno dal I -esimo al carattere j -esimo di $X$. $\operatorname {rev} (X)$ è la versione invertita di $X$.
  
  Se $X$ e $Y$ sono sequenze da allineare. $x$ è un elemento da $X$, e $y$ è un elemento della sequenza $Y$. Assumendo che $\operatorname {Del} (x)$, $\operatorname {Ins} (y)$ e $\operatorname {Sub} (x,y)$ sono funzioni a valori interi ben definite. Queste funzioni rappresentano il costo dell'eliminazione $x$, inserendo $y$, e la sostituzione $x$ con $y$, rispettivamente.
  
  Definiamo $\operatorname {NWScore} (X,Y)$, lo score che restituisce l'ultima riga della matrice del punteggio di Needleman–Wunsch $\mathrm {Score} (i,j)$:
  
  Da notare che in qualsiasi momento $\operatorname {NWScore}$ richiede solo le due righe più recenti della matrice del punteggio. Così, $\operatorname {NWScore}$ è implementato in $O(\min\{\operatorname {length} (X),\operatorname {length} (Y)\})$ spazio.
  
  L'algoritmo di Hirschberg segue:
  
  Nel contesto dell'osservazione (2), supponiamo che $X^{l}+X^{r}$ è una partizione di $X$. Indice $\mathrm {ymid}$ è calcolato in modo tale che $Y^{l}=Y_{1:\mathrm {ymid} }$ e $Y^{r}=Y_{\mathrm {ymid} +1:\operatorname {length} (Y)}$.
  
  ## Esempio
  
  Supponendo che
  
  ${\begin{aligned}X&={\text{AGTACGCA}},\\Y&={\text{TATGC}},\\\operatorname {Del} (x)&=-2,\\\operatorname {Ins} (y)&=-2,\\\operatorname {Sub} (x,y)&={\begin{cases}+2,&{\text{if }}x=y\\-1,&{\text{if }}x\neq y.\end{cases}}\end{aligned}}$
  
  L'allineamento ottimale è dato da
  
  In effetti, questo può essere verificato tornando indietro sulla sua matrice di Needleman-Wunsch corrispondente:
  
  Iniziando con la chiamata di livello superiore a $\operatorname {Hirschberg} ({\text{AGTACGCA}},{\text{TATGC}})$, che divide a metà il primo argomento: $X={\text{AGTA}}+{\text{CGCA}}$. La chiamata a $\operatorname {NWScore} ({\text{AGTA}},Y)$ produce la seguente matrice:
  
  Allo stesso modo, $\operatorname {NWScore} (\operatorname {rev} ({\text{CGCA}}),\operatorname {rev} (Y))$ genera la seguente matrice:
  
  Le loro ultime righe (dopo aver invertito quest'ultima) e la loro somma sono rispettivamente
  
  Il massimo (mostrato in grassetto) appare a ymid = 2, producendo la partizione $Y={\text{TA}}+{\text{TGC}}$.
  
  L'intera ricorsione di Hirschberg (che omettiamo per brevità) produce il seguente albero:
  
  Le foglie dell'albero contengono l'allineamento ottimale.
  
  