Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
1
Αλγόριθμοι «διαίρει και βασίλευε»
2
Σύνοψη Ο αλγόριθμος MergeSort
Εύρεση του μεσαίου σημείου της μήτρας στοίχισης σε γραμμικό χώρο Στοίχιση αλληλουχιών με χρήση γραμμικού χώρου Στοίχιση μπλοκ Η επιτάχυνση των Τεσσάρων Ρώσων Κατασκευή της LCS σε υποδευτεροβάθμιο χρόνο
3
Αλγόριθμοι «διαίρει και βασίλευε»
«Διαίρει»: το πρόβλημα διαιρείται σε υποπροβλήματα «Βασίλευε»: τα υποπροβλήματα λύνονται αναδρομικά. Αν τα υποπροβλήματα είναι αρκετά μικρά, λύνονται με τον αλγόριθμο της ωμής βίας Συρραφή των λύσεων των υποπροβλημάτων σε μια λύση του αρχικού προβλήματος (περίπλοκο κομμάτι)
4
Επανεξέταση του προβλήματος της Ταξινόμησης
Δίνεται: ένας μη ταξινομημένος πίνακας Στόχος: να ταξινομηθεί 5 2 4 7 1 3 6 1 2 3 4 5 6 7
5
Mergesort: βήμα «διαίρει»
Βήμα 1 – Διαίρει 5 2 4 7 1 3 6 5 2 4 7 1 3 6 5 2 4 7 1 3 6 5 2 4 7 1 3 6 log(n) διαιρέσεις για να χωριστεί ένας πίνακας μεγέθους n στα μεμονωμένα στοιχεία του
6
Mergesort: βήμα «βασίλευε»
Βήμα 2 – Βασίλευε 5 2 4 7 1 3 6 O(n) 2 5 4 7 1 3 6 O(n) 2 4 5 7 1 3 6 O(n) 1 2 3 4 5 6 7 O(n) O(n logn) logn επαναλήψεις, κάθε επανάληψη απαιτεί χρόνο O(n). Συνολικός χρόνος:
7
Mergesort: βήμα συρραφής
Βήμα 3 – Συρραφή 2 πίνακες μεγέθους 1 μπορούν εύκολα να συγχωνευθούν για να σχηματίσουν έναν ταξινομημένο πίνακα μεγέθους 2 2 ταξινομημένοι πίνακες μεγέθους n και m, αντίστοιχα, μπορούν να συγχωνευθούν σε χρόνο O(n+m) για να σχηματίσουν έναν ταξινομημένο πίνακα μεγέθους n+m 5 2
8
Mergesort: βήμα συρραφής
Συρραφή 2 πινάκων μεγέθους 4 2 4 5 7 1 3 6 2 4 5 7 3 6 1 1 2 4 5 7 2 3 6 4 5 7 3 6 1 2 1 2 3 4 5 7 6 κλπ… 1 2 3 4 1 2 3 4 5 6 7
9
Ο αλγόριθμος Merge Merge(a,b) n1 μέγεθος πίνακα a
n2 μέγεθος πίνακα b an1+1 an2+1 i 1 j 1 for k 1 to n1 + n2 if ai < bj ck ai i i +1 else ck bj j j+1 return c
10
Mergesort: παράδειγμα
20 4 7 6 1 3 9 5 Διαίρει 20 4 7 6 1 3 9 5 20 4 7 6 1 3 9 5 7 1 3 9 5 20 4 6 4 20 6 7 1 3 5 9 Βασίλευε 4 6 7 20 1 3 5 9 1 3 4 5 6 7 9 20
11
Ο αλγόριθμος MergeSort
MergeSort(c) n μέγεθος πίνακα c if n = 1 return c left λίστα με τα πρώτα n/2 στοιχεία του c right λίστα με τα τελευταία n-n/2 στοιχεία του c sortedLeft MergeSort(left) sortedRight MergeSort(right) sortedList Merge(sortedLeft,sortedRight) return sortedList
12
MergeSort: χρόνος εκτέλεσης
Το πρόβλημα απλοποιείται σε μικρά βήματα Για την i-οστή επανάληψη συγχώνευσης, η πολυπλοκότητα του προβλήματος είναι O(n) Το πλήθος των επαναλήψεων είναι O(log n) Χρόνος εκτέλεσης: O(n logn)
13
Μέθοδος «διαίρει και βασίλευε» για την LCS
Path(source, sink) if(οι κορυφές source & sink βρίσκονται σε διαδοχικές στήλες) output τη μεγαλύτερη διαδρομή από source προς sink else middle ← η μεσαία κορυφή μεταξύ των source & sink Path(source, middle) Path(middle, sink)
14
Μέθοδος «διαίρει και βασίλευε» για την LCS
Path(source, sink) if(οι κορυφές source & sink βρίσκονται σε διαδοχικές στήλες) output τη μεγαλύτερη διαδρομή από source προς sink else middle ← η μεσαία κορυφή μεταξύ των source & sink Path(source, middle) Path(middle, sink) Το μόνο πρόβλημα που απομένει είναι πώς να βρούμε τη «μεσαία κορυφή»!
15
Ο υπολογισμός της διαδρομής στοίχισης απαιτεί δευτεροβάθμια μνήμη
Διαδρομή στοίχισης Η χωρική πολυπλοκότητα για τον υπολογισμό της διαδρομής στοίχισης για αλληλουχίες μήκους n και m είναι O(nm) Πρέπει να αποθηκεύσουμε όλους τους δείκτες οπισθοδρόμησης στη μνήμη για να ανακατασκευάσουμε τη διαδρομή (οπισθοδρόμηση) m n
16
Υπολογισμός βαθμολογίας της στοίχισης με χρήση γραμμικής μνήμης
Βαθμολογία στοίχισης Η χωρική πολυπλοκότητα για τον υπολογισμό μόνο της βαθμολογίας είναι O(n) Χρειαζόμαστε μόνο την προηγούμενη στήλη για να υπολογίσουμε την τρέχουσα στήλη, και μπορούμε να «απαλλαγούμε» από την προηγούμενη στήλη μόλις ολοκληρώσουμε τη χρήση της 2 n n
17
Υπολογισμός βαθμολογίας της στοίχισης: ανακύκλωση στηλών
Μόνο δύο στήλες βαθμολογιών αποθηκεύονται σε οποιαδήποτε χρονική στιγμή η μνήμη για τη στήλη 1 χρησιμοποιείται για τον υπολογισμό της στήλης 3 η μνήμη για τη στήλη 2 χρησιμοποιείται για τον υπολογισμό της στήλης 4
18
Περνώντας από τη μεσαία γραμμή
Θέλουμε να υπολογίσουμε τη μεγαλύτερη διαδρομή από την κορυφή (0,0) προς την κορυφή (n, m) που διέρχεται από την κορυφή (i, m/2), όπου το i παίρνει τιμές από 0 έως n και αναπαριστά την i-οστή γραμμή Ορίζουμε το length(i) ως το μήκος της μεγαλύτερης διαδρομής μεταξύ των (0,0) και (n, m) που διέρχεται από την κορυφή (i, m/2) m/ m n (i, m/2) prefix(i) suffix(i)
19
Περνώντας από τη μεσαία γραμμή
m/ m n (i, m/2) prefix(i) suffix(i) Ορίζουμε το (mid, m/2) ως την κορυφή όπου η μεγαλύτερη διαδρομή τέμνει τη μεσαία στήλη length(mid) = βέλτιστο μήκος = max0i n length(i)
20
Υπολογισμός του prefix(i)
Το prefix(i) είναι το μήκος της μεγαλύτερης διαδρομής μεταξύ των (0,0) και (i, m/2) Υπολογίζουμε το prefix(i) με δυναμικό προγραμματισμό στο αριστερό μισό της μήτρας αποθήκευση στήλης prefix(i) m/ m
21
Υπολογισμός του suffix(i)
Το suffix(i) είναι το μήκος της μεγαλύτερης διαδρομής μεταξύ των (i, m/2) και (n, m) Το suffix(i) είναι το μήκος της μεγαλύτερης διαδρομής μεταξύ των (n, m) και (i, m/2) με όλες τις ακμές αντεστραμμένες Υπολογίζουμε το suffix(i) με δυναμικό προγραμματισμό στο δεξιό μισό της «αντεστραμμένης» μήτρας αποθήκευση στήλης suffix(i) m/ m
22
length(i) = prefix(i) + suffix(i)
Προσθέτουμε τα prefix(i) και suffix(i) για να υπολογίσουμε το length(i): length(i)=prefix(i) + suffix(i) Έχουμε πλέον τη μεσαία κορυφή της μέγιστης διαδρομής (i, m/2) ως μέγιστο του length(i) i μεσαίο σημείο m/2 m
23
Εύρεση του μεσαίου σημείου
m/ m/ m/ m
24
Εύρεση του μεσαίου σημείου ξανά
m/ m/ m/ m
25
Και ξανά 0 m/8 m/4 3m/8 m/2 5m/8 3m/4 7m/8 m
26
Χρόνος = εμβαδόν: πρώτο πέρασμα
Στο πρώτο πέρασμα, ο αλγόριθμος καλύπτει ολόκληρο το εμβαδόν (Area) Area = nm
27
Χρόνος = εμβαδόν: πρώτο πέρασμα
Στο πρώτο πέρασμα, ο αλγόριθμος καλύπτει ολόκληρο το εμβαδόν (Area) Area = nm Υπολογισμός prefix(i) Υπολογισμός suffix(i)
28
Χρόνος = εμβαδόν: δεύτερο πέρασμα
Στο δεύτερο πέρασμα, ο αλγόριθμος καλύπτει μόνο το 1/2 εμβαδόν Area/2
29
Χρόνος = εμβαδόν: τρίτο πέρασμα
Στο τρίτο πέρασμα, καλύπτεται μόνο το 1/4. Area/4
30
Γεωμετρική μείωση σε κάθε επανάληψη
1 + ½ + ¼ (½)k ≤ 2 Χρόνος εκτέλεσης: O(Area) = O(nm) 5ο πέρασμα: 1/16 3ο πέρασμα: 1/4 1ο πέρασμα : 1 4ο πέρασμα: 1/8 2ο πέρασμα: 1/2
31
Μπορούμε να στοιχίσουμε αλληλουχίες σε υποδευτεροβάθμιο χρόνο;
Ο δυναμικός προγραμματισμός απαιτεί O(n2) για καθολική στοίχιση Μπορούμε να βελτιώσουμε την απόδοση; Ναι, με χρήση της επιτάχυνσης των Τεσσάρων Ρώσων
32
Διαμέριση αλληλουχιών σε μπλοκ
Το πλέγμα n x n διαμερίζεται σε μπλοκ μεγέθους t x t Συγκρίνουμε δύο αλληλουχίες μεγέθους n, και κάθε αλληλουχία χωρίζεται σε τμήματα μήκους t το καθένα Η αλληλουχία u = u1…un γίνεται |u1…ut| |ut+1…u2t| … |un-t+1…un| και η αλληλουχία v = v1…vn γίνεται |v1…vt| |vt+1…v2t| … |vn-t+1…vn|
33
Διαμέριση πλέγματος στοίχισης σε μπλοκ
n/t n t t n n/t διαμέριση
34
Στοίχιση μπλοκ Στοίχιση μπλοκ των αλληλουχιών u και v:
Προστίθεται ένα ολόκληρο μπλοκ Αφαιρείται ένα ολόκληρο μπλοκ Διαδρομή μπλοκ: μια διαδρομή που διατρέχει κάθε τετράγωνο t x t μέσω των γωνιών του
35
Στοίχιση μπλοκ: παραδείγματα
αποδεκτό μη αποδεκτό
36
Το πρόβλημα της Στοίχισης Μπλοκ
Στόχος: Βρείτε τη μεγαλύτερη διαδρομή μπλοκ σε ένα γράφημα μετασχηματισμού Είσοδος: Οι δύο αλληλουχίες u και v που έχουν διαμεριστεί σε μπλοκ μεγέθους t. Αυτό είναι ισοδύναμο με ένα γράφημα μετασχηματισμού n x n που έχει διαμεριστεί σε υποπλέγματα t x t Έξοδος: Η στοίχιση μπλοκ των u και v με τη μέγιστη βαθμολογία (δηλαδή η μεγαλύτερη διαδρομή μπλοκ στο γράφημα μετασχηματισμού)
37
Κατασκευή στοιχίσεων μέσα στα μπλοκ
Προς επίλυση: υπολογίστε τη βαθμολογία στοίχισης ßi,j για κάθε ζεύγος μπλοκ |u(i-1)*t+1…ui*t| και |v(j-1)*t+1…vj*t| Πόσα μπλοκ υπάρχουν ανά αλληλουχία; (n/t) μπλοκ μεγέθους t Πόσα ζεύγη μπλοκ απαιτούνται για τη στοίχιση των δύο αλληλουχιών; (n/t) x (n/t) Για κάθε ζεύγος μπλοκ, λύστε ένα πρόβλημα μίνι στοίχισης με μέγεθος t x t
38
Κατασκευή στοιχίσεων μέσα στα μπλοκ
n/t Επίλυση προβλημάτων μίνι στοίχισης Κάθε μικρό τετράγωνο αναπαριστά ένα ζεύγος μπλοκ
39
Στοίχιση μπλοκ: δυναμικός προγραμματισμός
Έστω ότι το si,j συμβολίζει τη βέλτιστη βαθμολογία στοίχισης μπλοκ ανάμεσα στα πρώτα i τμήματα της u και τα πρώτα j τμήματα της v Το block είναι η ποινή για την προσθήκη ή αφαίρεση ενός ολόκληρου μπλοκ Το i,j είναι η βαθμολογία του ζεύγους μπλοκ στη γραμμή i και τη στήλη j si-1,j - block si,j-1 - block si-1,j-1 - i,j si,j = max
40
Στοίχιση μπλοκ: χρόνος εκτέλεσης
Οι δείκτες i, j παίρνουν τιμές από 0 έως n/t Ο χρόνος εκτέλεσης του αλγορίθμου είναι O( [n/t]*[n/t]) = O(n2/t2) αν δεν μετρήσουμε το χρόνο για τον υπολογισμό κάθε i,j
41
Στοίχιση μπλοκ: χρόνος εκτέλεσης (συνέχεια)
Ο υπολογισμός όλων των i,j απαιτεί την επίλυση (n/t)*(n/t) μίνι στοιχίσεων μπλοκ, μεγέθους (t*t) η καθεμία Άρα, ο υπολογισμός όλων των i,j απαιτεί χρόνο O([n/t]*[n/t]*t*t) = O(n2) Απαιτείται ίδιος χρόνος με το δυναμικό προγραμματισμό Πώς μπορούμε να επιταχύνουμε;
42
Η τεχνική των Τεσσάρων Ρώσων
Έστω t = log(n), όπου t είναι το μέγεθος μπλοκ, n είναι το μέγεθος αλληλουχίας. Αντί να έχουμε (n/t)*(n/t) μίνι στοιχίσεις, κατασκευάζουμε 4t x 4t μίνι στοιχίσεις για όλα τα ζεύγη των συμβολοσειρών με t νουκλεοτίδια (τεράστιο μέγεθος), και τις αποθηκεύουμε σε έναν πίνακα αναζήτησης. Όμως, το μέγεθος του πίνακα αναζήτησης δεν είναι πραγματικά τόσο μεγάλο αν η τιμή του t είναι μικρή. Έστω t = (logn)/4. Τότε, 4t x 4t = n
43
Πίνακας αναζήτησης για την τεχνική των Τεσσάρων Ρώσων
AAAAAA AAAAAC AAAAAG AAAAAT AAAACA … κάθε αλληλουχία έχει t νουκλεοτίδια Πίνακας αναζήτησης “Score” AAAAAA AAAAAC AAAAAG AAAAAT AAAACA … το μέγεθος είναι μόνο n, αντί για (n/t)*(n/t)
44
Νέα σχέση επανάληψης Ο νέος πίνακας αναζήτησης Score δεικτοδοτείται από ένα ζεύγος συμβολοσειρών με t νουκλεοτίδια, άρα si-1,j - block si,j-1 - block si-1,j-1 – Score(i-οστό block της v, j-οστό μπλοκ της u) si,j = max
45
Επιτάχυνση των Τεσσάρων Ρώσων: χρόνος εκτέλεσης
Αφού ο υπολογισμός του πίνακα αναζήτησης Score με μέγεθος n απαιτεί χρόνο O(n), ο χρόνος εκτέλεσης περιορίζεται κυρίως από τις (n/t)*(n/t) προσπελάσεις στον πίνακα αναζήτησης Κάθε προσπέλαση απαιτεί χρόνο O(logn) Συνολικός χρόνος εκτέλεσης: O( [n2/t2]*logn ) Εφόσον ισχύει t = logn, αντικατάσταση στην: O( [n2/{logn}2]*logn) > O( n2/logn )
46
Μέχρι τώρα… Μπορούμε να χωρίσουμε το πλέγμα σε μπλοκ και να εκτελέσουμε δυναμικό προγραμματισμό μόνο στις γωνίες αυτών των μπλοκ Για να επιταχύνουμε τους υπολογισμούς των μίνι στοιχίσεων σε χρόνο λιγότερο από n2, δημιουργούμε έναν πίνακα αναζήτησης μεγέθους n, ο οποίος περιέχει όλες τις βαθμολογίες για όλα τα ζεύγη με t νουκλεοτίδια Ο χρόνος εκτέλεσης μειώνεται από δευτεροβάθμιος, O(n2), σε υποδευτεροβάθμιο: O(n2/logn)
47
Επιτάχυνση των Τεσσάρων Ρώσων για την LCS
στοίχιση μπλοκ μεγαλύτερη κοινή υποαλληλουχία
48
Στοίχιση μπλοκ και LCS Στη στοίχιση μπλοκ, μας ενδιαφέρουν μόνο οι γωνίες των μπλοκ. Στην LCS, μας ενδιαφέρουν όλα τα σημεία πάνω στις ακμές των μπλοκ, επειδή η διαδρομή μπορεί να διατρέξει αυτά τα σημεία. Θυμηθείτε ότι κάθε αλληλουχία έχει μήκος n, κάθε μπλοκ έχει μέγεθος t, άρα κάθε αλληλουχία έχει (n/t) μπλοκ.
49
Στοίχιση μπλοκ και LCS: σημεία ενδιαφέροντος
η στοίχιση μπλοκ έχει (n/t)*(n/t) = (n2/t2) σημεία ενδιαφέροντος η στοίχιση LCS έχει O(n2/t) σημεία ενδιαφέροντος
50
Διατρέχοντας μπλοκ για την LCS
Με δεδομένες τις βαθμολογίες στοίχισης si,* στην πρώτη γραμμή και τις βαθμολογίες s*,j στην πρώτη στήλη ενός μίνι τετραγώνου t x t, πρέπει να υπολογίσουμε τις βαθμολογίες στοίχισης στην τελευταία γραμμή και στήλη του μίνι τετραγώνου. Για να υπολογίσουμε τη βαθμολογία της τελευταίας γραμμής και στήλης, χρησιμοποιούμε 4 μεταβλητές: τις βαθμολογίες στοίχισης si,* στην πρώτη γραμμή τις βαθμολογίες στοίχισης s*,j στην πρώτη στήλη την υποσυμβολοσειρά της αλληλουχίας u σε αυτό το μπλοκ (4t δυνατές επιλογές) την υποσυμβολοσειρά της αλληλουχίας v σε αυτό το μπλοκ (4t δυνατές επιλογές)
51
Διατρέχοντας μπλοκ για την LCS (συνέχεια)
Αν χρησιμοποιήσουμε αυτές τις πληροφορίες για να υπολογίσουμε το πλέγμα, θα απαιτείται δευτεροβάθμιος χρόνος O(n2), αλλά εμείς θέλουμε κάτι καλύτερο. ξέρουμε αυτές τις βαθμολογίες μπορούμε να υπολογίσουμε αυτές τις βαθμολογίες μπλοκ t x t
52
Επιτάχυνση των Τεσσάρων Ρώσων
Κατασκευάζουμε έναν πίνακα αναζήτησης για όλες τις δυνατές τιμές των τεσσάρων μεταβλητών: όλες τις δυνατές βαθμολογίες για την πρώτη γραμμή si,* όλες τις δυνατές βαθμολογίες για την πρώτη στήλη s*,j την υποσυμβολοσειρά της αλληλουχίας u σε αυτό το μπλοκ (4t δυνατές επιλογές) την υποσυμβολοσειρά της αλληλουχίας v σε αυτό το μπλοκ (4t δυνατές επιλογές) Για κάθε τετράδα, αποθηκεύουμε την τιμή της βαθμολογίας για την τελευταία γραμμή και στήλη. Ο πίνακας θα είναι τεράστιος, αλλά μπορούμε να απαλείψουμε τις βαθμολογίες στοιχίσεων που δεν έχουν νόημα.
53
Μείωση του μεγέθους του πίνακα
Οι βαθμολογίες στοίχισης στην LCS αυξάνονται μονοτονικά, και τα γειτονικά στοιχεία δεν μπορούν να διαφέρουν παραπάνω από 1 Παράδειγμα: το 0,1,2,2,3,4 είναι αποδεκτό το 0,1,2,4,5,8 δεν είναι, επειδή το 2 και το 4 διαφέρουν παραπάνω από 1 (και το ίδιο ισχύει για το 5 και το 8) Επομένως, χρειάζεται να αποθηκεύουμε μόνο τις τετράδες, οι βαθμολογίες των οποίων αυξάνονται μονοτονικά και διαφέρουν το πολύ κατά 1
54
Αποδοτική κωδικοποίηση των βαθμολογιών στοίχισης
Αντί να αποθηκεύουμε αριθμούς που αντιστοιχούν στους δείκτες των αλληλουχιών u και v, μπορούμε να χρησιμοποιήσουμε δυαδικές τιμές για να κωδικοποιήσουμε τις διαφορές μεταξύ των βαθμολογιών στοίχισης αρχική κωδικοποίηση 1 2 3 4 1 δυαδική κωδικοποίηση
55
Μείωση του μεγέθους του πίνακα αναζήτησης
2t δυνατές βαθμολογίες (t = μέγεθος μπλοκ) 4t δυνατές συμβολοσειρές Το μέγεθος του πίνακα αναζήτησης είναι (2t * 2t)*(4t * 4t) = 26t Έστω t = (logn)/4 Το μέγεθος του πίνακα είναι: 26((logn)/4) = n(6/4) = n(3/2) Χρόνος = O( [n2/t2]*logn ) O( [n2/{logn}2]*logn) > O( n2/logn )
56
Περίληψη Εκμεταλλευτήκαμε το γεγονός ότι για κάθε μπλοκ μεγέθους t = log(n), μπορούμε να υπολογίσουμε εκ των προτέρων όλες τις δυνατές βαθμολογίες και να τις αποθηκεύσουμε σε έναν πίνακα αναζήτησης μεγέθους n(3/2) Χρησιμοποιήσαμε την επιτάχυνση των Τεσσάρων Ρώσων για να μειώσουμε το χρόνο εκτέλεση της LCS από δευτεροβάθμιο σε υποδευτεροβάθμιο: O(n2/logn)
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.