Aλγόριθµοι αναγνώρισης συµβολοσειρών µε εφαρµογές στα βιολογικά δεδοµένα ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ Χρήστος Τζόκας Θεσσαλονίκη Oκτώβριος 2008 Τµήµα Πληροφορικής Α.Π.Θ. 1
ΠΕΡΙΕΧΟΜΕΝΑ 1. Εισαγωγή...3 2. Περίληψη.....4 3. Αλγόριθµοι ακριβούς αναζήτησης...5 3.1 Αλγόριθµος Καrp-Rabin.......5 3.2 Αλγόριθµος Κnuth-Morris Pratt... 7 3.3 Αλγόριθµος Boyer Moore...9 4. έντρο Επιθεµάτων- Suffix Tree...12 5. Αλγόριθµος αναζήτησης µε χρήση της Αναλυτικής Θεωρίας Αριθµών...17 6. Παραρτήµατα...20 Παράρτηµα 6.1...20 Παράρτηµα 6.2...23 Παράρτηµα 6.3...26 Παράρτηµα 6.4...29 8. Αποτελέσµατα...32 9. Συµπεράσµατα...33 7. Βιβλιογραφία...34 2
1. Εισαγωγή H αναγνώριση οµοιοτήτων σε συµβολοσειρές (string matching) είναι ένα βασικό πρόβληµα στην επιστήµη των υπολογιστών που έχει προβληµατίσει αρκετά και τυγχάνει µεγάλης προσοχής από τους επιστήµονες. Οι διάφορες τεχνικές και σχετικοί αλγόριθµοι που υλοποιούν την αναζήτηση οµοιοτήτων σε συµβολοσειρές, χρησιµοποιούνται για τον έλεγχο των δεδοµένων ως προς το αν έχουν κάποια συγκεκριµένη δοµή, για την εύρεση σχετικών-παρόµοιων δοµών, και την αντικατάσταση συγκεκριµένου κοµµατιού πληροφορίας µε κάποιο άλλο. Πιο συγκεκριµµένα, η αναγνώριση οµοιοτήτων σε συµβολοσειρές έχει άµεση εφαρµογή σε εφαρµογές που σχετίζονται µε επεξεργασία δεδοµένων, επεξεργασία-αναζήτηση κειµένου, αναγνώριση οµιλίας, ανάκτηση πληροφορίας και ανάλυση-αποθήκευση-οργάνωση βιολογικών δεδοµένων. Βιοπληροφορική είναι η διαχείριση της Βιολογίας σε όρους µορίων (µε την έννοια της Φυσικής Χηµείας) και η εφαρµογή τεχνικών πληροφορικής (εφαρµοσµένα µαθηµατικά, επιστήµη των υπολογιστών και στατιστική) για την κατανόηση και οργάνωση πληροφορίας που σχετίζεται µε τα µόρια σε µεγάλη κλίµακα. Οι αλγόριθµοι αναζήτησης οµοιοτήτων σε συµβολοσειρές, µπορούν να χωρισθούν σε τέσσερις κατηγορίες : 1. Αλγόριθµοι που βασίζονται στην σύγκριση χαρακτήρων. Π.χ. Οι αλγόριθµοι Brute force, Knuth-Morris-Pratt, Simon,Collucci, Boyer Moore, και Turbo-BM. 2. Αλγόριθµοι που χρησιµοποιούν Suffix αυτόµατα. Π.χ. Οι αλγόριθµοι Reverse Factor και Turbo Reverse Factor. 3. Αλγόριθµοι που χρησιµοποιούν τον παραλληλισµό των χειρισµών των bit στις ψηφιολέξεις για να εκτελούν παράλληλα πολλές λειτουργίες. Π.χ. Οι αλγόριθµοι Shift-Or, Shift-and και BNDM. 3
4. Αλγόριθµοι που χρησιµοποιούν τεχνικές κατακερµατισµού. Π.χ. Οι αλγόριθµοι Harrison και Karp-Rabin. 2. Περίληψη Σκοπός της παρούσης πτυχιακής εργασίας είναι η καταγραφή και κατανόηση των αλγορίθµων που βασίζονται στη σύγκριση χαρακτήρων καθώς επίσης και η σύγκριση αυτών των παραδοσιακών µεθόδων µε µια νέα πιθανοθεωρητική µεθόδο που βασίζεται στη µέθοδο κατακερµατισµού που αναπτύχθηκε από τους κ. Ατρέα και Καρανίκα (βλ. [2]). H κύρια ιδέα της νέας µεθόδου βασίζεται στη χρήση πρώτων αριθµών ώστε να έχουµε ένα «αποτύπωµα» µιας λέξης. Ετσι ορίζεται ένας µετασχηµατισµός T πάνω στο σύνολο S όλων των λέξεων µήκους N σε αλφάβητο I m ={0,,m}, όπου κάθε σύµβολο αντιστοιχεί σε έναν αριθµό: T: S Q +, T(x 1 x N ) = N xi, xi I m, p i= 1 i όπου p i είναι ο i-πρώτος αριθµός µεγαλύτερος του m και Q + είναι το σύνολο των θετικών ρητών. Ο µετασχηµατισµός T µπορεί να θεωρηθεί υπό µία έννοια ως ένας µέσος όρος µε βάρη, όπου σε κάθε χαρακτήρα x i τα βάρη 1/p i καθορίζονται από διαδοχικούς πρώτους. Tο κείµενο x ανακτάται από το αποτύπωµά του ως η µοναδική λύση ενός συστήµατος N γραµµικών διοφαντικών εξισώσεων a i x i +b i c i+1 = c i, i = 1,,N-1, όπου ο c i oρίζεται αναδροµικά. Ο προκύπτων αλγόριθµος αναζήτησης έχει O ( N M ) πολυπλοκότητα. Για να υπερκερασθεί αυτό το µειονέκτηµα, ορίζεται µία συνάρτηση κατακερµατισµού T % έτσι ώστε T% ( x) T( x) < ε για κάθε λέξη x S, όπου ε είναι ένα προκαθορισµένο όριο ανοχής. Τότε ο νέος αλγόριθµος αναζήτησης έχει O ( N) πολυπλοκότητα, αλλά δεν έχει µοναδικότητα. Στην παρούσα πτυχιακή η νέα µέθοδος κατακερµατισµού υλοποιήθηκε σε αλγόριθµο σε λογισµικό Mathematica και όλοι οι υπόλοιποι αλγόριθµοι σε γλώσσα C. Από τη µελέτη προέκυψε ότι η νέα µέθοδος κατακερµατισµού έχει το µειονέκτηµα της µη µοναδικότητας όπως και η αντίστοιχη ανταγωνιστική µέθοδος του Κarp-Rabin. Επίσης µειονέκτηµα είναι και το γεγονός ότι η νέα µέθοδος χρησιµοποιεί µεγάλους πρώτους αριθµούς που επιφέρουν σφάλµατα στρογγυλοποίησης. Φαίνεται λοιπόν ότι αν και είναι ανταγωνιστική προς τους παραδοσιακούς αλγορίθµους για πρότυπα µικρού µήκους, για πρότυπα µεγάλου µήκους υστερεί σε χρόνο εκτέλεσης. 4
3. Αλγόριθµοι ακριβούς Αναζήτησης 3.1 Αλγόριθµος Karp-Rabin Eισαγωγή Ο αλγόριθµος Κarp-Rabin είναι ένας αλγόριθµος ακριβούς αναζήτησης/ανίχνευσης όλων των θέσεων όπου µια συµβολοσειράπρότυπο µήκους m κείται εντός µιας άλλης συµβολοσειράς µήκους n>m. Aνακαλύφθηκε από τον Michael O.Rabin και Richard M.Karp (βλ. [4]). Σύντοµη Περιγραφή Ο πιο απλός τρόπος αντιµετώπισης προβληµάτων ακριβούς αναγνώρισης συµβολοσειρών είναι να ελέγχουµε την οµοιότητα των υπό εξέταση συµβολοσειρών στοιχείο προς στοιχείο (Brute Force algorithm). Στον αλγόριθµο Karp-Rabin, αντί να γίνεται έλεγχος οµοιότητας σε κάθε στοιχείο των συµβολοσειρών χρησιµοποιείται µια συνάρτηση κατακερµατισµού, η οποία αντιστοιχεί σε κάθε συµβολοσειρά έναν αριθµό την «ψηφιακή» υπογραφή του. Σηµειώνουµε ότι, ακόµη και όταν η παραπάνω συνάρτηση κατακερµατισµού αντιστοιχεί σε δύο συµβολοσειρές τον ίδιο αριθµό δεν σηµαίνει ότι οι συµβολοσειρές ταυτίζονται, αλλά ότι έχουν «µεγάλη» πιθανότητα να ταυτίζονται. Σ αυτή την περίπτωση θα πρέπει να ελέγξουµε στοιχείο-στοιχείο εάν όντως οι προς εξέταση συµβολοσειρές είναι όµοιες. Λειτουργία Έστω ένα αλφάβητο Σ = {a o,a 1,a 2, a k-1 } µεγέθους Σ =κ. Σε κάθε στοιχείο του αλφαβήτου αντιστοιχούµε µοναδικό φυσικό αριθµό από το σύνολο {0,1,2.κ-1}. 5
Εστω y = {y[0],,y[n]} µία συµβολοσειρά µε στοιχεία από το αλφάβητο Σ. Μια συνάρτηση κατακερµατισµού, συµβολικά hash(y) απεικονίζει σε κάθε συµβολοσειρά y έναν αριθµό. Μία τέτοια συνάρτηση απαιτούµε να ικανοποιεί τις ακόλουθες ιδιότητες: 1. να είναι εύκολα υπολογίσιµη 2. η τιµή hash(y[1 µ+1]) να υπολογίζεται εύκολα από την ήδη υπολογισθείσα τιµή (y[0 µ]), µ<n. Στην περίπτωση Karp-Rabin, η τιµή hash(y[0 n]) υπολογίζεται ως εξής: hash(y[0 n]) = (y[0]*k n-1 + y[1] *k n-2 + +y[n-1] *k 0 ) mod q, όπου q ένας µεγάλος αριθµός. Στη συνέχεια: hash(y[1 n+1]) = (k * (hash(y[0,,n]) y[0] * k n-1 )+y[n+1]) mod q. Κατά την φάση της προ-επεξεργασίας, υπολογίζεται πρώτα η τιµή κατακερµατισµού hash(x) της συµβολοσειράς-προτύπου x=x[0,,m]. Αυτό γίνεται σε χρόνο Ο(M). Eστω y = y[0 n] n>m είναι η συµβολοσειρά εντός της οποίας αναζητούµε εάν υπάρχει κάπου η συµβολοσειρά x. Κατά την διάρκεια της αναζήτησης γίνεται σύγκριση της τιµής hash(x) µε τις τιµές hash(y[ j j+m-1]) για 0 j n-m. Αν ισχύει hash(x)=hash(y[ j j+m-1]) για κάποια j, τότε πάλι πρέπει να εξεταστούν στοιχείο προς στοιχείο οι συµβολοσειρές x[0,,m] και y[j j+m-1] για επιβεβαίωση της οµοιότητας. Πολυπλοκότητα Για την ανίχνευση µιας συµβολοσειράς-πρότυπο x µέσα σε µια συµβολοσειρά y, η χρονική πολυπλοκότητα του αλγόριθµου Karp-Rabin στην καλύτερη περίπτωση είναι Ο(n). Η µέση χρονική πολυπλοκότητα είναι επίσης Ο(n), ενώ η πολυπλοκότητα στην χειρότερη περίπτωση είναι Ο(mn). Χρήση O αλγόριθµος Karp-Rabin χρησιµοποιείται κυρίως για ταυτόχρονη αναγνώριση πολλαπλών συµβολοσειρών-προτύπων, εντός µιας µεγαλύτερης συµβολοσειράς. Aλγόριθµος-Παράδειγµα 6
Βλέπε Παράρτηµα 1. 3.2 Αλγόριθµος Knuth-Morris-Pratt Eισαγωγή Ο αλγόριθµος Knuth-Morris-Pratt είναι ένας αλγόριθµος ακριβούς αναζήτησης/ανίχνευσης όλων των θέσεων όπου µια συµβολοσειράπροτύπου µήκους m κείται εντός µιας άλλης συµβολοσειράς µήκους n>m. Ο αλγόριθµος δηµιουργήθηκε από τους Donald Knuth και Vaughan Pratt και ανεξάρτητα από τον J.H.Morris to1977, αλλά τον δηµοσιεύσαν και οι τρεις µαζί (βλ. [5]). Σύντοµη Περιγραφή Είναι µια σαφής βελτίωση του brute force αλγορίθµου και συγκρίνει τις συµβολοσειρές από αριστερά προς τα δεξιά. Μετά από κάθε αποτυχηµένη απόπειρα ταιριάσµατος της υποσυµβολοσειράς στην συµβολοσειρά,ο αλγόριθµος δεν ξεκινάει από το επόµενο σύµβολο, αλλά ξεκινάει µετά από κάποιο αριθµό συµβόλων, ο οποίος εξαρτάται από την πληροφορία που έχει συγκεντρωθεί από την σύγκριση των προηγούµενων χαρακτήρων. Λειτουργία Έστω ότι συγκρίνουµε την υποσυµβολοσειρά x µε το τµήµα y[ j j+m-1] της συµβολοσειράς y. Βρισκόµαστε δηλαδή στην θέση j. Έστω ότι τα πρώτα σύµβολα που δεν ταιριάζουν είναι τα x[ i ] και y[ i+j] µε 0< i <m. 7
Τότε x[0 i-1] = y[ j i+j-1] = U και a = x[ i ] y[ i+j ] = b. Όταν ο αλγόριθµος δοκιµάσει πάλι να κάνει την σύγκριση των συµβολοσειρών ξεκινώντας από κάποια επόµενη θέση, είναι λογικό να περιµένει κανείς ότι κάποιο πρόθεµα u της x πρέπει να ταιριάζει µε ένα µέρος της κατάληξης του τµήµατος U της y. Επίσης, για να αποφύγουµε ένα άµεσο µη ταίριασµα συµβόλων, πρέπει το σύµβολο που ακολουθεί το πρόθεµα u στο x να είναι διαφορετικό από a. Το µεγαλύτερο τέτοιο πρόθεµα u αποκαλείται tagged border. Για τον βοηθητικό πίνακα kmpnext ισχύει: το kmpnext[ i ] ισούται µε το µήκος του µεγαλύτερου border του x[0 i-1] που ακολουθείται από ένα χαρακτήρα c διαφορετικό του x[ i ] για 0< i m και µε -1 αν δεν υπάρχει τέτοιο tagged border. Έτσι, η σύγκριση µπορεί να συνεχιστεί µεταξύ των συµβόλων x[kmpnext[ i ] ] και y[i+j] µε ασφάλεια,χωρίς να υπάρχει ο κίνδυνος να χαθεί κάποιο ταίριασµα της υποσυµβολοσειράς χ στην y και χωρίς να γίνει οπισθοδρόµηση στην y. Η τιµή του kmpnext[0] τίθεται ίση µε -1. Ο πίνακας kmpnext υπολογίζεται πριν την φάση της αναζήτησης, εφαρµόζοντας τον ίδιο ευριστικό αλγόριθµο στην υποσυµβολοσειρά x την ίδια, σαν να ισχύει x=y. Πολυπλοκότητα Για υποσυµβολοσειρά x, µήκους m και συµβολοσειρά y, µήκους n, κατά την φάση της προεπεξεργασίας δηµιουργείται ο βοηθητικός πίνακας σε Ο(m) χώρο και χρόνο. Η αναζήτηση γίνεται σε χρόνο Ο(m+n). Κατά την διάρκεια της αναζήτησης γίνονται το πολύ 2n-1 συγκρίσεις συµβόλων, ενώ η καθυστέρηση (µέγιστος αριθµός συγκρίσεων για ένα σύµβολο) οριοθετείται από το log φ (m), όπου φ,η χρυσή τοµή.(φ= (1+ 5) / 2 ). Χρήση Ο αλγόριθµος Knuth-Morris-Pratt χρησιµοποιείται για την αναγνώριση µιας µικρής σχετικά συµβολοσειράς - προτύπου, εντός µιας µεγαλύτερης συµβολοσειράς. Aλγόριθµος-Παράδειγµα 8
Βλέπε Παράρτηµα 2. Eισαγωγή 3.3 Αλγόριθµος Boyer Moore Ο αλγόριθµος Boyer Moore αναπτύχθηκε από τους Bob Boyer και J.Strother Moore το 1977. Θεωρείται ο πιο αποτελεσµατικός αλγόριθµος εύρεσης συµβολοσειράς στις περισσότερες εφαρµογές (βλ. [2]). Σύντοµη Περιγραφή Ελέγχει την υπό εύρεση υποσυµβολοσειρά από τα δεξιά προς τα αριστερά και σε περίπτωση ταιριάσµατος της υποσυµβολοσειράς ή µη, χρησιµοποιεί δυο προϋπολογισµένες συναρτήσεις για να βρει την επόµενη θέση από την οποία θα ξεκινήσει πάλι την διαδικασία σύγκρισης των συµβόλων της συµβολοσειράς µε αυτά της υποσυµβολοσειράς. Γενικά, όσο ποιο µεγάλο είναι το µήκος της υποσυµβολοσειράς,τόσο ποιο γρήγορος και αποδοτικός είναι ο αλγόριθµος. Λειτουργία Σχήµα (α). Υπάρχει πάλι ταύτιση του U,του οποίου προηγείται το c a. Έστω ότι δεν υπάρχει ταίριασµα του συµβόλου χ[ i ] = a υποσυµβολοσειράς x και του συµβόλου y[ i+j ]= b της συµβολοσειράς y. της Έπίσης, x[ i+1 m -1] = y[ i+j+1 j+m-1] = U και x[ i ] y[ i+j]. 9
Η συνάρτηση good-suffix shift ευθυγραµµίζει το τµήµα y[ i+j+1 j+m-1] = x[ i+1 m -1]=U µε µια δεξιότερη ταύτισή του στην x,της οποίας προηγείται ένα σύµβολο διαφορετικό του χ[ i ]= a. Aν δεν υπάρχει ταύτιση του τµήµατος U, τότε η συνάρτηση ευθυγραµµίζει την µεγαλύτερη κατάληξη u του y[ i+j+1 j+m-1] µε ένα ταιριαστό πρόθεµα της x. Σχήµα (β). Μόνο µια κατάληξη του U συναντιέται στην χ. Η συνάρτηση bad-character shift ευθυγραµµίζει το σύµβολο y[ i+j] µε την δεξιότερη εµφάνισή του στην χ[0...m 2]. Σχήµα (γ) Γίνεται ταύτιση του y[ i+j]= b µέσα στο χ. Αν το y[ i+j] =b δεν υπάρχει στο x[0...m 2], τότε καµiα υποσυµβολοσειρά της y που να συµπεριλαµβάνει το y[i+j] δεν ταυτίζεται µε την x και γίνεται µια µετατόπιση, τέτοια ώστε η υποσυµβολοσειρά x να ξεκινάει από τη θέση του επόµενου συµβόλου του y[ i+j],που είναι το y[ i+j+1]. Η bad-character shift µπορεί να είναι αρνητική, επειδή ο αλγόριθµος Boyer Moore επιλέγει πάντα την µεγαλύτερη από τις good-suffix shift και badcharacter shift. Σχήµα (δ) εν υπάρχει το y[ i+j]= b µέσα στο χ. 10
Η good-suffix shift αποθηκεύεται σε ένα πίνακα bmgs µεγέθους m+1. Συνθήκες : 1. Cs(i, s): για κάθε κ τέτοιο ώστε i < k < m, s κ ή x[k-s]=x[k] και 2. Co(i, s): αν s < i τότε x[i-s] x[i]. Έπειτα, για 0 i < m: bmgs[i+1]=min{s>0 : Cs(i, s) and Co(i, s) hold}. Το bmgs[0] ορίζεται ως το µήκος της περιόδου της x. Ο υπολογισµός του πίνακα bmgs στον κώδικα που ακολουθεί,χρησιµοποιεί ένα πίνακα suff που ορίζεται ως εξής: for 1 i < m, suff[ i ]=max{ k : x[ i-k+1.. i] = x[m-k.. m-1] }. Η bad-character shift αποθηκεύεται σε ένα πίνακα bmbc µεγέθους σ. Για c Є Σ : bmbc[c] = min {i : 1 i < m -1 and x[ m-1-i ]=c} αν το σύµβολο c υπάρχει στην χ. Αλλιώς, bmbc[c] = m. Πολυπλοκότητα Για υποσυµβολοσειρά χ, µήκους m και συµβολοσειρά y, µήκους n και µε µήκος αλφαβήτου Σ =σ, η φάση της προεπεξεργασίας κατά την οποία δηµιουργούνται οι δυο πίνακες από τις δυο συναρτήσεις Good-suffix shift και Bad-character shift, έχει Ο(m+σ) χωρική και χρονική πολυπλοκότητα. Η φάση της αναζήτησης έχει χρονική πολυπλοκότητα Ο(mn) και στην χειρότερη περίπτωση που η υποσυµβολοσειρά δεν είναι περιοδική,ο αλγόριθµος κάνει 3n συγκρίσεις συµβόλων. Στις περιπτώσεις που το µήκος του αλφάβητου είναι µεγάλο (σε σχέση µε το µήκος της υπό εύρεσης υποσυµβολοσειράς) ο αλγόριθµος είναι πολύ αποδοτικός.όταν ψάχνει για συµβολοσειρά α m-1 b σε µια b n o αλγόριθµος κάνει O(n/m) συγκρίσεις.(καλύτερη απόδοση). Χρήση Ο αλγόριθµος Boyer Moore, χρησιµοποιείται κυρίως για την αναγνώριση µιας µεγάλης σε µήκος συµβολοσειράς-προτύπου, εντός µιας µεγαλύτερης συµβολοσειράς. 11
Aλγόριθµος-Παράδειγµα Βλέπε Παράρτηµα 3. 4. έντρο Επιθεµάτων- Suffix Tree Περιγραφή To suffix tree είναι µια από τις πιο σηµαντικές δοµές δεδοµένων στους αλγόριθµους συµβολοσειρών. Μπορεί να αναπαριστά το σύνολο των επιθεµάτων µιας συµβολοσειράς µε οικονοµικό και αποδοτικό τρόπο. Περιέχει µονοπάτι από την ρίζα έως ένα φύλλο για κάθε κατάληξη της συµβολοσειράς, έτσι ώστε κάθε υποσυµβολοσειρά να µπορεί να διαβασθεί ως πρόθεµα κάποιου µονοπατιού. Οι πλευρές του δένδρου έχουν ετικέτες τις υποσυµβολοσειρές και όλοι οι εσωτερικοί κόµβοι έχουν τουλάχιστον 2 παιδιά. Οι υπο-συµβολοσειρές των πλευρών που εξέρχονται από τον ίδιο κόµβο δεν επιτρέπεται να έχουν κοινό τον πρώτο τους χαρακτήρα. Στο δένδρο υπάρχουν n φύλλα, όπου n το µήκος της συµβολοσειράς, το πολύ n-1 εσωτερικοί κόµβοι (χωρίς την ρίζα) και συνολικά το πολύ 2n κόµβοι. Πρέπει κάθε συµβολοσειρά, για την οποία εξετάζουµε το δένδρο επιθεµάτων της, να έχει τελικό χαρακτήρα ο οποίος δεν εµφανίζεται πουθενά αλλού στην συµβολοσειρά. Για να επιτευχθεί αυτό το ενδεχόµενο προσθέτουµε στο τέλος των συµβολοσειρών κάποιο τερµατικό χαρακτήρα (συνήθως τον $) ο οποίος δεν ανήκει στο αλφάβητο της συµβολοσειράς. Ο πρώτος γραµµικός ως προς τον χρόνο suffix tree αλγόριθµος αναπτύχθηκε από τον Weiner το 1973. Ένας πιο αποδοτικός ως προς τον χώρο αλγόριθµος,αναπτύχθηκε από τον McCreight το 1976 και ο Ukkonen έκανε τον πρώτο online-construction, γραµµικό ως προς τον χρόνο αλγόριθµο,το 1995. Πολυπλοκότητα Ένα suffix tree για συµβολοσειρά S µήκους n, µπορεί να κατασκευαστεί σε Ο(n) χρόνο. Εντοπίζει µια υποσυµβολοσειρά P µεγέθους m σε Ο(m) χρόνο. 12
Εντοπίζει το πρώτο ταίριασµα των υποσυµβολοσειρών P 1 P q, συνολικού µήκους m, σε Ο(m) χρόνο,όταν το suffix tree δηµιουργείται µε τον αλγόριθµο του Ukkonen. Εντοπίζει όλα τα z ταιριάσµατα των υποσυµβολοσειρών P 1 P q, συνολικού µήκους m, σε Ο(m+z) χρόνο. Κατασκευή του έντρου Επιθεµάτων Ο απλός αλγόριθµός κατασκευής δένδρου επιθεµάτων για την συµβολοσειρά S (µήκους S =n) αρχικά θεωρεί ότι το δένδρο αποτελείται µόνο από την ρίζα και εισάγει σε αυτό διαδοχικά όλα τα επιθέµατα S[i..n], µε το i να αυξάνεται από το 1 µέχρι και το n. Αρχικά εισάγεται το επίθεµα S[1..n] (ολόκληρη η συµβολοσειρά δηλαδή) κάτω από την ρίζα εισάγοντας µία πλευρά και ένα φύλλο. Η ετικέτα της πλευράς καθώς και η ετικέτα µονοπατιού του φύλλου είναι S[1..n]. Στο i-στο βήµα όπου εισάγουµε το επίθεµα S[i..n] αρχίζουµε κατεβαίνουµε από την ρίζα προς τα φύλλα ακολουθώντας το µοναδικό µονοπάτι που ορίζεται από τους χαρακτήρες του επιθέµατος. Πιο συγκεκριµένα ξεκινώντας από την ρίζα ακολουθούµε την πλευρά που η ετικέτα της αρχίζει µε τον χαρακτήρα S(i) και διαδοχικά συγκρίνουµε τους χαρακτήρες του επιθέµατος µε τους χαρακτήρες των ετικετών των πλευρών που συναντάµε µέχρι κάποιος χαρακτήρας να µην ταιριάζει. Έστω ότι δεν ταίριασε ο χαρακτήρας S(k),το k i. Κατά την κάθοδό µας από την ρίζα υπάρχουν δύο ενδεχόµενα: είτε βρισκόµαστε σε κάποιο κόµβο (ο οποίος θα έχει και ετικέτα µονοπατιού ίση µε S[i..k-1]) είτε στο µέσο της ετικέτας µιας πλευράς. Αν ισχύει η πρώτη περίπτωση εισάγουµε το υπόλοιπο του επιθέµατος (S[k..n]) εισάγοντας παράλληλα µία πλευρά και ένα φύλλο το οποίο θα πάρει και τον αριθµό i µιας και αντιστοιχεί σ αυτό το επίθεµα. Εάν ισχύει η δεύτερη περίπτωση σπάµε στην πλευρά στη µέση δηµιουργώντας ένα εσωτερικό κόµβο µε ετικέτα µονοπατιού S[i..k-1] και εισάγουµε το υπόλοιπο του επιθέµατος (S[k..n]) εισάγοντας παράλληλα µία πλευρά και ένα φύλλο, το οποίο θα πάρει και τον αριθµό i, κάτω από τον νεοσύστατο κόµβο. Για παράδειγµα,έστω η συµβολοσειρά mississippi. 13
14
15
Όσον αφορά την εισαγωγή του i,είναι τελικός χαρακτήρας και κανονικά δεν θα έπρεπε να εµφανίζεται πουθενά αλλού, κάτι που στην συγκεκριµένη περίπτωση δεν ισχύει. Γι αυτό έπρεπε να εισαχθεί στο τέλος της συµβολοσειράς το $. Οπότε το τελικό αποτέλεσµα θα ήταν ως εξής: 16
5. Αλγόριθµος αναζήτησης µε χρήση της Αναλυτικής Θεωρίας Αριθµών Περιγραφή Εστω I p = {0,1,2,,p} είναι ένα σύνολο µη αρνητικών ακεραίων ορίζουµε το ακόλουθο σύνολο: X = {x = {x 1,,x N }: x i I p }. Εστω p i είναι ο i στός -πρώτος µεγαλύτερος του p, ορίζουµε την ακόλουθη απεικόνιση: p T : X B : T( x) = x, p N i i i= 1 i+ 1 όπου B είναι ένα σύνολο θετικών ρητών. Τότε ο µετασχηµατισµός Τ(x) είναι 1-1 και απεδείχθη ότι: N pi Πρόταση Εστω T( x) = xi όπως παραπάνω, τότε x είναι η µοναδική i= 1 p i+ 1 λύση του ακολούθου συστήµατος N γραµµικών διοφαντικών εξισώσεων που εκφράζονται από την ακόλουθη αναδροµική διαδικασία: N N+ 1 Y = T ( x) p, K, Y = p x + p Y,..., Y = x. 1 i+ 1 k j k k+ 1 k+ 1 N N i= 1 j= k j k+ 1 Προφανώς η παραπάνω πρόταση είναι ένας τρόπος κωδικοποίησης και αποκωδικοποίησης της πληροφορίας. ηλαδή αν δοθεί ο ρητός Τ(x) εργαζόµαστε όπως στην Παραπάνω Πρόταση για να υπολογίσουµε τα x 1,,x N. Επίσης αναπτύσσεται µε φυσικό τρόπο µια νέα µέθοδος για αναγνώριση συµβολοσειρών. Εστω συµβολοσειρά W = {w 1,w 2,,w N }, σε αλφάβητο alphabet A = {a 0, a 1,,a p } (p+1)-γραµµάτων, τότε µετατρέπουµε τη συµβολοσειρά σε αριθµητική ακολουθία χρησιµοποιώντας την 1-1 αντιστοιχία f: A I p 17
οπότε έχουµε αντιστοιχίσει στο W έναν µοναδικό θετικό ρητό τον: p =. N T ( W ) f ( w ) p i i i= 1 i+ 1 υστυχώς όµως εµπεριέχεται η έννοια της συνέλιξης που δεν είναι καλή για υπολογισµούς όσον αφορά την εύρεση προτύπου εντός δοθείσης συµβολοσειράς. Για το λόγο αυτό προσεγγίζουµε τη συνάρτηση Τ µε µία συνάρτηση κατακερµατισµού ως εξής: Εστω συµβολοσειρές x = {x 1,x 2,,x N }, y = {y 1,y 2,,y M }, όπου Ν>Μ και έστω p i είναι ο i οστός -πρώτος µεγαλύτερος του Μ N 2, ορίζουµε: N N 1 T( x1... xn ) = 1 x i= 1 pi j= i j. (1) Ο µετασχηµατισµός T είναι 1-1 και εφόσον M < N, i =1,,N-M, είναι εύκολο να δούµε ότι: T ( x... x ) = T ( x... x ) S( i) + L x + ε, i+ 1 i+ M i i+ M 1 i+ M i όπου 1 S( i) = x, L= 1, = i+ M 1 M M i+ j 1 j ε i j= i j= 1 p j j= 1 p. j x Στη συνέχεια ορίζουµε µε T % τη συνάρτηση κατακερµατισµού: ( ) ( ) T% x... x = T% x... x S( i) + L x i+ 1 i+ M i i+ M 1 i+ M, (2) %. i = 2,,N-M όπου T( x... x ) = T( x... x ) 1 M 1 M Ο αλγόριθµος είναι ο εξής: οθέντος y = {y 1,,y M } και x = {x 1,,x N }: 18
(a) υπολογίζουµε τους αριθµούς T(x 1,,x M ) T(y 1,,y M ) (βλ. 1) και K = m 1 M M M 1 i= 1 p S = yi, S1 = xi. 2 i+ mn i= 1 i= 1 (b) Υπολογίζουµε τους αριθµούς ( ) τους αριθµούς S(i). T% xi+ 1... xi+ M, i= 2,..., N M (βλέπε 2) και (c) Φτιάχνουµε το σύνολο E υποψηφίων οµοιοτήτων χρησιµοποιώντας τον ακόλουθο µηχανισµό ανοχής: όπου i= 1,..., N M. { {,..., }: 0 % 1 (... 1 ) (,..., 1 ) and ( ) i+ i+ M i+ i+ M M } E = x x < T x x T y y i K S = S i 19
6. ΠΑΡΑΡΤΗΜΑΤΑ ΠΑΡΑΡΤΗΜΑ 6.1 Παρατίθεται η σχεδίαση του αλγορίθµου Karp-Rabin σε γλώσσα C: #define REHASH (a,b,h) ((((h)-(a)*d)<<1)+(b)) void KR( char *x, int m, char *y, int n) { int d, hx, hy, i, j ; /* προεπεξεργασία*/ /* υπολογισµός του d=2^(m-1) µε τον << χειριστή */ for ( d=i=1; i<m; ++i) d=(d<<1); for (hy=hx=i=0; i<m; ++i) { hx = ((hx<<1) +x[i]); hy = ((hy<<1) +y[i]); } /* φάση αναζήτησης */ j = 0; while ( j <= n-m) { } } ++j; if (hx == hy && memcmp(x, y+j, m) == 0) OUTPUT ( j ) ; hy = REHASH ( y[ j ], y[ j+m], hy ); 20
Παράδειγµα: Εστω συµβολοσειρά-πρότυπο x = {AACCT}, αναζητώ οµοιότητα στη συµβολοσειρά y = CACCAACCTCCG. Χρησιµοποιώ q = 123 και 4-αδικό σύστηµα αρίθµησης µε k = 4. 1 η προσπάθεια: y : C A C C A A C C T C C G x : Α Α C C T hash(y[0..4]) = 20 2 η προσπάθεια: y : C A C C A A C C T C C G x : Α Α C C T hash(y[1..5]) = 261 3 η προσπάθεια: y : C A C C A A C C T C C G x : Α Α C C T hash(y[2..6]) = 321 4 η προσπάθεια: y : C A C C A A C C T C C G x : Α Α C C T hash(y[3..7]) = 592 5 η προσπάθεια: y : C A C C A A C C T C C G x : Α Α C C T hash(y[4..8]) =404 = hash(x), οπότε πρέπει να συγκριθούν οι 5 χαρακτήρες για να επιβεβαιωθεί το ταίριασµα των συµβολοσειρών. 6 η προσπάθεια: y : C A C C A A C C T C C G x : Α Α C C T hash(y[5..9]) = 357 21
7 η προσπάθεια: y : C A C C A A C C T C C G x : Α Α C C T hash(y[6..10]) = 857 8 η προσπάθεια: y : C A C C A A C C T C C G x : Α Α C C T hash(y[7..11]) = 954 Ο αλγόριθµος Karp-Rabin στο συγκεκριµµένο παράδειγµα έκανε 8 συγκρίσεις µεταξύ τιµών κατακερµατισµού και 5 συγκρίσεις µεταξύ χαρακτήρων. 22
ΠΑΡΑΡΤΗΜΑ-6.2 Παρατίθεται η σχεδίαση του αλγορίθµου Knuth-Morris- Pratt: void prekmp(char *x, int m, int kmpnext[]) { int i, j; } 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; } void KMP(char *x, int m, char *y, int n) { int i, j,kmpnext[xsize]; } /* προεπεξεργασία */ prekmp(x, m, kmpnext); /* αναζήτηση */ 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]; } } Παράδειγµα : Εστω συµβολοσειρά-πρότυπο x = {GCAGAGAG} και αναζητώ οµοιότητα στη συµβολοσειρά y = {GCATCGCAGAGAGTATΑCAGTACG}. i 0 1 2 3 4 5 6 7 8 x[ i ] G C A G A G A G 23
kmpnext[ i ] -1 0 0-1 1-1 1-1 1 Φάση αναζήτησης 1 η προσπάθεια: y : G C A T C G C A G A G A G T A T Α C A G T A C G 1 2 3 4 x : G C A G A G A G Μετατόπιση κατά 4 ( i kmpnext[ i ] = 3 - - 1) 2 η προσπάθεια: y : G C A T C G C A G A G A G T A T Α C A G T A C G 1 x : G C A G A G A G Μετατόπιση κατά 1 ( i kmpnext[ i ] = 0 - - 1) 3 η προσπάθεια: y : G C A T C G C A G A G A G T A T Α C A G T A C G 1 2 3 4 5 6 7 8 x : G C A G A G A G Μετατόπιση κατά 7 ( i kmpnext[ i ] = 8-1) (ταίριασµα) 4 η προσπάθεια: y : G C A T C G C A G A G A G T A T Α C A G T A C G 2 x : G C A G A G A G Μετατόπιση κατά 1 ( i kmpnext[ i ] = 1-0) 5 η προσπάθεια: y : G C A T C G C A G A G A G T A T Α C A G T A C G 1 x : G C A G A G A G Μετατόπιση κατά 1 ( i kmpnext[ i ] = 0 - -1) 6 η προσπάθεια: y : G C A T C G C A G A G A G T A T Α C A G T A C G 1 x : G C A G A G A G Μετατόπιση κατά 1 ( i kmpnext[ i ] = 0 - -1) 7 η προσπάθεια: 24
y : G C A T C G C A G A G A G T A T Α C A G T A C G 1 x : G C A G A G A G Μετατόπιση κατά 1 ( i kmpnext[ i ] = 0 - -1) 8 η προσπάθεια: y : G C A T C G C A G A G A G T A T Α C A G T A C G 1 x : G C A G A G A G Μετατόπιση κατά 1 ( i kmpnext[ i ] = 0 - -1) Ο αλγόριθµος Knuth-Morris-Pratt έκανε 18 συγκρίσεις συµβόλων. 25
ΠΑΡΑΡΤΗΜΑ-6.3 Παρατίθεται η σχεδίαση του αλγορίθµου Boyer Moore: void prebmbc(char *x, int m, int bmbc[]) { int i; for (i = 0; i < ASIZE; ++i) bmbc[ i] = m; } for (i = 0; i < m - 1; ++i) bmbc[x[ i] ] = m - i - 1; void suffixes(char *x, int m, int *suff) { int f, g, i; { } } 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; } 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) 26
} bmgs[ j ] = m - 1 - i; for (i = 0; i <= m - 2; ++i) bmgs[m - 1 - suff[ i]] = m - 1 - i; void BM(char *x, int m, char *y, int n) { int i, j, bmgs[xsize], bmbc[asize]; /* προεπεξεργασία */ prebmgs(x, m, bmgs); prebmbc(x, m, bmbc); /* Αναζήτηση */ 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); } } Παράδειγµα : Εστω συµβολοσειρά-πρότυπο x = {GCAGAGAG} και αναζητώ οµοίοτητα στην y = {CACCAACCTCCG}. Φάση αναζήτησης 1 η προσπάθεια: y G C A T C G C A G A G A G T A T A C A G T A C G 1 27
x G C A G A G A G Μετακίνηση κατά 1. (bmgs[7]=bmbc[a]-7+7) 2 η προσπάθεια: y G C A T C G C A G A G A G T A T A C A G T A C G 3 2 1 x G C A G A G A G Μετακίνηση κατά 4. (bmgs[5]=bmbc[c]-7+5) 3 η προσπάθεια: y G C A T C G C A G A G A G T A T A C A G T A C G 8 7 6 5 4 3 2 1 x G C A G A G A G Μετακίνηση κατά 7. (bmgs[0]) (ταίριασµα) 4 η προσπάθεια: y G C A T C G C A G A G A G T A T A C A G T A C G 3 2 1 x G C A G A G A G Μετακίνηση κατά 4. (bmgs[5]=bmbc[c]-7+5) 5 η προσπάθεια: y G C A T C G C A G A G A G T A T A C A G T A C G 2 1 x G C A G A G A G Μετακίνηση κατά 7. (bmgs[6]) Ο αλγόριθµος Boyer Moore έκανε 17 συγκρίσεις συµβόλων. 28
ΠΑΡΑΡΤΗΜΑ-6.4 Παρατίθεται η σχεδίαση του αλγορίθµου της παραγράφου 5: Clear[deigma2, qq,qqq,l,ll,jl,jl1,a1,b1,vv,tt,tt1,g11,gg1,g1,tgg,tt2,g2, as] deigma1="tgttggccattaacttgtatcagttatcagtgttctccccaaaaatgt CATATAGCATCCTGGTAAACAGGGCATTTTAAGATACATGTACCTTCTTATTTCTAG AAATTATAGCATCACATCCATAACAATCTATAACATGATAATCTCAGATAGCATCAC ATTACCATGATGGTAAAAGGTCCTAGGGAGAACACTGGTTATTTGGCTCCAGATATT GGTGTTGGCCATTAACTTGTATCAGTTATCAGTGTTCTCCCCAAAAATGTCATATAG CATCCTGGTAAACAGGGCATTTTAAGATACATGTACCTTCTTATTTCTAGAAATTAT AGCATCACATCCATAACAATCTATAACATGATAATCTCAGATAGCATCACATTACCA TGATGGTAAAAGGTCCTAGGGAGAACACTGGTTATTTGGCTCCAGATATTGGTGTTG GCCATTAACTTGTATCAGTTATCAGTGTTCTCCCCAAAAATGTCATATAGCATCCTG GTAAACAGGGCATTTTAAGATACATGTACCTTCTTATTTCTAGAAATTATAGCATCA CATCCATAACAATCTATAACATGATAATCTCAGATAGCATCACATTACCATGATGGT AAAAGGTCCTAGGGAGAACACTGGTTATTTGGCTCCAGATATTGGTGTTGGCCATTA ACTTGTATCAGTTATCAGTGTTCTCCCCAAATGTTGGCCATTAACTTGTATCAGTTA TCAGTGTTCTCCCCAAAAATGTCATATAGCATCCTGGTAAACAGGGCATTTTAAGAT ACATGTACCTTCTTATTTCTAGAAATTATAGCATCACATCCATAACAATCTATAACA TGATAATCTCAGATAGCATCACATTACCATGATGGTAAAAGGTCCTAGGGAGAACAC TGGTTATTTGGCTCCAGATATTGGTGTTGGCCATTAACTTGTATCAGTTATCAGTGT TCTCCCCAAAAATGTCATATAGCATCCTGGTAAACAGGGCATTTTAAGATACATGTA CCTTCTTATTTCTAGAAATTATAGCATCACATCCATAACAATCTATAACATGATAAT CTCAGATAGCATCACATTACCATGATGGTAAAAGGTCCTAGGGAGAACACTGGTTAT TTGGCTCCAGATATTGGTGTTGGCCATTAACTTGTATCAGTTATCAGTGTTCTCCCC AAAAATGTCATATAGCATCCTGGTAAACAGGGCATTTTAAGATACATGTACCTTCTT ATTTCTAGAAATTATAGCATCACATCCATAACAATCTATAACATGATAATCTCAGAT AGCATCACATTACCATGATGGTAAAAGGTCCTAGGGAGAACACTGGTTATTTGGCTC CAGATATTGGTGTTGGCCATTAACTTGTATCAGTTATCAGTGTTCTCCCCAAATGTT GGCCATTAACTTGTATCAGTTATCAGTGTTCTCCCCAAAAATGTCATATAGCATCCT GGTAAACAGGGCATTTTAAGATACATGTACCTTCTTATTTCTAGAAATTATAGCATC ACATCCATAACAATCTATAACATGATAATCTCAGATAGCATCACATTACCATGATGG TAAAAGGTCCTAGGGAGAACACTGGTTATTTGGCTCCAGATATTGGTGTTGGCCATT AACTTGTATCAGTTATCAGTGTTCTCCCCAAAAATGTCATATAGCATCCTGGTAAAC AGGGCATTTTAAGATACATGTACCTTCTTATTTCTAGAAATTATAGCATCACATCCA TAACAATCTATAACATGATAATCTCAGATAGCATCACATTACCATGATGGTAAAAGG TCCTAGGGAGAACACTGGTTATTTGGCTCCAGATATTGGTGTTGGCCATTAACTTGT ATCAGTTATCAGTGTTCTCCCCAAAAATGTCATATAGCATCCTGGTAAACAGGGCAT TTTAAGATACATGTACCTTCTTATTTCTAGAAATTATAGCATCACATCCATAACAAT CTATAACATGATAATCTCAGATAGCATCACATTACCATGATGGTAAAAGGTCCTAGG GAGAACACTGGTTATTTGGCTCCAGATATTGGTGTTGGCCATTAACTTGTATCAGTT ATCAGTGTTCTCCCCAAATGTTGGCCATTAACTTGTATCAGTTATCAGTGTTCTCCC CAAAAATGTCATATAGCATCCTGGTAAACAGGGCATTTTAAGATACATGTACCTTCT TATTTCTAGAAATTATAGCATCACATCCATAACAATCTATAACATGATAATCTCAGA TAGCATCACATTACCATGATGGTAAAAGGTCCTAGGGAGAACACTGGTTATTTGGCT CCAGATATTGGTGTTGGCCATTAACTTGTATCAGTTATCAGTGTTCTCCCCAAAAAT GTCATATAGCATCCTGGTAAACAGGGCATTTTAAGATACATGTACCTTCTTATTTCT 29
AGAAATTATAGCATCACATCCATAACAATCTATAACATGATAATCTCAGATAGCATC ACATTACCATGATGGTAAAAGGTCCTAGGGAGAACACTGGTTATTTGGCTCCAGATA TTGGTGTTGGCCATTAACTTGTATCAGTTATCAGTGTTCTCCCCAAAAATGTCATAT AGCATCCTGGTAAACAGGGCATTTTAAGATACATGTACCTTCTTATTTCTAGAAATT ATAGCATCACATCCATAACAATCTATAACATGATAATCTCAGATAGCATCACATTAC CATGATGGTAAAAGGTCCTAGGGAGAACACTGGTTATTTGGCTCCAGATATTGGTGT TGGCCATTAACTTGTATCAGTTATCAGTGTTCTCCCCAAA"; deigma2="catgtaccttcttatttctagaaattatagcatcacatccataacaat CTATAACATGATAATCTCAGATAGCATCACATTACCATGATGGTAAAAGGTCCTAGG GAGAACACTGGTTATTTGGCTCCAGATATTGGTGTTGGC"; qq=characters[deigma1]/.{"a" 2,"C" 3,"G" 5,"T" 7}; qqq=characters[deigma2]/.{"a" 2,"C" 3,"G" 5,"T" 7}; l=length[qq] ll=length[qqq] A=PrimePi[Max[qq] l] jl=prime[range[a+1,a+l]]; jl1=table[1-(1/jl[[n]]),{n,1,ll}]//n; A1=Sum[jl1[[k]],{k,1,ll}]//N; B1=Max[qq]Sum[1/jl[[n]],{n,1,ll}]//N; VV=Sum[qqq[[n]],{n,1,ll}]; 2824 144 TT[1]=Sum[jl1[[n]] Sum[qq[[m]],{m,n,ll}],{n,1,ll}]//N; TT1[1]=Sum[jl1[[n]] Sum[qqq[[m]],{m,n,ll}],{n,1,ll}]//N; TT[2]=TT[1]-Sum[qq[[m]],{m,1,ll}]+A1 qq[[ll+1]]//n; TT[n_]:=TT[n]=2 TT[n-1]-TT[n-2]-(qq[[n+ll-2]]-qq[[n- 2]])+A1 ( qq[[n+ll-1]]-qq[[n+ll-2]]) g11=select[table[if[0<=tt1[1]-tt[n]<=(n-1) B1 && Abs[TT[n]-TT[n+1]+A1 qq[[n+ll]]-vv] 10^(-3),n,0],{n,1,lll}],#>0&]; gg1={if[0<=tt1[1]-tt[l-ll+1] (l-ll) B1 && Sum[qq[[n]],{n,l-ll+1,l}]==VV,l-ll+1,1.1]}; g1=cases[join[g11,gg1],_integer]; FF=4; FF1=If[ll<FF,ll,FF]; Tgg[k_]:=Sum[jl1[[n]]qq[[n+k-1]],{n,1,FF1}] TT2[0]=Sum[jl1[[n]] qqq[[n]],{n,1,ff1}]; g2=select[table[if[tgg[g1[[k]]]- TT2[0] 0,g1[[k]],0],{k,1,Length[g1]}],#>0&] 30
Length[g1]-Length[g2]; as[k_]:=table[qqq[[n+1]]-qq[[n+g1[[k]]]],{n,0,ll-1}] Table[as[k],{k,1,Length[g1]}]; TimeUsed[] {85,306,527,791,1012,1233,1497,1718,1939,2203,2424,2645} 0.329 31
ΑΠΟΤΕΛΕΣΜΑΤΑ Για το ίδιο text : deigma2.txt Συμβολοσειρά-πρότυπο : CATCA Karp Rabin : Boyer-Moore: Knuth-Morris-Pratt : Χρόνος : 0.124 secs Ταιριάσματα : 220 Χρόνος : 0.062 secs Ταιριάσματα : 220 Χρόνος : 0.249 secs Ταιριάσματα : 220 4 ος Αλγόριθμος Χρόνος : Χρόνος : 1.172 secs Ταιριάσματα : 243 Συμβολοσειρά-πρότυπο : GTTCTCCCCAAAAATGTCATATAGCATCCTGGTAAACAGGGCATTTTAAGAT Karp Rabin : Boyer-Moore: Knuth-Morris-Pratt : Χρόνος : 0.124 secs Ταιριάσματα : 10 Χρόνος : 0.047 secs Ταιριάσματα : 10 Χρόνος : 0.234 secs Ταιριάσματα : 10 4 ος Αλγόριθμος Χρόνος : Χρόνος : 1.202 secs Ταιριάσματα : 120 32
Συμβολοσειρά-πρότυπο : TGTTGGCCATTAACTTGTATCAGTTATCAGTGTTCTCCCCAAAAATGTCATATAGCATCCTGG TAAACAGGGCATTTTAAGATACATGTACCTTCTTATTTCTAGAAATTATAGCATCACA Karp Rabin : Boyer-Moore: Knuth-Morris-Pratt : Χρόνος : 0.124 secs Ταιριάσματα : 10 Χρόνος : 0.033 secs Ταιριάσματα : 10 Χρόνος : 0.244 secs Ταιριάσματα : 10 4 ος Αλγόριθμος Χρόνος : Χρόνος : 1.389 secs Ταιριάσματα : 144 ΣΥΜΠΕΡΑΣΜΑΤΑ Ο αλγόριθµος Knuth-Morris-Pratt, βρίσκει ακριβές αριθµό ταιριασµάτων,και ο χρόνος εκτέλεσης του(µεγαλύτερος από τον χρόνο του Βoyer-Moore), δεν επηρεάζεται από το µέγεθος της συµβολοσειράς-προτύπου.χρησιµοποιείται για το ταίριασµα σχετικά µικρών-προτύπων. Ο αλγόριθµος Βoyer-Moore, βρίσκει ακριβές αριθµό ταιριασµάτων, και ο χρόνος εκτέλεσης του (µικρότερος από όλους τους υπόλοιπους αλγορίθµους) ελαττώνεται, όσο µεγαλώνει το µέγεθος της συµβολοσειράς-προτύπου. Χρησιµοποιείται κυρίως για το ταίριασµα πολύ µεγάλων συµβολοσειρώνπροτύπων. Ο αλγόριθµος Karp-Rabin, βρίσκει ακριβές αριθµό ταιριασµάτων, και ο χρόνος εκτέλεσης του είναι µεγαλύτερος από τους προηγούµενους δυο αλγορίθµους. εν επηρεάζεται ιδιαίτερα όµως για το ταίριασµα πολλών προτύπων ταυτόχρονα, γι αυτό και χρησιµοποιείται γι αυτό τον σκοπό κυρίως. Ο 4 ος αλγόριθµος δεν βρίσκει τον σωστό αριθµό ταιριασµάτων (βρίσκει παραπάνω ταιριάσµατα) και ο χρόνος εκτέλεσής του είναι µεγαλύτερος από όλους τους προαναφερθέντες αλγόριθµους. 33
7. Βιβλιογραφία 1. Ν. Αtreas and C. Karanikas A new matching algorithm based on prime numbers, Proceedings of the workshop: Scientific support for the decision making in the security sector, in NATO Science for piece and security series, D: Information and Communication security Vol. 12, (2008), pp. 118-126 2. R. S. Boyer and J. S. Moore, A fast string searching algorithm, Commun. ACM 20, 762-772, 1977. 3. C. Charras, Lecroq Thierry, Handbook of Exact String-Matching Algorithms. 4. R. M. Karp, M. O. Rabin, Efficient randomized pattern matching algorithm, IBM, J. Res. Develop. 31, No 2, 249-260, (1987). 5. D. E. Knuth, J. H. Morris and V. R. Pratt, Fast pattern matching in strings, SIAM J. Computing, 6, 232-350, (1977). 6. E. M. McCreight. A Space-Economical Suffix Tree Construction Algorithm. Jrnl. of Algorithms, 23(2) pp262-272, 1976. 7. E. Ukkonen. On-line Construction of Suffix Trees. Algorithmica, 14(3) pp249-260, 1995 8. CROCHEMORE, M., 1997. Off-line serial exact string searching, in Pattern Matching Algorithms, ed. A. Apostolico and Z. Galil, Chapter 1, pp 1-53, Oxford University Press. 9. GUSFIELD, D., 1997, Algorithms on strings, trees, and sequences: Computer Science and Computational Biology, Cambridge University Press. 10. AOE, J.-I., 1994, Computer algorithms: string pattern matching strategies, IEEE Computer Society Press. 11. SEDGEWICK, R., FLAJOLET, P., 1996, An Introduction to the Analysis of Algorithms, Addison-Wesley Publishing Company. 12. STEPHEN, G.A., 1994, String Searching Algorithms, World Scientific. 34
35