Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoChiara Mosca Modificato 11 anni fa
1
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} tale che 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, PREFIX_FUNCTION vale sempre 0 in quanto il valore k deve essere minore di q per definizione. acgaaacggttac P[1,8]
2
Suggerimento Il calcolo della funzione PREFIX_FUNCTION può essere implementata in PERL Tramite una lista di m elementi. Lelemento nella generica posizione q (da 1 a m) conterrà il valore di PREFIX_FUNCTION(q) STEP INIZIALE: assegno valore 0 al primo elemento della lista (per la nota precedente) STEP DI ITERAZIONE: scorro P verso destra a partire dalla posizione 2 e, per ogni generico prefisso P[1, q] (q da 2 a m), calcolo il valore della funzione. Come calcolo il valore PREFIX_FUNCTION(q) per il prefisso P[1, q]? Quando mi trovo in posizione q, significa che ho già calcolato i valori che la funzione assume per le posizioni da 1 a (q-1). Si possono verificare a questo punto due casi diversi: - caso (a) P[q] = P[k+1], dove k = PREFIX_FUNCTION(q-1) acggaacggttac q-1 Esempio1 k
3
Come calcolo il valore della funzione per la generica posizione i? … cioè se il carattere in posizione q è uguale al carattere in posizione (k+1) (in azzurro nellesempio precedente), allora il valore di PREFIX_FUNCTION(q) sarà pari a k+1. - caso (b) P[q] diverso da P[k+1] cioè se il carattere in posizione q è diverso dal carattere in posizione (k+1) (in grassetto nellesempio precedente), allora si considera il valore k che PREFIX_FUNCTION assume in k. k è la lunghezza del più lungo prefisso di P che è anche suffisso di P[1, k] (questo per definizione). Ma per quanto visto prima, si ha quindi che P[1, k] è anche suffisso di P[1, q-1]. acggaacggttac q Esempio1 k+1 gtggagtggttac q-1 Esempio2 k
4
Come calcolo il valore della funzione per la generica posizione i? … gtggagtggttac i-1 Esempio2 k k A questo punto si può ricadere nuovamente nel caso (a) (cioè P[q] è uguale a P[k+1]) e allora il valore di PREFIX_FUNCTION(q) è k+1. Oppure si ripresenta il caso (b) e allora si considera il valore che PREFIX_FUNCTION assume in k, etc. Se andando avanti in questo modo si ricade sempre nel caso (b), ci si ferma quando il valore di PREFIX_FUNCTION, di volta in volta considerato, giunge a 0. In tale caso si ha che PREFIX_FUNCTION(i) è0.
5
Pseudocodice dellalgoritmo Compute_PREFIX_FUNCTION(P) m := length(P) Inizializzo una L lista m elementi L[1]:=0 k:=0 for i:=2 to m do while k > 0 and P[k+1] diverso da P[i] k:=L[k] if P[k+1] = P[i] then k:=k+1 L[i]:=k endfor
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.