Scarica Domande esame scritto Bioinformatica e più Prove d'esame in PDF di Bioinformatica solo su Docsity!
Domande d’esame scritto Bioinformatica
- Cosa sono le tecnologie di sequenziamento Nanopore e in cosa si differenziano da tecnologie short reads Illumina. -> tecnologie short reads Illumina : Nel 2000 hanno iniziato a prendere piede, tecnologie di Next-Generation-Sequencing (NGS). Esse si caratterizzano da un elevato parallelismo, nel senso che possono effettuare piu’ corse di sequenziamento in parallaleo; ciò determina un elevata copertura della molecola di origine ed è per questo che vengono anche chiamate High – Throughput Sequencing. Un altro aspetto positivo: sono poco costose e hanno prodotto una esplosione di dati di sequenziamento, negli ultimi 20 anni. Tali tecnologie vengono chiamate anche di seconda generazione per contrapporle al metodo Sanger, di prima generazione. I reads NGS son caratterizzati dall’essere relativamente corti (fino a 100-400 bp) e da una copertura elevata (una base puo’ essere sequenziata anche da 300 reads). Le piattaforme attualmente utilizzate per DNA sequncing sono tre di Illumina (Solexa) – HiSeq System, Genome analyzer lix e MySeq - e tre di Ion Torrent. Il sequenziatore MySeq, top performing di Illumina produce reads di 300 basi con una accuratezza di 99.9 % e produce 25 milioni di reads per run di sequenziamento. -> teconologie Nanopore : ultimamente si stanno sviluppando tecnologie di terza generazione (Next-Next-Generation-Sequencing) per produrre long reads che hanno lo scopo di ovviare i problemi dovuti all’uso di short reads di seconda generazione, che sono per esempio più difficili da assemblare in genomi completi e non sono robusti rispetto alle sequenze ripetute che si manifestano all’interno del genoma. Le piattaforme attualmente utilizzate sono una di Pacific Biosciences e due di Oxford Nanopore (GridION System e MinION). Le tecnologie di terza generazione arrivano a produrre reads fino a 10 000 basi e hanno una qualità elevata. VIDEO "DNA e RNA in Bioinformatica"
- Descrivere le idee principali per assemblare reads genomici con il metodo overlay – layout – consensus. Fare un esempio di grafo di overlap di assemblaggio. Overlap : step in cui si trovano i potenziali reads in overlap. In particolare, viene individuato il miglior match tra i suffissi di una read e i prefissi di una read (calcola overlap migliore tra due read). A causa di errori di sequenziamento, per trovare l’overlap migliore si utilizza un algoritmo di programmazione dinamica (allineamento pairwise). I frammenti che non condividono una sottostringa comune sufficientemente lunga vengono filtrati.
Layout: consiste nel fondere le reads in overlap per creare contigs e i contigs in supercontigs; le ripetizioni costituiscono un problema nel mettere assieme le reads. Esistono soluzioni per mascherare le ripetizioni, ma questo comporta delle difficoltà. Consensus: è il processo con cui viene derivata la squenza DNA e con cui vengono corretti gli errori delle reads per avere una sequenza più precisa. Deriva un allineamento multiplo da un allineamento a coppie dei reads e deriva ogni “consensus base” mediante votazione ponderata (maggioranza dei voti delle read che confermano una certa base). Esempio Overlap di assemblaggio:
- Descrivere le idee principali per assemblare reads genomiche con il metodo dei grafi di De Bruijn. Fare un esempio di grafo di De Bruijn di ordine k. Siano d il numero dei reads da assemblare e n i nucleotidi. Il tempo impiegato per effettuare l’assemblaggio dei reads è legato al parametro N = d*n. Per costruire il grafo di De Bruijn si sceglie un k (di solito tra 30 e 50, tipicamente 32). Per ciascuno read e per ciascuno k-mer, si considerano il suo k-mer di sinistra e il suo k-mer di destra (prefisso e suffisso di k-1 simboli) e questi determinano i due nodi che sono collegati da un arco rappresentante il loro k- mer. Il tempo di esecuzione per costruire il grafo è O(N). Al crescere del coverage aumenta il numero di archi di collegamento dei vari nodi. Il coverage rappresenta il numero di volte che una base è coperta da una read. 4) Quali concetti di teoria dei grafi sono implicati nell’assemblaggio, e quali problemi sui cammini dei grafi.
- Differenze tra concetto di aplotipo e di genotipo. Illustrare alcuni metodi di inferenza combinatoria di aplotipi a partire da genotipi. L’uomo possiede 23 cromosomi che si presentano a coppie; l’informazione che risiede su una coppia di cromosomi prende il nome di aplotipo. L’individuo ha coppie di cromosomi perché ne erdita uno dalla madre e uno dal padre. Gli aplotipi, materno e paterno, sono rappresentati da una sequenza. Qualora non
da una coppia di foglie. Il problema dunque è trovare un albero le cui foglie spieghino i genotipi seguendo il modello di evoluzione della filogenesi perfetta, in quanto si fa l’assunzione che l’evoluzione sia coalescente cioè si determina un albero in cui si parte da solo alleoli di maggioranza e durante l’evoluzione vengono introdotti i vari alleoli di minoranza, andando a determinare gli aplotipi attuali rappresentati dalle foglie. I genotipi sono perciò gli accoppiamenti di aplotipi nell’albero. Riassumendo il problema: dato G insieme di genotipi si individua H insieme di aplotipi e un albero T di filogenesi perfetta che spiega G.--------------Viene considerata una matrice in cui le righe sono gli aplotipi e le colonne sono i caratteri (gli SNPs), essa ha una sua rappresentazione come filogenesi perfetta e i passaggi da 0 a 1 in una certa posizione i degli aplotipi è uno switch che può avvenire una e una sola volta all’interno dell’albero (concetto evoluzionistico). Può però succedere che la radice non valga 00...0 perciò in questa casistica è concesso anche lo switch da 1 a 0 (esempio: 00011->01000). In questo problema si ha in input una matrice (i cui valori possono essere 0, 1, *) B di n x m genotipi G e si ottiene in output una matrice binaria B’ 2n x m di aplotipi che ammette filogenesi perfetta; ciascun genotipo viene risolto perciò da una coppia di righe <h, j> di B’. Il problema viene risolto da un algoritmo indiretto il cui costo è O(nm^2 ) però esiste anche una versione ottimizzata di costo O(nm)
- Esporre il problema dell’assemblaggio di aplotipi a partire da frammenti, e dire quali sono i modelli principali adottati per individuare la bipartizione ottima delle reads. Da una coppia di aplotipi vengono generati i reads i quali vengono allineati prendendo in considerazione un reference al fine di individuarne la provenienza. Dall’allineamento delle reads è possibile effettuare una ripartizione delle stesse per distinguere quelle provenienti da un aplotipo rispetto a quelle proveniente da un altro aplotipo. Il partizionamento dei reads in due insiemi è immediato a seguito dell’allineamento delle reads al reference in assenza di errori nelle reads, in quanto tramite siti eteroigoti si vedono delle diffrenze, dove c’è per una stessa posizione allineata al reference lo 0 e l’ nelle reads, le reads con 0 vanno in un insieme e le reads con 1 vanno nell’altro. La presenza di errori dovuti al sequenziamento e al mappaggio (allineamento) rende il problema di bipartizione complesso, soprattutto per le
reafs corte come quelle Illumina (potrebbero esserci più di due SNPs per ogni read). Si osserva che quando viene assemblato un reference a partire dalle read, il reference riporta le informazioni relative all’allele di maggioranza presente nelle read relative al sequenziamento del cromosoma. Tipicamente le varianti vengono riportate in un formato VCF che è un formato adatto a rappresentare gli SNPs in una popolazione di individui. ***** Nel problema dell’assemblaggio degli aplotipi l’input consiste in una matrice chiamata Fragment matrix la quale viene costruita partendo dall’allineamento delle read: ogni riga è una read (un frammento) allineata al reference, nelle colonne il valore relativo allo SNP (maggioranza 0 / minoranza 1 / gap “-“). Le colonne che sono omozigote non aggiungono informazione al problema della bipartizione. L’output è una bipartizione delle righe della matrice, che include le correzioni degli SNPs, in due insiemi di read uno per ogni aplotipo. Si noti che i conflitti sulla matrice ossia due differenti valori nella stessa posizione, possono guidare la costruzione della bipartizione. In caso di presenza di errori nella bipartizione, essa può essere ambigua: è perciò necessario introdurre problemi di ottimizzazione: MFR, Minimum Fragment Removal, il quale rimuove il minimo numero di righe per ottenere la bipartizione e MSR, Minimum SNP Removal, il quale rimuove le colonne per ottenere la bipartizione ottimale. Tali problemi sono però NP Completi. Alternativa più efficiente: Minimum Error Correction (MEC), il quale anziché rimuovere righe o colonne, corregge le entrate della matrice. 7) Differenza tra metodo k-MEC e metodo MEC per il problema dell’assemblaggio di aplotipi. MEC, Minimum Error Correction: (correzione entrate matrici e non rimozione di righe e colonne) il metodo prende in input la Fragment matrix e restituisce in output il minimo numero di correzioni che permette di bipartire i reads in modo non ambiguo. Esiste inoltre una variante chiamata wMEC che assegna un peso ad ogni elemento e minimizza il numero totale di correzioni in termini di peso, migliorando l’accuratezza dell’assemblaggio di aplotipi. Possiamo avere tre casi distinti di MEC: binary se la matrice in input non ha gap né hole (gap esterni); gapless (la matrice in input ha solo hole, solo gap esterni); infine, gap MEC se la matrice in input ha sia gap che hole. Il problema MEC è un problema NP-hard e anche APX-hard. Il parametro k, discusso per il metodo k-MEC, nel problema MEC non è un vincolo: viene tollerato qualsiasi numero di correzione nella colonna, con l’obiettivo di minimizzare il numero totale di correzione della matrice,
Un meccanismo per memorizzare le informazioni presenti nel reference e nelle sue varianti è quello di costruire un insieme di k-mers centrati su una determinata variante, su un determinato aplotipo. Dato un allele è possibile costruire una firma della stessa. Essa è definita da un insieme di k-mer, allineati rispetto alla posizione della variante. In questo modo memorizziamo le varianti tramite una collezione di k-mer. È possibile quindi rappresentare le varianti tramite collezione di k-mers memorizzati in un Bloom filter perché al k-mer viene associata la funzione hash e quindi abbiamo la possibilità di stabilire la presenza di una determinata variante facendo delle query sul Bloom filter stesso di rappresentazione del file di VCF. Tale formato è stato creato per memorizzare in maniera compressa e indicizzata le posizioni nel genoma di riferimento e per indicare gli individui sequenziati nel progetto 1000 genomi.
- Definire il Bloom filter e come si può utilizzare per memorizzare dei k-mers. Il Bloom filter è una struttura dati probabilistica impiegata per memorizzare un insieme di elementi. È probabilistica in quanto esiste una certa probabilità che l’informazione relativa alla presenza di un elemento sia effettivamente corretta o meno: qualora le funzioni di hash restituiscono valore 1 esiste una certa probabilità che l’elemento sia presente (possibilità di falsi positivi), se invece restituiscono valore 0, è certo che l’elemento non sia presente (no falsi negativi). Il Bloom filter è rappresentato da un vettore binario e da un insieme S = {s1, s2, ..., sn}. Sia n = 3, l’aggiunta di s1 e di s2 avviene calcolando le funzioni di hash H1, H2, H3 di entrambi gli elementi (H1(s1) = 1, H2(s1) = 1, H3(s1) = 1 e similmente per s2). Il vettore binario sarà perciò il seguente: B = {1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0}. Per eseguire un test sulla presenta di un certo elemento si occorre fare l’and logico dei bit relativi all’hashing H1, H2, ..., Hn. ***** (vedi domanda 8).
- Perché è utile un Bloom filter e che caratteristiche ha rispetto ad una normale tabella di hash. Il suo scopo è quello di sostituire una tabella hash con una struttura dati che ha meno informazioni ma che occupa nettamente meno spazio. La tabella hash memorizza oggetti tramite una chiave: una funzione matematica di hash che dato un valore numerico (chiave) determina le entries della tabella; ad ognuno viene “assegnato” un record rappresentato dalla chiave, dal valore che si vuole memorizzare e un puntatore per associare più record. Per poter occupare meno spazio, dalla tabella di hash viene eliminato ogni valore: quello che si ottiene è un hash set. Successivamente viene eliminata ogni chiave, in seguito anche il puntatore necessario ad indicare la presenza dell’elemento, che verrà ora individuata tramite il valore 0 o 1 (assenza/presenza elemento). Quindi ciò che si ottiene è appunto un vettore binario, con funzione hash che permette di effettuare degli ingressi a questa tabella. Nell’immagine seguente è mostrato come avviene un inserimento di un elemento. L’inserimento può anche generare un caso di collisione se l’1 viene inserito in una cella in cui è già presente il valore 1, come descritto nella seguente figura.
Output: una serie di inversioni r 1 , ..., rt che trasformano π nella permutazione identità e tali che t sia minimo (cioè con il minimo numero di permutazioni). Tale problema è equivalente al problema della distanza genomica per inversioni. Il motivo è il seguente: Se nel problema della distanza per inversione, σ = permutazione identità di π, l’output che si ottiene è una serie di inversioni r 1 , ..., rt che trasformano π nella permutazione identità di π e tali che t sia minimo, ossia si ottiene l’output del problema di ordinamento di una permutazione rispetto all’inversione. Se invece σ ≠^ permutazione identità di π è possibile ridenominare gli elementi di σ in modo che diventi la permutazione identica e analogamente rietichettiamo π come π’ e il problema che si ottiene è esattamente quello di ordinamento di una permutazione rispetto all’inversione (a meno di ridenominazione degli elementi).
1 3) Idee principali dell’algoritmo di approssimazione per l’ordinamento per inversioni. Un breakpoint è un paio di elementi adiacenti che non sono consecutivi (in una permutazione), mentre uno strip è un intervallo tra due brakpoint consecutivi (in una permutazione). L’algoritmo di approssimazione per l’ordinamento per inversione si basa sul concetto di strip e di breakpoint, in particolare sulle due seguenti osservazioni:
- se la permutazione contiene una strip decrescente (i suoi elementi decrescono), allora esiste una inversione che diminuirà il numero di brakpoint (di almeno una unità).
- altrimenti, è possibile creare una strip decrescente invertendo una strip crescente: il numero di breakpoint può essere ridotto nello step successivo. L’algoritmo è chiamato BreakpointReversalSort e ha il seguente funzionamento: mentre c’è ancora un breakpoint nella permutazione, ossia mentre b(π) > 0 (questo perché quando non ci sono più breakpoint, la permutazione è ordinata): se la permutazione a una strip decrescente allora viene scelta una inversione r tale che minimizzi il numero di breakpoint della permutazione a cui è stata applicata l’inversione r ossia b( π ⋅r ); altrimenti si sceglie una inversione r per trasformare una strip crescente in una strip decrescente (osservazione 2); infine si applica l’inversione r alla permutazione π (^). Quando b(π) = 0, la permutazione π sarà ordinata. Di seguito, lo pseudocodice dell’algoritmo: Si tratta di un algoritmo polinomiale, 4 – approssimante in quanto non usa mai più di 4 volte il minimo numero di inversioni r : elimina almeno un breakpoint ogni due step perché se la strip decrescente, viene rimosso sempre un
colonne le frequenze. Ciò che si vuole ottenere è dato dalla costruzione dell’albero T (filogenesi binaria perfetta) costruita dalla matrice binaria B e la matrice U (usage matrix) che riporta la frequenza dei vari cloni per ogni sample (un sample è un mix di cloni, per ogni sample si hanno le frequenze di ogni mutazione). Il problema della fattorizzazione VAF prende in input la matrice delle frequenze F (espressa dalla seguente condizione: F = ½ U * B), gli n cloni e un modello di albero e restituisce in output U che è la matrice usage (o proportions) in ogni clone e B che è B è la filogenesi che spiega l'input.
- Perché si può utilizzare la filogenesi perfetta come modello di inferenza di aplotipi da genotipi e come funziona il modello.
- Anche il modello della filogenesi perfetta può essere usato come metodo di inferenza degli aplotipi. L’idea generale è la seguente: si supponga di avere due genotipi g1 = <0,1,,,1> e g2 = <*,0,0,0,1> ; essi vengono spiegati da un albero di evoluzione mostrato in figura: la radice è data dall’aplotipo <0,0,0,0,1> e ciascun genotipo (g1 e g2) è rappresentato da una coppia di foglie. Il problema dunque è trovare un albero le cui foglie spieghino i genotipi seguendo il modello di evoluzione della filogenesi perfetta, in quanto si fa l’assunzione che l’evoluzione sia coalescente cioè si determina un albero in cui si parte da solo alleoli di maggioranza e durante l’evoluzione vengono introdotti i vari alleoli di minoranza, andando a determinare gli aplotipi attuali rappresentati dalle foglie. I genotipi sono perciò gli accoppiamenti di aplotipi nell’albero. Riassumendo il problema: dato G insieme di genotipi si individua H insieme di aplotipi e un albero T di filogenesi perfetta che spiega G.--------------Viene considerata una matrice in cui le righe sono gli aplotipi e le colonne sono i caratteri (gli SNPs), essa ha una sua rappresentazione come filogenesi perfetta e i passaggi da 0 a 1 in una certa posizione i degli aplotipi è uno switch che può avvenire una e una sola volta all’interno dell’albero (concetto evoluzionistico). Può però succedere che la radice non valga 00...0 perciò in questa casistica è concesso anche lo switch da 1 a 0 (esempio: 00011->01000). In questo problema si ha in input una matrice (i cui valori possono essere 0, 1, *) B di n x m genotipi G e si ottiene in output una matrice binaria B’
2n x m di aplotipi che ammette filogenesi perfetta; ciascun genotipo viene risolto perciò da una coppia di righe <h, j> di B’. Il problema viene risolto da un algoritmo indiretto il cui costo è O(nm^2 ) però esiste anche una versione ottimizzata di costo O(nm) 17) Spiegare cos’è la direzione 5’3’ di una molecola di DNA e RNA per la lettura della sua sequenza primaria. Spiegare poi l’operazione di reverse&complement di una sequenza primaria, motivandola nell’ambito della catena a doppia elica del genoma.
- È la direzione che va dal gruppo fosfato P allo zucchero D (deossiribiosio), se si tratta di una molecola di DNA. È molto importante per la corretta lettura delle sequenze primarie, cioè la sequenza delle basi cosi come compaiono nella molecola: la sequenza delle basi azotate dei nucleotidi viene letta partendo dal 5’, arrivando al 3’. Il genoma è costituito da due catene di DNA appaiate avvolte a doppia elica (l’appaiamento avviene a livello delle basi azotate, le quali si uniscono secondo una regola ben precisa, la regola delle basi complementari, cioè A si appaia con T – e viceversa - e C con G – e viceversa. È importante sottolineare data una catena di DNA (forward strand), la sua catena del genoma appaiata (reverse strand), ha direzione dall’alto verso il basso. Dunque, dato l’esempio in figura, avrà lettura ATG.
- Data la sequenza primaria di una delle due catene del DNA genomico, la sequenza primaria della catena appaiata è ottenuta per mezzo di una operazione di “reverse&complement”. Tale operazione consiste nell’effettuare per prima cosa, la lettura al contrario della sequenza primaria da cui si parte (reverse) e al risultato ottenuto, applicare la regola delle basi complementari, precedentemente descritta. Il risultato finale è la sequenza appaiata relativa a quella di partenza. In questo modo otteniamo le cosiddette paired strands.
- Spiegare la specifica del formato FASTA per memorizzare sequenze primarie di molecole biologiche. La specifica FASTA prevede una prima riga di intestazione (header) che contiene informazioni sulla sequenza in un formato libero. Essa inizia con il simbolo ‘>’ e deve essere su un’unica riga. Esempio header: > X dna:chromosome chromosome:GRCh38:X:154428632:154436516:1. Tale intestazione indica che si tratta di una porzione del genoma umano relativa al cromosoma che va dalla posizione 154428632 alla posizione 154436516 della
- Spiegare come avviene il riempimento della matrice degli score nell’algoritmo di Needleman-Wunsch.
- Spiegare come avviene la ricostruzione dell’allineamento a partire dalla matrice degli score nell’algoritmo di Needleman-Wunsch.
- Scegliere due sequenze e uno schema di punteggio ed eseguire l’algoritmo di Needleman-Wunsch.
- Definire il problema di allineamento locale tra due sequenze.
- Spiegare come avviene il riempimento della matrice degli score nell’algoritmo di Smith-Waterman.
- Spiegare come avviene la ricostruzione dell’allineamento a partire dalla matrice degli score nell’algoritmo di Smith-Waterman.
- Scegliere due sequenze e uno schema di punteggio ed eseguire l’algoritmo di Smith-Waterman
- Scegliere e spiegare uno degli otto problemi di allineamento semiglobale.
- Spiegare cos’è un gene e cosa si intende per sequenza genomica del gene. Un gene è una regione del DNA (locus genico) genomico di un organismo e dal punto di vista della sequenza primaria del genoma, è una sottostringa del genoma. Il genoma viene visto come una collezione di geni. Un gene esprime (codifica) una proteina; una proteina è una sequenza di aminoacidi. Ogni aminoacido è codificato come un simbolo; dal punto di vista informatico, infatti, una sequenza primaria di una proteina è vista come una stringa definita su alfabeto. La sequenza primaria del locus di DNA del gene prende il nome di sequenza genomica del gene. Il termine ‘sequenza genomica del gene’ è abbastanza generico in Bioinformatica, ed è utilizzato per indicare una qualsiasi porzione di genoma che abbia un significato interessante. Un gene è identificato tramite HUGO NAME.
- Spiegare qual è la struttura particolare di un gene sul genoma (esoni e introni). Il locus di un gene ha una particolare struttura: è composto da un’alternanza di esoni e introni, rispettivamente le regioni codificanti e non codificanti. Ogni gene è caratterizzato da una particolare struttura di esoni e introni, e ha un certo numero di esoni che solitamente è superiore al numero di introni. Il confine tra un esone a sinistra e un introne a destra prende il nome di sito di splicing al 5’. Il confine tra un introne a sinistra e un esone a destra prende il nome di sito di splicing al 3’.
- Spiegare come avviene l’espressione genica, a partire dal gene sul genoma e arrivando alla proteina. L’espressione genica avviene in tre fasi fondamentali. La prima è la TRASCRIZIONE che produce la coppia della sequenza del locus del gene in un pre-mRNA cioè la molecola che precede l’mRNA messaggero. La sequenza primaria del pre-mRNA è una copia del locus del gene a meno della sostituzione della Timina con l’Uracile. La successiva fase di SPLICING elimina dal pre-mRNA gli introni e concatena insieme gli esoni per produrre l’mRNA, il trascritto. Il trascritto non viene interamente tradotto in proteina, è soltanto una sua sottostringa cioè una sua parte interna che viene tradotta. Essa si chiama CDS (Coding Sequence), la quale possiede tre proprietà fondamentali: inizia sempre con la tripletta AUG (start codon); termina sempre con una tra le triplette {UAG, UAA, UGA} chiamata stop codon; infine, la lunghezza della CDS è un multiplo di 3. Ogni tripletta della Coding Sequence prende il nome di codone. Le parti di trascritto che stanno a monte e a valle della CDS prendono rispettivamente il nome di 5’UTR e 3’UTR (UTR = Untraslated Region). La CDS, vista come sequenza di codoni, viene quindi tradotta (TRANSLATION) in una sequenza di aminoacidi (cioè in una proteina). La mappatura codone- aminoacido viene fornita dal codice genetico ossia da una tabella che mappa un aminoacido ad ognuna delle possibili triplette (cioè codoni). Ci sono più codoni che mappano lo stesso aminoacido; questo fatto viene indicato dicendo che il codice genetico è degenere. 32) Spiegare lo splicing alternativo. Un uomo possiede circa 20 000 geni codificanti ma centinaia di migliaia di proteine. Ciò significa che tra geni e proteine non viene rispettata una corrispondenza 1:1. Il motivo è il seguente: esiste un meccanismo chiamato Alternative Splicing (AS), il quale fa in modo che un gene possa esprimere diversi trascritti e quindi diverse proteine utilizzando e combinando in modi diversi i suoi esoni. Nell’uomo circa il 90 % dei geni viene sottoposto ad
La sua definizione è la seguente: dato un testo T, che termina con il carattere $, di n caratteri, il Suffix Array S è un array di n interi da 1 a n tale che S[i] = j se e solo se T[j:] è l’i-esimo suffisso nell’ordinamento lessicografico dei suffissi di T (j è la posizione di inizio del suffisso del testo, che è è l’i-esimo suffisso nell’ordinamento lessicografico dei suffissi di T). È importante assumere che $ deve essere minore di tutti i simboli dell’alfabeto di definizione del testo. LCP array: Longest Common Prefix array è stato introdotto anch’esso da Myers e Manber nel 1993 come struttura ausiliaria per un Suffix Array. La sua definizione è la seguente: dato un testo T, che termina con il carattere $, di n caratteri, LCP è un array di n interi da 1 a n, tale che in LCP[i] = l se e solo se l è la lunghezza del più lungo prefisso comune tra T[S[i]:] e T[S[i-1]:] cioè tra il suffisso che inizia nel testo in posizione S[i] e il suffisso che inizia nel testo in posizione S[i-1]. Di default, LCP[1] = - 1. BWT: è stata introdotta da Burrows e Wheeler nel 1993 come struttura per comprimere i testi. La sua definizione è la seguente: dato un testo T, che termina con $, di n caratteri, la BWR è un array di n caratteri, tale che B[i] = σ se e solo se σ è il carattere che precede il suffisso che è nella posizione i del Suffix Array S (cioè il suffisso T[S[i]:] ]. Anche in questo caso assumiamo che $ deve essere minore di tutti i simboli dell’alfabeto di definizione del testo. La BWT può essere calcolata in tempo lineare O(n) dal Suffix Array.
- Definire il Suffix Tree di un testo. Il Suffix Tree, introdotto nel 1959, consente di risolvere in tempo lineare molti problemi su stringhe tra cui il pattern matching; ha però un difetto: occupa molta memoria in quanto contiene informazione “ripetuta” del testo. Il suffix tree di un testo di n caratteri è un albero radicato tale che:
- Il numero delle foglie è n e sono etichettate con gli interi da 1 a n;
- Ogni nodo interno ha almeno due figli;
- Ogni arco è etichettato da una sottostringa di T;
- Non esistono due archi uscenti dallo stesso nodo che hanno un’etichetta che inizia con lo stesso carattere;
- La concatenazione delle etichette lungo il percorso dalla radice r alla foglia i fornisce il suffisso T che inizia in i. Il Suffix Tree esiste se e solo se nessun suffisso occorre come prefisso di qualche altro suffisso (per esempio, per T = xabxab non esiste un Suffix Tree*). È stato osservato che il Suffix Tree esiste se l’ultimo carattere del testo non appare da qualche altra parte. *Questa considerazione ha permesso di trovare il Suffix Tree di qualsiasi testo: è sufficiente aggiungere il simbolo ‘$’ come simbolo di terminazione del testo (esso non è presente nell’alfabeto di definizione del testo T).
- *** (boolean or ...?)** Spiegare come avviene la ricerca di un pattern in un testo di cui si conosce il Suffix Tree. Input: testo T lungo n, pattern P lungo m Output: k occorrenze di P in T La soluzione viene determinata in tempo O(n+m+k) attraverso i seguenti step: 1 costruzione del Suffix Tree di T in tempo O(n); 2 ricerca delle k occorrenze di P (in tempo O(m+k) ): se P occorre k volte in T allora P è prefisso di k suffissi di T; se P + prefisso di k suffissi di T allora P è la path label di un nodo w (che può essere anche dummy) e tale w è unico; le k foglie del sottoalbero radicato in w danno le posizioni di inizio delle k occorrenze di P. L’algoritmo è il seguente: cerca il nodo w che ha path label uguale a P; visita in tempo O(k) il sottoalbero radicato in w ed elenca le sue k foglie. Se in T non ci sono occorrenze di P, allora w non esiste e la visita del sottoalbero non viene compiuta.
- Dire cosa si intende per lcp function rispetto a LCP array. lcp function è una funzione che prende in input due indici i e j e restituisce in output la lunghezza del più lungo prefisso comune tra il suffisso del testo che nel Suffix Array è in posizione i e il suffisso del testo che nel Suffix Array è in posizione j (ovvero tra T[S[ i ]:] e T[S[ j ]:] ). Assumendo i > j , lcp( i , j ) è il minimo tra i valori LCP[ i + 1], LCP[ i + 2], ..., LCP[ j ] dove LCP è l’LCP array. Per calcolare la lcp function è perciò sufficiente effettuare una operazione di Range Minimum Query su LCP Array nell’intervallo [i + 1, j], formalmente: lcp( i , j ) = RMQ (LCP, i + 1, j ).
- Definire l’lcp-interval Tree di un testo e la sua relazione rispetto al Suffix Tree. Un lcp-interval Tree è un albero radicato tale che: ha radice nell’intervallo 0-[1, n] cioè l’intervallo di base che ha valore caratteristico 0, prefisso caratteristico la stringa nulla e copre tutte le posizione sull’lcp array quindi va da 1 a n; i nodi dell’albero sono tutti gli lcp-intervals; infine, l’insieme degli archi implementa l’insieme di tutte le relazioni parent-child tra i nodi. Dato un Suffix Tree di un testo T, rimuoviamo gli archi entranti in foglie e le foglie stesse. Ora, calcoliamo l’lcp-interval del testo T. Topologicamente le due strutture coincidono. Perciò possiamo affermare che un lcp-interval è topologicamente un Suffix Tree a meno delle foglie (e dei loro archi entranti). Infatti, è possibile dimostrare che dato un nodo l -[i, j] nell’lcp interval Tree che ha prefisso ω, per contro nel suffix tree c’è un path label che è ω. L’lcp interval Tree permette di simulare le visite del Suffix Tree e quindi permette di risolvere in tempo lineare molti problemi su stringhe senza avere il Suffix Tree (che è in