Κεφάλαιο 2 ο : Αλγόριθµοι Ακριβούς Εύρεσης Προτύπου

Σχετικά έγγραφα
ΟΛΟΚΛΗΡΩΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΥΛΙΚΟΥ ΛΟΓΙΣΜΙΚΟΥ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ

συµβολοσειρών µε εφαρµογές στα βιολογικά δεδοµένα

Ερώτημα 1. Μας δίνεται μια συλλογή από k ακολοθίες, k >=2 και αναζητούμε το πρότυπο Ρ, μεγέθους n.

Κεφάλαιο 5 ο : Αλγόριθµοι Σύγκρισης Ακολουθιών Βιολογικών εδοµένων

Κεφάλαιο 3 ο : Εισαγωγή στο δέντρο επιθεµάτων (Suffix Tree) και στις Εφαρµογές του

ΠΑΝΕΠΙΣΤΉΜΙΟ ΠΑΤΡΩΝ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ ΔΥΟ ΝΕΟΙ ΑΛΓΟΡΙΘΜΟΙ ΓΙΑ ΣΥΜΠΙΕΣΗ ΒΙΟΛΟΓΙΚΩΝ ΑΚΟΛΟΥΘΙΩΝ

Επίλυση Προβληµάτων µε Greedy Αλγόριθµους

Αλγόριθμοι Συμβολοσειρών

Σύνοψη Προηγούµενου. Κανονικές Γλώσσες (1) Προβλήµατα και Γλώσσες. Σε αυτό το µάθηµα. ιαδικαστικά του Μαθήµατος.

ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ ΤΜΗΜΑΤΟΣ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Συμβολοσειρές. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Ανάκτηση Πληροφορίας

Initialize each person to be free. while (some man is free and hasn't proposed to every woman) { Choose such a man m w = 1 st woman on m's list to

Κεφάλαιο 4 ο : Αλγόριθµοι προσεγγιστικής εύρεσης προτύπου και στοίχισης συµβολοσειρών.

ΤΕΙ ΗΠΕΙΡΟΥ ΤΜΗΜΑ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ

Βασικές Έννοιες Δοµών Δεδοµένων

Λύσεις 4ης Σειράς Ασκήσεων

Αλγόριθμοι - Τμήμα Πληροφορικής ΑΠΘ -4ο εξάμηνο 1

Αυτόματα. Παράδειγμα: πωλητής καφέ (iii) Παράδειγμα: πωλητής καφέ (iv) Εισαγωγή στην Επιστήμη των Υπολογιστών 6

Αλγόριθµοι και Πολυπλοκότητα

Δομές Δεδομένων και Αλγόριθμοι

Σειρά Προβλημάτων 1 Λύσεις

Οργάνωση αρχείων: πως είναι τοποθετηµένες οι εγγραφές ενός αρχείου όταν αποθηκεύονται στο δίσκο

ΑΣΚΗΣΗ 4η Αναζήτηση οµοιοτήτων σε βάσεις δεδοµένων ακολουθιών

Ποιές οι θεµελιώδεις δυνατότητες και ποιοί οι εγγενείς περιορισµοί των υπολογιστών ; Τί µπορούµε και τί δε µπορούµε να υπολογίσουµε (και γιατί);

Στοιχεία Θεωρίας Υπολογισµού (1): Τυπικές Γλώσσες, Γραµµατικές

ΗΜΥ 210 ΣΧΕΔΙΑΣΜΟΣ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ. Χειµερινό Εξάµηνο 2016 ΔΙΑΛΕΞΗ 13: Διαδικασία Σχεδιασµού Ακολουθιακών Κυκλωµάτων (Κεφάλαιο 6.

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

Πανεπιστήμιο Ιωαννίνων Τμήμα Πληροφορικής Δομές Δεδομένων [ΠΛΥ302] Χειμερινό Εξάμηνο 2012

Αριθµητική Ανάλυση 1 εκεµβρίου / 43

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

Σύνοψη Προηγούµενου. Γλώσσες χωρίς Συµφραζόµενα (2): Αυτόµατα Στοίβας. Παραδείγµατα Σχεδιασµού CFG. Παράδειγµα 1.

Σύνοψη Προηγούµενου. Κανονικές Γλώσσες (3) Παραδείγµατα µε Κανονικές Εκφράσεις. Σε αυτό το µάθηµα.

5. Μέθοδοι αναγνώρισης εκπαίδευση χωρίς επόπτη

Εισαγωγή στην Επιστήμη των Υπολογιστών

ΤΕΧΝΟΛΟΓΙΕΣ ΠΟΛΥΜΕΣΩΝ

Εργαστήριο 7: Ο αλγόριθμος ταξινόμησης Radix Sort

Αυτόματα. Παράδειγμα: πωλητής καφέ (iii) Παράδειγμα: πωλητής καφέ (iv) Εισαγωγή στην Επιστήμη των Υπολογιστών. Προδιαγραφές

Αλγόριθµοι και Πολυπλοκότητα

auth Αλγόριθμοι - Τμήμα Πληροφορικής ΑΠΘ -4ο εξάμηνο 1

Δομές Δεδομένων και Αλγόριθμοι

ΑΛΓΟΡΙΘΜΟΙ. Ενότητα 7: Χωρικοί Χρονικοί Συμβιβασμοί. Ιωάννης Μανωλόπουλος, Καθηγητής Αναστάσιος Γούναρης, Επίκουρος Καθηγητής Τμήμα Πληροφορικής ΑΠΘ

Μηχανές Turing (T.M) I

Ενότητα 9 Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find)

ΠΑΡΑΛΛΗΛΗ ΕΠΕΞΕΡΓΑΣΙΑ

Ν!=1*2*3* *(N-1) * N => N! = (Ν-1)! * N έτσι 55! = 54! * 55

Θεωρία Υπολογισμού και Πολυπλοκότητα Κανονικές Γλώσσες (1)

Αλγόριθµοι και Πολυπλοκότητα

Θεωρία Υπολογισμού και Πολυπλοκότητα Ασυμφραστικές Γλώσσες (2)

Ενότητα 9 Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find)

Δομές Δεδομένων και Αλγόριθμοι

Ανάλυση Αλγορίθµων 4. Πειραµατικές Μελέτες. Χρόνος Εκτέλεσης. Περιγραφή και Υλικό Ανάγνωσης

Δοµές Δεδοµένων. 9η Διάλεξη Ταξινόµηση - Στοιχειώδεις µέθοδοι. Ε. Μαρκάκης

Η NTM αποδέχεται αν µονοπάτι στο δέντρο που οδηγεί σε αποδοχή.

Κεφάλαιο 5ο: Εντολές Επανάληψης

Μεταγλωττιστές. Δημήτρης Μιχαήλ. Ακ. Έτος Ανοδικές Μέθοδοι Συντακτικής Ανάλυσης. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΕΠΛ 232 Φροντιστήριο 2

Μεταγλωττιστές. Ενότητα 6: Λεκτική ανάλυση (Μέρος 2 ο ) Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Αλγόριθµοι και Πολυπλοκότητα

Δομές Δεδομένων & Αλγόριθμοι

ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Αναζήτηση σε Γράφους. Μανόλης Κουμπαράκης. ΥΣ02 Τεχνητή Νοημοσύνη 1

Βασική Εφικτή Λύση. Βασική Εφικτή Λύση

Γραµµατικές για Κανονικές Γλώσσες

3 Αναδροµή και Επαγωγή

Λειτουργική γονιδιωµατική. 6ο εργαστήριο

Πανεπιστήμιο Ιωαννίνων Τμήμα Μηχανικών Η/Υ και Πληροφορικής Δομές Δεδομένων [ΠΛΥ302] Χειμερινό Εξάμηνο 2013

ΠΛΗ111. Ανοιξη Μάθηµα 7 ο. έντρο. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Σειρά Προβλημάτων 4 Λύσεις

Ασκηση 1 [ ] Παράδοση : Τετάρτη , 13:00

Κεφάλαιο 3β. Ελεύθερα Πρότυπα (µέρος β)

Προγραµµατισµός στην Basic

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

ΑΙΚΑΤΕΡΙΝΗ-ΠΑΝΑΓΙΩΤΑ ΣΤΟΥΚΑ ΝΙΚΟΛΑΟΣ ΛΑΜΠΡΟΥ. μπλ 2014

Ενότητα 7 Ουρές Προτεραιότητας

ιαφάνειες παρουσίασης #4

Εισαγωγή στον Προγραµµατισµό. Ανάλυση (ή Επιστηµονικοί8 Υπολογισµοί)

ΗΜΙΟΥΡΓΙΑ ΙΣΤΟΣΕΛΙ ΑΣ ΣΤΟ MICROSOFT WORD

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

4.3. Γραµµικοί ταξινοµητές

Σε αυτό το µάθηµα. Εισαγωγή στις Μηχανές Turing. Μηχανή Turing (Turing Machine - TM) Μηχανές Turing. Παραδείγµατα Μηχανών Turing

Αριθµητική Γραµµική ΑλγεβραΚεφάλαιο 4. Αριθµητικός Υπολογισµός Ιδιοτιµών 2 Απριλίου και2015 Ιδιοδιανυσµάτων 1 / 50

Σχήµα 3.1: Εισαγωγή shift register σε βρόγχο for-loop.

Κατ οίκον Εργασία 5 Σκελετοί Λύσεων

Mεταγλωττιστές. 4 ο εργαστηριακό μάθημα Λεξική ανάλυση και flex. Θεωρία

- Αναπαράσταση ακέραιας τιµής : - Εύρος ακεραίων : - Ακέραιοι τύποι: - Πράξεις µε ακεραίους (DIV - MOD)

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

Κεφάλαιο 3. Αλγόριθµοι Τυφλής Αναζήτησης. Τεχνητή Νοηµοσύνη - Β' Έκδοση. Ι. Βλαχάβας, Π. Κεφαλάς, Ν. Βασιλειάδης, Φ. Κόκκορας, Η.

ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ ΟΙΚΟΝΟΜΙΚΩΝ ΚΑΙ ΚΟΙΝΩΝΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΘΕΩΡΙΑ ΥΠΟΛΟΓΙΣΜΩΝ ΚΑΙ ΑΥΤΟΜΑΤΩΝ

Αλγόριθμοι και Πολυπλοκότητα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τ Μ Η Μ Α Π Λ Η Ρ Ο Φ Ο Ρ Ι Κ Η Σ

ΕΝΟΤΗΤΑ 8 KATAKEΡΜΑΤΙΣΜΟΣ (HASHING)

Σύνθεση Data Path. ιασύνδεσης. Μονάδες. Αριθµό Μονάδων. Τύπο Μονάδων. Unit Selection Unit Binding. λειτουργιών σε. Μονάδες. Αντιστοίχιση µεταβλητών &

Εισαγωγή στην Αριθμητική Ανάλυση

Εισαγωγή στους αλγορίθμους Βιοπληροφορικής. Στοίχιση αλληλουχιών

Πρόβλημα 1: Αναζήτηση Ελάχιστης/Μέγιστης Τιμής

Μοντελοποίηση προβληµάτων

for for for for( . */

Βραχύτερα Μονοπάτια σε Γράφους (CLR, κεφάλαιο 25)

Transcript:

Κεφάλαιο 2 ο : Αλγόριθµοι Ακριβούς Εύρεσης Προτύπου Σε αυτό το κεφάλαιο θα αναφερθούµε σε 3 σηµαντικούς αλγορίθµους ακριβούς εύρεσης προτύπου- exact pattern matching, που χρησιµοποιούνται σε προγράµµατα σύγκρισης και ανάλυσης ακολουθιών βιολογικών δεδοµένων. Επειδή ο όγκος των ακολουθιών βιολογικών δεδοµένων διπλασιάζεται κάθε 18 περίπου µήνες το κύριο ενδιαφέρον εστιάζεται στη σχεδίαση αποδοτικών αλγορίθµων σε χρόνο και απαιτούµενο χώρο. Η απλοϊκή προσέγγιση αναζήτησης ενός προτύπου- pattern P µήκους n σε ένα κείµενο ή βιολογική ακολουθία X µήκους m, στοιχίζει το πρότυπο στην πρώτη θέση της ακολουθίας και εξετάζει έναν προς έναν τους χαρακτήρες του προτύπου (Πίνακας 2.2.α) Σε περίπτωση µη ταιριάσµατοςmismatch, η σύγκριση ξαναρχίζει µε µετατόπιση του προτύπου κατά µια θέση. Η απλοϊκή αυτή προσέγγιση στοιχίζει O(n*m) χρόνο. void Naïve-Method (char *x, int m, char *y, int n) { int i,j; for (j=0; j<=n-m; ++j) { for (i=0; i<m && x[i]==y[i+j]; ++i); if i>=m output(j); Πίνακας 2.α: Απλοϊκή Προσέγγιση Αναζήτησης Προτύπου Μια σχηµατική απεικόνιση αυτής της απλοϊκής µεθόδου φαίνεται στο ακόλουθο σχήµα. g c a t t a t a c a g t a c g 1 2 3 4 Βήµα 1: Στο πρώτο βήµα παρατηρούµε ότι έχουµε διαφορετικό χαρακτήρα στην 4 η θέση οπότε και το πρότυπο µεταφέρεται κατά 1 θέση δεξιά. - 1 -

g c a t t a t a c a g t a c g 1 Βήµα 2: Στο δεύτερο βήµα παρατηρούµε ότι έχουµε διαφορετικό χαρακτήρα από την 1 η θέση οπότε και το πρότυπο µεταφέρεται κατά 1 θέση δεξιά. Η διαδικασία επαναλαµβάνεται και για το 3 ο, και 4 ο βήµα. g c a t t a t a c a g t a c g 1 2 3 4 5 6 7 8 Βήµα 5: Στο πέµπτο βήµα παρατηρούµε ότι έχουµε ταίριασµα και των 8 χαρακτήρων του προτύπου. Οπότε η πρώτη εµφάνιση του προτύπου είναι στην θέση Χ 5. Στη συνέχεια η διαδικασία συνεχίζεται µετατοπίζοντας σε κάθε βήµα το πρότυπο κατά 1 θέση δεξιά. Οι αλγόριθµοι που θα παρουσιάσουµε στη συνέχεια χρησιµοποιούν διάφορες τεχνικές επιτάχυνσης της διαδικασίας αναζήτησης. Έχουµε επιλέξει να παρουσιάσουµε 3 αντιπροσωπευτικούς αλγορίθµους: 1. Τον αλγόριθµο Boyer-Moore, που συγκρίνει τους χαρακτήρες του προτύπου (pattern) ως προς την ακολουθία από δεξιά προς τα αριστερά, 2. Τον αλγόριθµο Knuth-Morris-Pratt, που αποτελεί το πιο σηµαντικό αλγόριθµο γραµµικής πολυπλοκότητας και 3. Τον αλγόριθµο Shift-Or, που χρησιµοποιεί αριθµητικές µεθόδους. 2.1 Ο Αλγόριθµος Boyer-Moore Ο αλγόριθµος Boyer-Moore χρησιµοποιεί τις ακόλουθες τεχνικές: α) ελέγχει τους χαρακτήρες από δεξιά προς τα αριστερά, και β) στην περίπτωση µη ταιριάσµατος χρησιµοποιεί τους κανόνες good suffix shift και bad character shift για να µετατοπίσει το σηµείο στοίχισης του προτύπου ως προς την ακολουθία. Ας υποθέσουµε ότι συγκρίνοντας τους χαρακτήρες x[i]=a και y[i+j]=b από το πρότυπο και το κείµενο αντίστοιχα, έχουµε mismatch. - 2 -

Από τη σύγκριση των προηγούµενων χαρακτήρων, ισχύει ότι x[i+1 m-1]= y[i+j+1 j+m-1]= u, ενώ x[i] y[i+j]. Ο κανόνας good suffix shift στηρίζεται στη µετατόπιση του τµήµατος x[i+1 m-1]= y[i+j+1 j+m-1] στην επόµενη προς τα δεξιά εµφάνιση του στο κείµενο όπου ο επόµενος προς τα αριστερά χαρακτήρας είναι διάφορος του x[i] (σχήµα α). y b u x a u x c u shift Σχήµα 2.1.α. Στην περίπτωση που δεν υπάρχει τέτοια εµφάνιση στοιχίζουµε το µέγιστο πρόθεµα v του x που συµφωνεί µε το αντίστοιχο τµήµα του y[i+j+1 j+m-1]. Ο κανόνας bad character shift στηρίζεται στη στοίχιση του χαρακτήρα y[i+j] του κειµένου µε τη δεξιότερη εµφάνιση του στο πρότυπο x[0 m-2] (σχήµα β). Αν ο χαρακτήρας δεν εµφανίζεται µέσα στο πρότυπο, τότε καµία εµφάνιση του x δε θα συµπεριλαµβάνει το χαρακτήρα y[i+j], και το αριστερό τµήµα του προτύπου στοιχίζεται µε τον επόµενο χαρακτήρα y[i+j+1], όπως φαίνεται στο σχήµα γ. y b u x a u x b δεν περιέχει b shift Σχήµα 2.1.β. y b u x a u shift x δεν περιέχει b Σχήµα 2.1.γ. - 3 -

Για να χρησιµοποιήσουµε τις 2 τεχνικές που περιγράψαµε χρησιµοποιούµε 2 συναρτήσεις που έχουµε υπολογίσει σε ένα προεπεξεργαστικό βήµα. Η συνάρτηση good suffix shift, αποθηκεύεται σε έναν πίνακα bmgs µεγέθους m+1. Οι τιµές του πίνακα εκφράζουν την περίοδο του x, ως εξής: BmGs[i+1]= min {s>0, : ώστε να ισχύουν οι συνθήκες Cs(i,s) & Co(i,s), όπου Cs(i,s) = για κάθε k, i<k<m και s k, ή x[k-s]=x[k], και Co(i,s) = εάν s<i, τότε x[i-s] x[i]. Η συνάρτηση bad character shift, αποθηκεύεται σε έναν πίνακα bmbc. H τιµή της συνάρτησης ορίζεται για κάθε χαρακτήρα σ: min, i :1 i m 1& x[ m 1 i] = c bmbc[ σ ] = m, int PreBmBc (char *x, int m, int bmbc[]) { int i; for (i=0; i<asize; ++i) bmbc[i]=n; for (i=0; i<m-1; ++i) bmbc[x[i]]= m-i-1; void PreBmGs (char *x, int m, int bmgs[]) { int i,j, suff[xsize]; suffixes(x,m,suff); for (i=0; i<m; ++i) bmgs[i]=m; j=0; for (i=m-1; i>=-1; --i) if (i==-1 suff[i] == i+1) for (; j<m-1-i; ++j) if bmgs[j]==m bmgs[j]= m-1-i; for (i=0; i<= m-2; ++i) bmgs[m-1-suff[i]= m-1-i; - 4 -

void suffixes (char *x, int m, int * suff) { int i,f,g; void Boyer-Moore (char *x, int m, char *y, int n) { int i,j, bmgs[xsize], bmbc[asize]; suff[m-1] = m; g=m-1; for (i=m-2; i>=0; --i) { if (i>g && suff [i+m-1-f]<i-g) suff[i]= suff[i+m-1-f]; else { if i<g g=i; f=i; while (g>=0 && x[g]==x[g+m-1-f]) --g; suff[i]=f-g; /*preprocessing*/ PreBmGs(x, m, bmgs); PreBmBc(x, m, bmbc); /*searching*/ j=0; while j<n-m { for (i= m-1; i>=0 && x[i] ==y[i+j]; --i); if i<0 { output(j); j+=bmgs[0]; else j+ = MAX(bmGs[i], bmbc[y[i+j]]-m+1+i); Πίνακας 2.1.α: Αλγόριθµος Boyer-Moore Πολυπλοκότητα: Οι πίνακες bmbc και bmgs υπολογίζονται σε O(m+σ) χρόνο. Η πολυπλοκότητα αναζήτησης του προτύπου είναι τετραγωνική ως προς τον απαιτούµενο χρόνο, αλλά σε πραγµατικές εφαρµογές και όταν το πρότυπο που αναζητάµε δεν είναι περιοδικό απαιτούνται 3n συγκρίσεις. Επίσης για µεγάλα αλφάβητα ( pattern ) οι απαιτούµενες συγκρίσεις είναι O(n/m), χρόνος βέλτιστος για οποιοδήποτε αλγόριθµο αναζήτησης. Παράδειγµα: Έστω το πρότυπο x=gcagagag, ορίζουµε τις 2 βοηθητικές συναρτήσεις και εφαρµόζουµε τον αλγόριθµο Boyer-Moore. i 0 1 2 3 4 5 6 7 x[i] suff[i] 1 0 0 2 0 1 0 8 BmGs[i] 7 7 7 2 7 4 7 1 c a c g t BmBc[c] 1 6 2 8 1 Βήµα 1: Μετατόπιση κατά 1 θέση (bmgs[7]=bmbc[a]-7+7) - 5 -

3 2 1 Βήµα 2: Μετατόπιση κατά 4 θέσεις (bmgs[5]=bmbc[c]-7+5) 8 7 6 5 4 3 2 1 Βήµα 3: Ακριβής εύρεση του προτύπου και µετατόπισή του κατά 7 θέσεις. 3 2 1 Βήµα 4: Μετατόπιση κατά 1 θέση (bmgs[5]=bmbc[c]-7+5) 2 1 Βήµα 5: Μετατόπιση κατά 7 θέσεις (bmgs[5]=bmbc[c]-7+5) Συνολικά ο αλγόριθµος εκτελεί 17 συγκρίσεις χαρακτήρων στο συγκεκριµένο παράδειγµα. 2.2 Ο Αλγόριθµος Knuth-Morris-Pratt Ο αλγόριθµος Knuth-Morris-Pratt συγκρίνει τους χαρακτήρες από αριστερά προς τα δεξιά χρησιµοποιώντας ένα προ-επεξεργαστικό βήµα που στοιχίζει O(m) χώρο και χρόνο ενώ η συνολική πολυπλοκότητα του αλγορίθµου είναι O(n+m) ανεξάρτητα από το µέγεθος του αλφαβήτου των ακολουθιών. Ας δούµε πώς λειτουργεί ο αλγόριθµος. - 6 -

y u b x u a shift x v c Σχήµα 2.2.α. Συγκρίνοντας το πρότυπο και την ακολουθία στους χαρακτήρες των θέσεων x[i] και y[i+j] αντίστοιχα παρατηρούµε ότι έχουµε ασυµφωνία (0<i<m). Για τις συγκρίσεις των προηγούµενων θέσεων ισχύει ότι: x[0 i-1] = y[j i-j-1] = u, ενώ a= x[i] y[i+j] b. Προκειµένου να µετατοπίσουµε το πρότυπο προς τα δεξιά, υποθέτουµε ότι κάποιο πρόθεµα (prefix) v του προτύπου ταιριάζει µε κάποιο επίθεµα (suffix) του τµήµατος u της ακολουθίας. Επίσης για να µην έχουµε ασυµφωνία και στον επόµενο χαρακτήρα, ο επόµενος χαρακτήρας µετά το πρόθεµα v πρέπει να είναι διάφορος του a. To µέγιστο σε µήκος πρόθεµα v που ικανοποιεί αυτές τις συνθήκες ονοµάζεται border του u (έχουµε ήδη ορίσει ως border το substring που εµφανίζεται στην αρχή και το τέλος µιας λέξης). Ορίζουµε λοιπόν ως kmpnext[i] το µήκος του µέγιστου border του x[0 i-1] στο οποίο ο επόµενος χαρακτήρας c προς τα δεξιά είναι διάφορος του x[i] και στην περίπτωση που δεν υπάρχει τέτοιο border kmpnext[i] = -1, (για κάθε i, 0<i<m). Μετά τη µετατόπιση η σύγκριση των χαρακτήρων συνεχίζεται µεταξύ των x[kmpnext[i]] και y[i+j] χαρακτήρων. int PreScan (char *x, int m, int KmpNext[]) { int i, j; void KMP (char *x, int m, char *y, int n) { int i,j, KmpNext[XSIZE]; i=0; j=kmpnext[0]=-1; while i<m { while (j>-1 && x[i]!=x[j]) j=kmpnext[j]; ++i; ++j; if x[i] ==x[j] KmpNext[i]=KmpNext[j]; else KmpNext[i]=j; /*preprocessing*/ PreScan(x,m,KmpNext); /*searching*/ i=j=0; while j<n { while (i>-1 && x[i]!=y[j]) i =KmpNext[i]; ++i; ++j; if i>= m output(j-i); i = KmpNext[i]; Πίνακας 2.2.β: Αλγόριθµος Knuth-Morris-Pratt - 7 -

Πολυπλοκότητα: Οι τιµές του πίνακα kmpnext υπολογίζονται σε O(m) χώρο και χρόνο ενώ θέτουµε kmpnext[0]= -1. Η συνολική πολυπλοκότητα του αλγορίθµου είναι O(n+m) ανεξάρτητα από το µέγεθος του αλφαβήτου των ακολουθιών. Παράδειγµα: Έστω το πρότυπο x=gcagagag, υπολογίζουµε τον πίνακα kmpnext i 0 1 2 3 4 5 6 7 8 x[i] kmpnext [i] -1 0 0-1 1-1 1-1 1 1 2 3 4 Βήµα 1: Μετατόπιση κατά 4 θέσεις (i-kmpnext [i] = 3- (-1)=4) 1 Βήµα 2: Μετατόπιση κατά 1 θέση (i-kmpnext [i] = 0- (-1)=1) 1 2 3 4 5 6 7 8 Βήµα 3: Ακριβής εύρεση του προτύπου και µετατόπισή του κατά 7 θέσεις. 1 2 Βήµα 4: Μετατόπιση κατά 1 θέση (i-kmpnext [i] = 1-0 =1) - 8 -

1 Βήµα 5: Μετατόπιση κατά 1 θέση (i-kmpnext [i] = 0- (-1) =1) 1 Βήµα 6: Μετατόπιση κατά 1 θέση (i-kmpnext [i] = 0- (-1) =1) 1 Βήµα 7: Μετατόπιση κατά 1 θέση (i-kmpnext [i] = 0- (-1) =1) 1 Βήµα 8: Μετατόπιση κατά 1 θέση (i-kmpnext [i] = 0- (-1) =1) Συνολικά ο αλγόριθµος εκτελεί 18 συγκρίσεις χαρακτήρων στο συγκεκριµένο παράδειγµα. 2.3 Ο Αλγόριθµος Shift-Or Ο αλγόριθµος Shift-Or χρησιµοποιεί αριθµητικές τεχνικές για τη σύγκριση των χαρακτήρων. Ο αλγόριθµος είναι αποδοτικός, όταν το µήκος του προτύπου δεν ξεπερνά το µήκος λέξης της µηχανής. Ο αλγόριθµος χρησιµοποιεί ένα προ-επεξεργαστικό βήµα που στοιχίζει O(m+σ) χώρο και χρόνο ενώ η συνολική πολυπλοκότητα του αλγορίθµου είναι O(n) ανεξάρτητα από το µέγεθος του αλφαβήτου των ακολουθιών. Ο αλγόριθµος προσαρµόζεται εύκολα και σε περιπτώσεις προσεγγιστικής εύρεσης προτύπου. - 9 -

Ο αλγόριθµος, χρησιµοποιεί αριθµητικές τεχνικές. Έστω R ένα bit array µεγέθους m. Το διάνυσµα R j αποθηκεύει τις τιµές του πίνακα R, µετά την επεξεργασία του χαρακτήρα y[j] της ακολουθίας, όπως φαίνεται στο σχήµα α. Κάθε διάνυσµα περιλαµβάνει τις πληροφορίες µε το ταίριασµα όλων των προθεµάτων του x που σταµατούν στη θέση j (0<i<m-1): 0, x[0... i] = y[ j i... j] R j [ i + 1] = 1 Το διάνυσµα R j+1 υπολογίζεται χρησιµοποιώντας το διάνυσµα R j ως εξής: και R [ j + 1 0, x[ i + 1] = y[ j + 1] i + 1] = 1 [0] 0, x[0] = y[ j + 1] R j + 1 = 1 Εάν R j+1 [m+1]=0, τότε έχουµε πλήρη εύρεση του προτύπου. y j x[0] i=0 1 x[0 1] i=1 0 x[0 2] i=2 1 x i=m-1 0 Σχήµα 2.3.α. R j Η µετάβαση από το διάνυσµα R j στο R j+1 µπορεί να επιταχυνθεί ως εξής: Για κάθε χαρακτήρα c Σ, έστω το διάνυσµα µεγέθους m S c για κάθε 0<i<m-1, και S c =0 αν και µόνο αν x[i]=c, το οποίο αποθηκεύει τις θέσεις εµφάνισης του χαρακτήρα c στο πρότυπο. Το διάνυσµα S c υπολογίζεται σε ένα προ-επεξεργαστικό βήµα. Εκτέλεση της πράξης: R j+1 = Shift (R j ) Or S y[j+1] - 10 -

int PreScan (char *x, int m, unsigned S[]) { unsigned int j, lim; int i; for (i=0; i<asize; ++i) S[i]=~0; for (lim=i=0, j=1; i<m; ++i, j<<=1){ S[x[i]] &=~j; lim =j; lim=~(lim>>1); return(lim); void Shift-Or (char *x, int m, char *y, int n) { unsigned int lim, state; unsigned int S[ASIZE]; int j; if (m> WORD) error ("Shift-Or: use pattern size<= word size"); /*preprocessing*/ lim = PreScan(x,m,S); /*searching*/ for (state=~0, j=0, j<n; ++j) state= (state<<1) S[y[j]]; if state<lim output(j-m+1); Πίνακας 2.3.β: Αλγόριθµος Shift-Or Πολυπλοκότητα: Ο αλγόριθµος χρησιµοποιεί ένα προ-επεξεργαστικό βήµα που στοιχίζει O(m+σ) χώρο και χρόνο ενώ η συνολική πολυπλοκότητα του αλγορίθµου είναι O(n) ανεξάρτητα από το µέγεθος του αλφαβήτου των ακολουθιών. Παράδειγµα: Έστω το πρότυπο x=gcagagag, υπολογίζουµε τα διανύσµατα S c. S A S C S G S T g 1 1 0 1 c 1 0 1 1 a 0 1 1 1 g 1 1 0 1 a 0 1 1 1 g 1 1 0 1 a 0 1 1 1 g 1 1 0 1-11 -

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 g 0 1 1 1 1 0 1 1 0 1 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 c 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 a 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 g 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 a 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 g 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 6 a 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 7 g 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 Όπως παρατηρούµε R 12 [7] = 0, οπότε έχουµε µια πλήρη εµφάνιση του προτύπου στη θέση 12-8+1=5. 2.4 Ακριβής Εύρεση Πολλαπλών Προτύπων Σε αυτή την ενότητα παρουσιάζουµε αλγορίθµους αναζήτησης πολλών προτύπων ταυτόχρονα. Συγκεκριµένα παρουσιάζουµε το αυτόµατο Aho- Corasick για την αναζήτηση πολλαπλών προτύπων σε µια ακολουθία. Αρχικά θα παρουσιάσουµε τις βασικές ιδέες εύρεσης προτύπου βάσει ενός Ντετερµινιστικού Πεπερασµένου Αυτόµατου (Deterministic Finite Automaton- DFA). Προκειµένου να αναζητήσουµε µια λέξη µε χρήση ενός αυτοµάτου, πρέπει αρχικά να δηµιουργήσουµε το Ντετερµινιστικό Πεπερασµένο Αυτόµατο A(x), που αναγνωρίζει τη γλώσσα Σ*x. Ένα Ντετερµινιστικό Πεπερασµένο Αυτόµατο A( x) = ( Q, q, T, E), ορίζεται ως εξής: o Q: το σύνολο των προθεµάτων του x: Q={ε, x[0], x[0 1], x[0 2],..x[0 m-2],x, q 0 = ε : κατάσταση εκκίνησης, T = {x, για κάθε q Q και α Σ, (q α, α, q) E, αν και µόνο αν το q α είναι πρόθεµα του x, διαφορετικά (q α, α, p) E, έτσι ώστε το p, να είναι το µέγιστο επίθεµα του q α, που είναι και πρόθεµα του x. Το Ντετερµινιστικό Πεπερασµένο Αυτόµατο, δηµιουργείται σε O(m+σ) χρόνο και χρειάζεται Ο(m*σ) χώρο. - 12 -

Έχοντας δηµιουργήσει το αυτόµατο, η αναζήτηση µιας λέξης ξεκινά από την αρχική κατάσταση q 0. Σε κάθε βήµα διαβάζουµε έναν χαρακτήρα εισόδου και µεταβαίνουµε στην επόµενη κατάσταση. Κάθε φορά που φθάνουµε στην τελική κατάσταση αναφέρεται µια εµφάνιση της δοσµένης λέξης/ προτύπου στην ακολουθία. Η αναζήτηση στοιχίζει Ο(n) χρόνο, αν το αυτόµατο αποθηκεύεται σε πίνακα άµεσης πρόσβασης, διαφορετικά στοιχίζει Ο(n*logσ). Ας δούµε το παράδειγµα ενός αυτοµάτου για το πρότυπο T=gcagagag. Παράδειγµα Σ= {a,c,g,t Q= {ε, g,gc,gca,gcag, gcaga, gcagag, gcagaga, gcagagag, q 0 = ε, και T= {gcagagag Το αυτόµατο για τη λέξη εµφανίζεται στο ακόλουθο σχήµα. c c g c g c a g a g a g 0 1 2 3 4 5 6 7 8 g g g g Για την αναζήτηση του προτύπου µέσα στην ακολουθία S= gcatcgcagagagtatacagtacg, χρησιµοποιούµε το αυτόµατο που έχουµε δηµιουργήσει, ενώ για κάθε χαρακτήρα που διαβάζουµε στην είσοδο, σηµειώνουµε και την κατάσταση µετάβασης. - 13 -

1 2 3 0 0 M συνεχίζουµε τη διαδικασία για κάθε χαρακτήρα της ακολουθίας εισόδου.. 1 0 0 0 1 Συνολικά ο αλγόριθµος εκτελεί 24 συγκρίσεις χαρακτήρων στο συγκεκριµένο παράδειγµα. 2.4.1 Το Αυτόµατο Aho-Corasick Ο αλγόριθµος Aho-Corasick, γενικεύει το αυτόµατο αναζήτησης προτύπου για ένα σύνολο προτύπων. Βασική ιδέα αποτελεί ο ορισµός των goto και failure-function συναρτήσεων για κάθε κατάσταση του αυτοµάτου, το οποίο χτίζεται βάσει του συνόλου των λέξεων/ προτύπων αναζήτησης P = p, p,... p. { 1 2 k Η συνάρτηση goto, αποθηκεύει την κατάσταση µετάβασης µε την ανάγνωση ενός χαρακτήρα. Στην περίπτωση που δεν υπάρχει δυνατή µετάβαση καθώς αναφέρεται µη-ταίριασµα χαρακτήρα (mismatch), η συνάρτηση failure-function, µας επιδεικνύει ποια είναι η επόµενη κατάσταση - 14 -

µετάβασης, (failure link), από την οποία θα συνεχίσουµε την αναζήτηση, διαβάζοντας τον επόµενο χαρακτήρα εισόδου της ακολουθίας. Μπορούµε να πούµε ότι η συνάρτηση failure-function, µοντελοποιεί την απόσταση shift στη στοίχιση προτύπου- ακολουθίας που χρησιµοποιούν οι αλγόριθµοι που ήδη παρουσιάσαµε. Στο επόµενο σχήµα δίνουµε το αυτόµατο για το σύνολο προτύπων P = { ca, tca, cgt, cat. not c or t c a t 0 1 2 8 t g t 6 7 c a 3 4 5 goto function i 1 2 3 4 5 6 7 8 f(i) 0 0 0 1 2 0 3 0 failure function i output(i) 2 {ca 5 {ca,tca 7 {cgt 8 {cat output function Όπως παρατηρούµε, η αρχική κατάσταση αριθµείται µε 0, η συνάρτηση goto αντιστοιχεί τα ζεύγη της µορφής (state, c) είτε στην επόµενη κατάσταση µετάβασης είτε στο µήνυµα fail (mismatch), ενώ η συνάρτηση failure-function µας δίνει την επόµενη κατάσταση µετά από ένα mismatch. - 15 -

Σε κάθε βήµα του αλγορίθµου, το αυτόµατο λειτουργεί ως εξής: εάν g(s, α) = s, το αυτόµατο µεταπηδά στην κατάσταση s και ο επόµενος χαρακτήρας της ακολουθίας διαβάζεται στην είσοδο, εάν g(s, α) = fail, το αυτόµατο µεταβαίνει στην κατάσταση s =f(s) σύµφωνα µε τη failure function. H αναζήτηση συνεχίζεται µε τρέχουσα κατάσταση την s και σύµβολο εισόδου το χαρακτήρα που ήδη έχει διαβαστεί στην είσοδο α. Στο ακόλουθο διάγραµµα δίνουµε τον αλγόριθµο αναζήτησης βάσει του Aho-Corasick αυτοµάτου, και στη συνέχει δείχνουµε πώς υλοποιούνται οι συναρτήσεις goto & failure-function. Pattern Matching Machine state 0 for i 1 until n do while g(state, α j ) = fail do state f(state) state g(state, α i ) if output(state) empty then print i print output(state) end end end Πίνακας 2.4.α: Αλγόριθµος Aho-Corasick Αυτοµάτου Κατασκευή της goto συνάρτησης Για την κατασκευή της συνάρτησης goto, δηµιουργούµε ένα γράφο µετάβασης καταστάσεων, όπου η αρχική κατάσταση είναι η 0. Στη συνέχεια εισάγουµε κάθε λέξη/ πρότυπο, δηµιουργώντας ένα κατευθυνόµενο µονοπάτι από την αρχική κατάσταση. Προσθέτουµε νέες κορυφές και ακµές, όταν αυτό είναι απαραίτητο. not c or t c a 0 1 2 not c or t c a 0 1 2 Εισαγωγή του ca t c a 3 4 5 Εισαγωγή του tca - 16 -

Όπως παρατηρούµε και από τα παραπάνω σχήµατα κάθε διαδροµή από την αρχική κατάσταση 0, σε µια τελική διαβάζει (spells) και µια λέξη από το σύνολο των προτύπων. Κατασκευή της failure-function συνάρτησης Η συνάρτηση failure-function, κατασκευάζεται µε τη βοήθεια της συνάρτησης goto. Για κάθε κατάσταση state-s, του γράφου goto ορίζουµε ως βάθος- depth(s): το µικρότερο µονοπάτι σε µήκος από την αρχική κατάσταση στην κατάσταση s. Όπως παρατηρούµε στο σχήµα α, depth(0)=0, depth(1)=depth(3)=1 κτλ. Υπολογίζουµε το βάθος κάθε κατάστασης ξεκινώντας από τις καταστάσεις βάθους 1, βάθους 2, κοκ, χρησιµοποιώντας την ακόλουθη αναδροµική σχέση: f(s) = 0, για κάθε κατάσταση s, βάθους 1. Για να υπολογίσεις το f(s), για κάθε κατάσταση s, βάθους d, θεώρησε όλες τις καταστάσεις r, βάθους d-1 : Αν g(r,α) = fail, για κάθε α, µην κάνεις τίποτα, ιαφορετικά, για κάθε σύµβολο α, έτσι ώστε g(r,α)= s, τότε: o Θέσε state = f(r) o Εκτέλεσε την εντολή state f(state), έως ότου g(state, α) fail o Θέσε f(s)= g(state, α) Οι αλγόριθµοί κατασκευής των συναρτήσεων failure-function, και goto δίνονται στη συνέχεια. - 17 -

Construction of the goto function Input: P={p 1,p 2,.p k Output: goto function newstate 0 for i 1 until k do enter p i % enter(p) inserts into the goto graph a path that spells out p for all α such that g(0,α)= fail do g(0,α) 0 end procedure enter (α 1,α 2, α m ) state 0; j 1; while g(state, α j ) fail do state g(state, α j ) j j+1 end for p j until m do newstate newstate+1 g(state, α p ) newstate state newstate end output(state) {α 1, α 2, α m Construction of the failure function Input: goto function & output function Output: failure function queue empty for each α such that g(0,α)= s 0 do queue queue {s f(s) 0 end while queue empty do let r be the next state in queue queue queue {r for each α such that g(r,α) s fail do queue queue {s state f(r) while g(state, α) = fail do state f(state) f(s) g(state, α) output (s) output(s) output(f(s)) end end end Πολυπλοκότητα: Αν το σύνολο των προτύπων έχει συνολικό µήκος n, ενώ το µήκος της ακολουθίας εισόδου είναι m, o αλγόριθµος Aho-Corasick απαιτεί O(n) χρόνο για τη δηµιουργία του αυτοµάτου σε ένα προ-επεξεργαστικό βήµα και O(m+k) χρόνο αναζήτησης, όπου k, το πλήθος των εµφανίσεων των προτύπων στην ακολουθία. 2.5 Εφαρµογές των αλγορίθµων ακριβούς ταιριάσµατος προτύπου στην Ανάλυση Ακολουθιών Βιολογικών εδοµένων Κλείνοντας σε αυτό το σηµείο την αναφορά µας σε αλγορίθµους ακριβούς ταιριάσµατος προτύπου θα αναφέρουµε ορισµένες από τις εφαρµογές τους στην Ανάλυση Ακολουθιών Βιολογικών εδοµένων. Η πρώτη εφαρµογή αναφέρεται στην αναζήτηση Sequence-taggedsite (STS) & Expressed Sequence Tags (ESTs) σε ακολουθίες γονιδιωµάτων. Χωρίς να µπαίνουµε σε βιολογικές λεπτοµέρειες, τα STS, αποτελούν τµήµατα του DNA µήκους 200-300 νουκλεοτιδίων, των οποίων τα αριστερά και δεξιά άκρα µήκους 20-30 νουκλεοτιδίων το καθένα - 18 -

εµφανίζονται µοναδικά κατά µήκος ενός γονιδιώµατος και άρα έχουν χαρακτηριστική σηµασία για το γονιδίωµα αναφοράς/ µελέτης. Ένας από τους πρώτους στόχους του Human Genome Project, ήταν η χαρτογράφηση επιλεγµένων STS, και σε ένα δεύτερο επίπεδο η αναζήτηση ESTs, τα οποία προέρχονται από mrna & cdna ακολουθίες και αντιπροσωπεύουν τα τµήµατα κωδικοποίησης µιας πρωτεΐνης σε µια ακολουθία γονιδίων. Η χρήση αυτοµάτων αναζήτησης προτύπων (όπως το Aho-Corasick Automaton), αποτελούν άµεση εφαρµογή των προηγούµενων µεθόδων. Η δεύτερη εφαρµογή αναφέρεται στην αναζήτηση «κανονικών εκφράσεων» (regular expressions) σε βιολογικές ακολουθίες. Μια «κανονική έκφραση» αποτελεί ένα γενικευµένο σχήµα έκφρασης προτύπων (patterns) που εµφανίζουν δοµική οµοιότητα (ως προς την ακολουθία των συµβόλων που περιλαµβάνουν). Η Βάση εδοµένων PROSITE, αποτελεί την κύρια Βάση εδοµένων, αποθήκευσης σηµαντικών προτύπων σε πρωτεΐνες. Για παράδειγµα η κανονική έκφραση: [ED]-[EN]-L-[SAN]-x-x-[DE]-x-E-L, κωδικοποιεί ένα σύνολο λέξεων, µήκους 10 χαρακτήρων, όπου κάθε θέση διαχωρίζεται από τις άλλες µε χρήση παύλας -, ενώ τα κεφαλαία γράµµατα αντιπροσωπεύουν αµινοξέα, και τα κεφαλαία γράµµατα που αποθηκεύονται σε αγκύλες περιλαµβάνουν πιθανά αµινοξέα, όπου 1 επιλέγεται µόνο για κάθε θέση. Ένα αποδεκτό πρότυπο είναι το ENLSSEDEEL. Η χρήση αλγορίθµων αναζήτησης προτύπων αποτελούν ακόµα µια άµεση εφαρµογή στον εντοπισµό δεκτών προτύπων, όπως αυτά καθορίζονται από µια κανονική έκφραση, κατά µήκος ακολουθιών πρωτεϊνών. Η πολυπλοκότητα επίλυσης του προβλήµατος είναι O(n*m), όπου n το µήκος της κανονικής έκφρασης και m το µήκος της πρωτεϊνικής ακολουθίας. - 19 -

Βιβλιογραφικές Αναφορές 1. D.Gusfield. Algorithms on strings, trees and sequences. Cambridge University Press 1997. 2. R. Baeza-Yates and G.H. Gonnet. A new approach to text searching. Communications of the ACM, Vol. 35, pp. 74-82, 1992. 3. R.S. Boyer and J.S. Moore, A fast string searching algorithm, Communications of the ACM, Vol. 20, pp. 762-772, 1977. 4. D.E. Knuth, J. Morris, V.R. Pratt, Fast Pattern Matching in strings, SIAM Journal of Computing, Vol. 6 (1), pp. 323-350, 1977. - 20 -