1 / 23

Διαίρει και βασίλευε Ι

Διαίρει και βασίλευε Ι.

Download Presentation

Διαίρει και βασίλευε Ι

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Διαίρει και βασίλευε Ι Είναι μία τεχνική για σχεδίαση αλγορίθμων που βασίζονται στη διάσπαση της προς επίλυση περίπτωσης σε μικρότερες υποπεριπτώσεις του ίδιου προβλήματος, στη διαδοχική και ανεξάρτητη επίλυση αυτών και στο συνδυασμό των επί μέρους λύσεων με τέτοιο τρόπο, ώστε να σχηματισθεί η λύση της αρχικής περίπτωσης. Ας υποθέσουμε ότι κάποιος αλγόριθμος Α απαιτεί χρόνο τετραγωνικής πολυπλοκότητας. Έστω c μία σταθερά έτσι ώστε για κάποια υλοποίηση του αλγορίθμου tA(n)cn2. Έστω επίσης ότι διαπιστώνουμε ότι η συγκεκριμένη περίπτωση μπορεί επίσης να επιλυθεί διασπώντας τη σε τρεις υποπεριπτώσεις μεγέθους n/2, επιλύνοντάς τις και συνδυάζοντας τις επί μέρους λύσεις. Τμ. Πληροφορικής, Α.Π.Θ.

  2. Διαίρει και βασίλευε ΙΙ Είναι επίσης d μια σταθερά, έτσι ώστε ο απαιτούμενος χρόνος για τη διάσπαση του προβλήματος και το συνδυασμό των επί μέρους λύσεων είναι t(n)dn. Τότε, ο συνολικός χρόνος του νέου αλγόριθμου B είναι Άρα ο νέος αλγόριθμος B εξακολουθεί να έχει πολυπλοκότητα n2, αν και έχει επιτευχθεί μία βελτίωση κατά 25%. Αν όμως οι υποπεριπτώσεις έχουν αρκετά μεγάλο μέγεθος τι θα γινόταν αν το πρόβλημα επιλύονταν με αναδρομή; Τότε ο απαιτούμενος χρόνος εκτέλεσης θα δινόταν από τη σχέση Τμ. Πληροφορικής, Α.Π.Θ.

  3. Διαίρει και βασίλευε ΙΙΙ με πολυπλοκότητα nlg3που είναι περίπου n1.59.Αυτή είναι μια αρκετά καλή βελτίωση που γίνεται πιο σημαντική όσο μεγαλώνει το n. Πως καθορίζεται το n0?? DQ(x) {//Γενική μορφή αλγορίθμων divide & conquer if(x αρκετά μικρό) return ADHOC(x); διάσπαση της περίπτωσης σε υποπεριπτώσεις x1, x2, …, xk for (i=1; i<=k; i++) yi=DQ(xi); συνδυασμός των yi για το σχηματισμό της λύσης y του x return y } Τμ. Πληροφορικής, Α.Π.Θ.

  4. Διαίρει και βασίλευε ΙV • Σε κάποιες περιπτώσεις προτιμάται η αντικατάσταση της αναδρομής από έναν επαναληπτικό βρόχο.Τότε μπορεί να επιτευχθεί ίσως μία περιορισμένη βελτίωση σε ότι αφορά το χρόνο εκτέλεσης, αλλά από την άλλη μεριά μία αλλαγή στην τάξη μεγέθους του χώρου μνήμης, που χρησιμοποιείται. • Για τον καθορισμό του βέλτιστου n0 κάνουμε τα εξής: καθορίζουμε με θεωρητική ανάλυση τη μορφή των αναδρομικών εξισώσεων του χρόνου εκτέλεσης και στη συνέχεια προσπαθούμε να καθορίσουμε τις σταθερές που χρησιμοποιούνται σε αυτές τις εξισώσεις για μια συγκεκριμένη υλοποίηση του αλγορίθμου. Τότε το βέλτιστο n0 καθορίζεται από τον υπολογισμό του n, που δε διαφοροποιεί την απόδοση μιας περίπτωσης μεγέθους n αν γίνει απευθείας εφαρμογή του αλγορίθμου ή αν θα χρησιμοποιηθεί ένα επιπλέον επίπεδο αναδρομής. Τμ. Πληροφορικής, Α.Π.Θ.

  5. Δυαδική αναζήτηση I Έστω Τ[n]ένας πίνακας ταξινομημένος κατά αύξουσα σειρά στοιχείων, δηλ. 0i<j n-1T[i]  T[j] και έστω ένα στοιχείο x, που αναζητάμε. Αν το στοιχείο x δεν περιέχεται μέσα στον πίνακα, τότε μας ενδιαφέρει να βρούμε τη θέση, όπου θα μπορούσαμε να το εισάγουμε. ΣΕΙΡΙΑΚΗ ΑΝΑΖΗΤΗΣΗ int sequential(T[n],x) { for (i=0;i<n;i++) if (T[i]>x) return i-1; return n; } Τμ. Πληροφορικής, Α.Π.Θ.

  6. Δυαδική αναζήτηση II Χειρότερη περίπτωση: Θ(n) Μέση περίπτωση: απαιτούνται κατά μέσο όρο (1+2+…+n)/n συγκρίσεις, δηλ. (n(n+1)/2)/n, δηλαδή (n+1)/2. Άρα, ο αλγόριθμος είναι O(n). ΔΥΑΔΙΚΗ ΑΝΑΖΗΤΗΣΗ int binsearch(T[n], x) { if (n=1 ||x<T[0]) return O; return binrec(T, x); } int binrec(T[i..j], x) { //η συνάρτηση αυτή καλείται αν T[i]x<T[j+1] και ij if (i = j) return i; int k=(i+j+1) / 2; if (x<T[k]) return binrec(T[i..k-1], x); else return binrec(T[k..j],x); } Τμ. Πληροφορικής, Α.Π.Θ.

  7. Δυαδική αναζήτηση III Τμ. Πληροφορικής, Α.Π.Θ.

  8. Δυαδική αναζήτηση IV Άρα στη χειρότερη περίπτωση ο βρόχος εκτελείται log2n φορές. Επομένως ο αλγόριθμος είναι Ο(log2n). ΜΗ ΑΝΑΔΡΟΜΙΚΗΔΥΑΔΙΚΗ ΑΝΑΖΗΤΗΣΗ int iterbin(T[n], x) { if (n=1 || x<T[0]) return O; i=0; j=n-1; while (i<j) { //αν T[i]x < T[j+1] int k=(i+j+1)/2; if (x<T[k]) j=k-1; else i=k; } return i; } Τμ. Πληροφορικής, Α.Π.Θ.

  9. Δυαδική αναζήτηση V int iterbin2(T[n], x) { if (n=1 || x<T[0]) return O; i=0; j=n-1; while (i<j) { //αν T[i]x<T[j+1] int k=(i+j+1) / 2; if (x<T[k]) j=k-1; else if (xT[k+1]) i=k+1; else {i=k; j=k;} } return i; } Έχει αποδειχθεί ότι για αρκετά μεγάλο n ο iterbin2 είναι πιοαποδοτικός από τον iterbin. Τμ. Πληροφορικής, Α.Π.Θ.

  10. Ταξινόμηση με συγχώνευση Ι Έστω Τ[n]ένας πίνακας από n στοιχεία. Μας ενδιαφέρει να ταξινομηθούν τα στοιχεία αυτά κατά αύξουσα σειρά. Μία προσέγγιση διαίρει και βασίλευε είναι να διαιρέσουμε τον πίνακα σε δύο μέρη περίπου ίσα, να ταξινομηθούν αυτά με αναδρομικές κλήσεις και να συγχωνευθούν οι επί μέρους λύσεις με τη σωστή σειρά. mergesort(T[n]) { if (n είναι μικρό) insert(T); else U=T[0..n/2]; V=T[1+n/2..n]; mergesort(U); mergesort(V) merge(T, U, V) } Τμ. Πληροφορικής, Α.Π.Θ.

  11. Ταξινόμηση με συγχώνευση ΙI Ο συγκεκριμένος αλγόριθμος είναι ένα κλασσικό παράδειγμα με όλα τα χαρακτηριστικά του διαίρει και βασίλευε. Όταν ο αριθμός των προς ταξινόμηση στοιχείων είναι μικρός, τότε χρησιμοποιείται κάποιος άλλος απλός αλγόριθμος, διαφορετικά η περίπτωση διασπάται σε δύο υποπεριπτώσεις και η ίδια συνάρτηση καλεί τον εαυτό της για κάθε μία από αυτές και συγχωνεύει τις επί μέρους λύσεις. Αποδεικνύεται ότι ο αλγόριθμος έχει αποδοτικότητα Θ(n logn) Αν όμως χρησιμοποιήσουμε αλγόριθμο που διασπά την κάθε περίπτωση σε μη ίσες υποπεριπτώσεις, τότε αποδεικνύεται ότι Θ(n2). Τμ. Πληροφορικής, Α.Π.Θ.

  12. Επιλογή στοιχείου Ι • Θέλουμε να επιλέξουμε τη διάμεσο, δηλ. το στοιχείο εκείνο που στον πίνακα υπάρχουν τόσα μεγαλύτερα στοιχεία, όσα και μικρότερα. • Μία λύση είναι να προηγηθεί ταξινόμηση του πίνακα κατά αύξουσα σειρά και να πάρουμε το μεσαίο στοιχείο. Αυτό θα απαιτούσε χρόνο O(nlogn). Μήπως γίνεται και πιο γρήγορα; • Θεωρούμε το γενικότερο πρόβλημα, το πρόβλημα της επιλογής: Έστω Τ ένας πίνακας από n στοιχεία και έστω k ένας ακέραιος μεταξύ 0 και n-1. Το k-στοπιο μικρό στοιχείο του Τ είναι η τιμή m για την οποία ισχύει Τμ. Πληροφορικής, Α.Π.Θ.

  13. Επιλογή στοιχείου ΙΙ int selection(T[n], k) { if (n αρκετά μικρό) {sort T; return T[k]} p=κάποιο στοιχείο του Τ[n]; u=#{i[0..n-1]|T[i]<p}; v=#{i[0..n-1]|T[i]p}; if (ku) { πίνακας U[0..u-1]τα στοιχεία του T που είναι μικρότερα από το p return selection(U,k)} if (kv) return p; else { //k>v πίνακας V[0..n-v-1]τα στοιχεία του T που είναι μεγαλύτερα από το p return selection(V,k-v)} } Τμ. Πληροφορικής, Α.Π.Θ.

  14. Επιλογή στοιχείου ΙΙI • Μπορεί να αποδειχθεί ότι αν χρησιμοποιούμε ως στοιχείο pivot τη διάμεσοκαι η εύρεσή της έχει μοναδιαίο κόστος, τότε ο αλγόριθμος είναι O(n). • Εναλλακτικά, αν επιλέγουμε κάθε φορά το πρώτο στοιχείο του πίνακα μπορούμε πάλι να χρησιμοποιήσουμε τη μέθοδο ελπίζοντας ότι τα μεγέθη των επί μέρους πινάκων θα είναι ισορροπημένα (αυτό εξαρτάται από την τυχαιότητα των στοιχείων). Τότε, στη χειρότερη περίπτωση ο αλγόριθμος θα είναι Ο(n2). • ΛΥΣΗ: Μία γρήγορη προσέγγιση της διαμέσου Τμ. Πληροφορικής, Α.Π.Θ.

  15. Επιλογή στοιχείου ΙV pseudomed(T[n]) { int s=n / 5; πίνακας S[s]; for (i=1;i<=s;i++) S[i]=adhocmed5(T[5i-4-1..5i]); return selection(S,[(s+1) / 2]) } όπου adhocmed αλγόριθμος ειδικά σχεδιασμένος για να βρίσκει τη διάμεσο μεταξύ πέντε στοιχείων Όταν χρησιμοποιείται μια προσέγγιση όπως η προαναφερόμενη τότε ο αλγόριθμος επιλογής είναι Ο(n). Τμ. Πληροφορικής, Α.Π.Θ.

  16. Πράξεις μεγάλων αριθμών Ι • Σε όσους αλγορίθμους χρησιμοποιήσαμε μέχρι τώρα θεωρήσαμε τις προσθέσεις και τους πολλαπλασιασμούς ως στοιχειώδεις πράξεις με την έννοια ότι ο χρόνος που απαιτείται για την εκτέλεση της κάθε μιας είναι άνω φραγμένος από μια σταθερά, που εξαρτάται μόνο από την ταχύτητα των κυκλωμάτων του υπολογιστή. • Αυτό όμως είναι αλήθεια μόνο όταν το μέγεθος των τελεστέων είναι αρκετά μικρό, ώστε να μπορεί να αναπαρασταθεί απευθείας στο hardware. Τι γίνεται ας πούμε όταν έχουμε πολλαπλασιασμό πολύ μεγάλων ακεραίων, που δεν μπορούν να αναπαρασταθούν στη μηχανή; • Χρειαζόμαστε μια αποδοτική αναπαράσταση σε επίπεδο λογισμικού!! • Εφαρμογή: Κρυπτογραφία Τμ. Πληροφορικής, Α.Π.Θ.

  17. Πράξεις μεγάλων αριθμών ΙΙ ΠΟΛΛΑΠΛΑΣΙΑΣΜΟΣ: 45Χ19 ΚΛΑΣΣΙΚΟΣ ΑΛΓΟΡΙΘΜΟΣ 45 Χ 19 405 +45  855 ΡΩΣΙΚΟΣ ΠΟΛΛΑΠΛΑΣΙΑΣΜΟΣ 45 19 19 πλεονέκτημα: 22 38 -- γίνεται μόνο με προσθέσεις, που σε επίπεδο 11 76 76 hardware έχουν μικρότερο κόστος από τους 5 152 152 πολλαπλασιασμούς 2 304 ---- 1 608 608 855 Τμ. Πληροφορικής, Α.Π.Θ.

  18. Πράξεις μεγάλων αριθμών ΙΙΙ • Και οι δύο αλγόριθμοι έχουν τετραγωνική πολυπλοκότητα. Μπορεί αυτό να βελτιωθεί; ΝΑΙ με διαίρει και βασίλευε. • Διασπάμε τον καθένα από τους τελεστέους σε δύο μέρη, περίπου του ιδίου μεγέθους: u=10sw+x και v=10sy+z, όπου 0x<10s, 0z<10sκαι Επομένως οι ακέραιοι w και y έχουν και οι δύο από ψηφία. Το γινόμενο δίνεται ως: Τμ. Πληροφορικής, Α.Π.Θ.

  19. Πράξεις μεγάλων αριθμών ΙV long int mult(u,v:long int) { n= μικρότερος ακέραιος έτσι ώστε τόσο ο u όσο και ο v να έχουν μέγεθος n; if(n είναι μικρό) { πολλαπλασίασε το u με το v χρησιμοποιώντας ένα κλασσικό αλγόριθμο returnτο γινόμενο} s = [n / 2]; w=[u / 10s]; x=u mod 10s; y=[v / 10s]; z=v mod 10s; return mult(w,y) X 102s + (mult(w,z)+mult(x,y)) X 10s + mult(x,z); } Τμ. Πληροφορικής, Α.Π.Θ.

  20. Πράξεις μεγάλων αριθμών V • Ο προηγούμενος αλγόριθμος επίσης έχει τετραγωνική πολυπλοκότητα και άρα δεν πετύχαμε καμιά βελτίωση. • Αν όμως αντικατασταθεί η τελευταία του εντολή από τις r=mult(w+x,y+z); p=mult(w,y); q=mult(x,z); return 102sp+10s(r-p-q)+q τότε μπορεί να αποδειχθεί ότι ο αλγόριθμος γίνεται , που είναι περίπου O(n1.59) και αυτό είναι μια βελτίωση Τμ. Πληροφορικής, Α.Π.Θ.

  21. Πολλαπλασιασμός πινάκων Ι • Ο κλασσικός αλγόριθμος για τον πολλαπλασιασμό δύο τετραγωνικών πινάκων Α και B διαστάσεων nXn είναι: • Αφού κάθε στοιχείο του C υπολογίζεται σε χρόνο τάξης n και για το γινόμενο απαιτούνται n2τέτοιοι υπολογισμοί, o αλγόριθμος έχει πολυπλοκότητα Θ(n3). Μπορούμε αυτό να το βελτιώσουμε; • ΝΑΙ σύμφωνα με τον αλγόριθμο που εφευρέθηκε το 1960από τον Strassen Τμ. Πληροφορικής, Α.Π.Θ.

  22. Πολλαπλασιασμός πινάκων ΙI Έστω δύο πίνακες 2Χ2 Α και Β: Θεωρούμε τις ακόλουθες πράξεις: m1=(α21+α22-α11)(b22-b12+b11) m2=α11b11 m3=α12b21 m4=(α11-α21)(b22-b12) m5=(α21+α22)(b12-b11) m6=(α12-α21+α11-α22)b22 m7=α22(b11+b22-b12-b21) Τμ. Πληροφορικής, Α.Π.Θ.

  23. Πολλαπλασιασμός πινάκων ΙII • Τότε, το γινόμενο δίνεται από τον πίνακα και άρα μπορούμε να υπολογίσουμε το γινόμενο χρησιμοποιώντας μόνο 7 πολλαπλασιασμούς • Αν αντικαταστήσουμε κάθε στοιχείο των A και B με πίνακα nXn, τότε φτιάχνουμε έναν αλγόριθμο έναν αλγόριθμο για πολλαπλασιασμό πινάκων 2nX2n με επτά πολλαπλασιασμούς πινάκων nXn και έναν αριθμό προσθέσεων και αφαιρέσεων. • Πολυπλοκότητα Ο(n2.81) Τμ. Πληροφορικής, Α.Π.Θ.

More Related