Esercizio 4 Data una stringa P di lunghezza m e definita sullalfabeto, scrivere un programma PERL per calcolare la seguente funzione: PREFIX_FUNCTION: {1, 2, …, m} {0,1, 2, …, m-1} cioé PREFIX_FUNCTION(q) è la lunghezza k < q del massimo prefisso di P che è anche suffisso di P[1,q], dove P[1,q] è il prefisso di P lungo q caratteri Esempio (q = 8) P P[1,8] è il prefisso di P lungo 8 caratteri. La funzione PREFIX_FUNCTION dovrà restituire, per q=8, un valore pari a 3. Infatti il più lungo prefisso di P che è anche un suffisso di P[1,8] è la stringa acg composta da tre caratteri. NOTA: per q=1, il valore di PREFIX_FUNCTION è sempre 0, in quanto per definizione il valore k deve essere minore di q. acgaaacggttac P[1,8]
Suggerimento La funzione PREFIX_FUNCTION può essere implementata in PERL tramite una lista di m elementi, in cui lelemento q-esimo è la lunghezza k del più lungo prefisso di P che è anche suffisso di P[1,q] (tale che sia k < q). STEP INIZIALE: si assegna valore 0 al primo elemento della lista (vedere la nota nella slide precedente) STEP DI ITERAZIONE: si calcola il valore della funzione per tutti i prefissi P[1,q] per q che varia da 2 a m. A questo scopo, si tiene conto del fatto che, al momento del calcolo di PREFIX_FUNCTION per il generico prefisso di lunghezza q, i valori che la funzione assume per i prefissi precedenti (cioè da quello di lunghezza 1 a quello di lunghezza q-1) sono stati già calcolati. Sia k il valore che la funzione assume in q-1. Si possono verificare due situazioni: (1) Se il carattere di P in posizione q è uguale al carattere di P in posizione (k+1) (caratteri in grassetto), acggaacggttac q-1 k
allora il valore di PREFIX_FUNCTION in corripondenza di q sarà semplicemente dato da (k+1). (2) Se il carattere di P in posizione q è diverso dal carattere di P in posizione (k+1) (caratteri in grassetto), allora si considera il valore k che PREFIX_FUNCTION assume in k. Per definizione, k è la lunghezza del più lungo prefisso di P che è anche suffisso di P[1, k]. Ma poiché P[1,k] è suffisso di P[1,q-1], si ha quindi che P[1, k] è anche suffisso di P[1, q-1] (parti cerchiate nella figura successiva). acggaacggttac q k+1 gtggagtggttac q-1 k
k A questo punto, si può ricadere nel caso (1) in cui il carattere di P in posizione q è uguale al carattere di P in posizione (k+1) (caratteri in grassetto). In tale caso il valore di PREFIX_FUNCTION(q) sarà dato da k+1. gtggagtggttac q-1 k gtggagtggttac k k gtggagtggttac q k+1
In caso contrario, si considera il valore che PREFIX_FUNCTION assume in k riconsiderando quindi il caso (2). Ci si ferma non appena si ricade nel caso (1) oppure quando il valore k di volta in volta considerato nel caso (2) risulta essere 0 (in tale caso si ha che il valore di PREFIX_FUNCTION(q) è 0).