Απόδοση Αλγορίθμων Πληροφορικής 1
Απόδοση Αλγορίθμων Συνήθως υπάρχουν πολλοί τρόποι (αλγόριθμοι) για την επίλυση ενός προβλήματος. Πώς επιλέγουμε μεταξύ αυτών; Πρέπει να ικανοποιηθούν δύο (αντικρουόμενοι) στόχοι 1. Ο αλγόριθμος να είναι εύκολα κατανοητός, ενώ παράλληλα να είναι απλός τόσο ο προγραμματισμός του όσο και η αποσφαλμάτωση (debugging) Ο συγκεκριμένος στόχος αφορά τις Αρχές Προγραμματισμού 2. Ο αλγόριθμος να κάνει αποδοτική χρήση των πόρων του υπολογιστή Ο συγκεκριμένος στόχος αφορά τις Δομές Δεδομένων και τη Θεωρία Αλγορίθμων Όταν εστιάσουμε στο 2 ο στόχο πώς μετράμε το κόστος του αλγορίθμου; Πληροφορικής 2
Μέτρηση Απόδοσης 1. Εμπειρική σύγκριση (τρέξιμο προγραμμάτων) 2. Ασυμπτωτική ανάλυση αλγορίθμων Παράγοντες που επηρεάζουν το χρόνο εκτέλεσης ενός προγράμματος: Για τους περισσότερους αλγορίθμους, ο χρόνος τρεξίματος εξαρτάται από το μέγεθος της εισόδου Ο χρόνος τρεξίματος εκφράζεται ως f(n) για κάποια συνάρτηση f πάνω στο μέγεθος n της εισόδου Πληροφορικής 3
Χρόνος εκτέλεσης Οι περισότεροι αλγόριθμοι μετατρέπουν αντικείμενα εισόδου σε αντικείμενα εξόδου. Ο χρόνος εκτέλεσης ενός αλγόριθμου συνήθως μεγαλώνει με το μέγεθος των δεδομένων εισόδου. Ο μέσος χρόνος είναι δύσκολο να υπολογιστεί. Εστιάζουμε στο χρόνο της χειρότερης περίπτωσης. Ευκολότερη ανάλυση Σημαντικός για εφαρμογές όπως παιχνίδια, ρομποτική Running Time 120 100 80 60 40 20 0 best case average case worst case 1000 2000 3000 4000 Input Size Πληροφορικής 4
Πειραματική Μελέτη Γράφουμε ένα πρόγραμμα που υλοποιεί τον αλγόριθμο Εκτελούμε το πρόγραμμα με εισόδους διαφορετικού μεγέθους και είδους Χρησιμοποιούμε μια συνάρτηση σαν την clock(), για να πάρουμε ακριβείς μετρήσεις του χρόνου εκτέλεσης Φτιάχνουμε το γράφημα με τα αποτελέσματα 0 Time (ms) 9000 8000 7000 6000 5000 4000 3000 2000 1000 0 50 100 Input Size Πληροφορικής 5
Περιορισμοί των πειραμάτων Είναι απαραίτητη η υλοποίηση των αλγορίθμων Τα αποτελέσματα δεν είναι πάντοτε ενδεικτικά για το χρόνο εκτέλεσης με διαφορετικές εισόδους Για την σύγκριση δύο αλγορίθμων χρειάζεται το ίδιο υλικό και λογισμικό Πληροφορικής 6
Θεωρητική ανάλυση Χρησιμοποιεί υψηλού επιπέδου περιγραφή του αλγορίθμου Ο χρόνος εκτέλεσης χαρακτηρίζεται ως συνάρτηση του μεγέθους n των εισόδων Υπολογίζονται όλες οι δυνατές εισόδοι Επιτρέπει την αξιολόγηση του αλγορίθμου ανεξάρτητα απο υλικό και λογισμικό Πληροφορικής 7
Ψευδοκώδικας Υψηλού επιπέδου περιγραφή του αλγορίθμου Πιο δομημένος από μια κοινή περιγραφή Λιγότερο λεπτομερής απο τον κώδικα Προτιμάται για την περιγραφή αλγορίθμων Κρύβει θέματα σχεδιασμού του προγράμματος Εύρεση μέγιστου στοιχείου σε πίνακα Algorithm arraymax(a, n) Input array A of n integers Output maximum element of A currentmax A[0] for i 1 to n 1 do if A[i] currentmax then currentmax A[i] return currentmax Πληροφορικής 8
Λεπτομέρειες Ψευδοκώδικα Έλεγχος ροής if then [else ] while do repeat until for do Οι αγκύλες αντικαθιστούνται με εσοχές κειμένου Δήλωση μεθόδων Algorithm method (arg [, arg ]) Input Output Κάλεσμα συνάρτησης var.method (arg [, arg ]) Επιστροφή τιμής return expression Expressions Ανάθεση (όπως στη C++) Ισότητα (όπως στη C++) n 2 Δυνάμεις και άλλες μαθηματικές εκφράσεις, επιτρέπονται Πληροφορικής 9
Βασικές λειτουργίες Βασικοί υπολογισμοί που γίνονται απο ένα αλγόριθμο Αναγνωρίσιμοι σε ψευδοκώδικα Ανεξάρτητο απο γλώσσα προγραμματισμού Ακριβής ορισμός δεν είναι απαραίτητος Υποθέτουμε ότι διαρκεί σταθερό χρόνο στο RAM μοντέλο Παραδείγματα: Υπολογισμός μιας έκφρασης Ανάθεση μίας τιμής σε μεταβλητή Κάλεσμα μιας συνάρτησης Επιστροφή από μια συνάρτηση Πληροφορικής 10
Υπολογισμός κόστους αλγορίθμου σε κάθε εντολή ανάθεσης τιμής ή δήλωσης θα χρεώνουμε σταθερό χρόνο οι βρόχοι for και while θα χρεώνονται το πλήθος των επαναλήψεων επί το πλήθος των εντολών που εκτελούνται σε κάθε επανάληψη Συχνά θα επικεντρωνόμαστε στις κυρίαρχες πράξεις, δηλαδή αυτές που παίζουν καταλυτικό ρόλο στη συμπεριφορά του αλγορίθμου: π.χ. στους αλγορίθμους ταξινόμησης οι κυρίαρχες πράξεις είναι οι συγκρίσεις και οι ανταλλαγές στοιχείων μεταξύ δύο θέσεων του πίνακα εισόδου Πληροφορικής 11
Μετρώντας βασικές λειτουργίες Παρατηρώντας τον ψευδοκώδικα, μπορούμε να βρούμε τον αριθμό των βασικών λειτουργιών ενός αλγορίθμου, ως συνάρτηση του μεγέθους εισόδου Algorithm arraymax(a, n) # λειτουργίες currentmax A[0] 2 for i 1 to n 1 do 2 n if A[i] currentmax then 2(n 1) currentmax A[i] 2(n 1) { increment counter i } 2(n 1) return currentmax 1 Total 7n 1 Πληροφορικής 12
Εκτιμώντας το χρόνο εκτέλεσης Ο αλγόριθμος arraymax εκτελεί 7n 1 βασικές λειτουργίες στη χειρότερη περίπτωση. Έστω: a = Ο χρόνος της γρηγορότερης βασικής λειτουργίας b = Ο χρόνος της αργότερης βασικής λειτουργίας Έστω T(n) είναι ο χρόνος της χειρότερης περίπτωσης της arraymax. Τότε a (7n 1) T(n) b(7n 1) Άρα ο χρόνος εκτέλεσης T(n) φράσεται από δύο γραμμικές συναρτήσεις Πληροφορικής 13
Παράδειγμα ανάλυσης Algorithm selectionsort(a) Input: Πίνακας Α n αριθμών Output: Διατεταγμένος πίνακας κόστος #εκτελέσεων 1. for (i=0;i<n;i++) { c 1 n+1 2. min=i; c 2 n 3. for (j=i+1;j<=n;j++) c 3 4. if (a[j]<a[min]) min=j; c 4 5. temp=a[i]; c 5 j n 6. a[i]=a[min]; c 6 n 7. a[min]=temp; c 7 n 8. } n j 1 n 1 j j Πληροφορικής 14
Πληροφορικής 15 Συνολικός χρόνος αλγορίθμου: ένας αλγόριθμος είναι γρηγορότερος από έναν άλλο αν ένας αλγόριθμος είναι ασυμπτωτικά γρηγορότερος από έναν άλλο αν 1 7 6 5 4 3 2 1 2 4 3 2 2 2 c n c c c c c c c n c c n T ) ( ) ( ) ( n n T n T ), ( ) 1( 2 0 ) ( ) ( lim 2 1 n T n T n Εκτιμώντας το χρόνο εκτέλεσης
Ρυθμός Αύξησης του χρόνου εκτέλεσης Αλλάζοντας το hardware/software Επιδρά στο T(n) με ένα σταθερό παράγοντα, αλλά Δεν αλλάζει τον ρυθμό αύξησης του T(n) Ο γραμμικός ρυθμός ανάπτυξης του T(n) είναι εσωτερικό χαρακτηριστικό του arraymax Πληροφορικής 16
Ρυθμοί Ανάπτυξης Ρυθμοί ανάπτυξης συναρτήσεων: Γραμμικός n Τετραγωνικός n 2 Κυβικός n 3 Σε ένα log-log διάγραμμα, η κλίση της γραμμής δείχνει το ρυθμό ανάπτυξης της συνάρτησης T (n ) 1E+30 1E+28 1E+26 1E+24 1E+22 1E+20 1E+18 1E+16 1E+14 1E+12 1E+10 1E+8 1E+6 1E+4 1E+2 1E+0 Cubic Quadratic Linear 1E+0 1E+2 1E+4 1E+6 1E+8 1E+10 n Πληροφορικής 17
Σταθεροί παράγοντες Ο ρυθμός αύξησης δεν επηρεάζεται από Σταθερούς παράγοντες, ή Μικρότερου βαθμού παράγοντες Παραδείγματα 10 2 n 10 5 είναι γραμμική συνάρτηση 10 5 n 2 10 8 n είναι τετραγωνική συνάρτηση T (n ) 1E+26 1E+24 1E+22 1E+20 1E+18 1E+16 1E+14 1E+12 1E+10 1E+8 1E+6 1E+4 1E+2 1E+0 Quadratic Quadratic Linear Linear 1E+0 1E+2 1E+4 1E+6 1E+8 1E+10 n Πληροφορικής 18
Παραδείγματα Ρυθμού Αύξησης Παράδειγμα 1 (εύρεση του μέγιστου στοιχείου ενός πίνακα) int largest(int array[], int n) { int currlarge = 0; for (int i=1; i<n; i++) // Για κάθε val if (array[currlarge] < array[i]) currlarge = i; // αποθήκευση της θέσης return currlarge; // επιστροφή μεγαλύτερου } Παράδειγμα 2 ( χαζός υπολογισμός της έκφρασης n(n-1)) sum = 0; for (i=1; i<=n; i++) for (j=1; j<n; j++) sum++; } Πληροφορικής 19
Γραφική Αναπαράσταση Ρυθμού Αύξησης Πληροφορικής 20
Καλύτερη, Χειρότερη, Μέση Περίπτωση Διαφορετικές είσοδοι του ίδιου μεγέθους συνήθως απαιτούν διαφορετικό χρόνο τρεξίματος Παράδειγμα: Σειριακή αναζήτηση ενός στοιχείου (του K) σε έναν πίνακα n ακεραίων: Ξεκινάμε από το πρώτο στοιχείο του πίνακα και εξετάζουμε στη σειρά κάθε στοιχείο, μέχρι να βρούμε το K. Ποια είναι η καλύτερη / χειρότερη / μέση περίπτωση; Αν και ο μέσος χρόνος δείχνει να είναι το πιο δίκαιο μέτρο, μπορεί να είναι δύσκολο να υπολογιστεί Πληροφορικής 21
Ταχύτερος Υπολογιστής ή Ταχύτερος Αλγόριθμος; Τι συμβαίνει όταν αγοράζουμε έναν υπολογιστή 10 φορές ταχύτερο; n (n ): το μέγεθος εισόδου που μπορούμε να επεξεργαστούμε σε 1 ώρα με τον αργό (ταχύ) υπολογιστή, χρόνος που αντιστοιχεί σε έστω 10,000 (100,000) πράξεις T(n) n n Αλλαγή n /n 10n 1,000 10,000 n = 10n 10.00 20n 500 5,000 n = 10n 10.00 5n log n 250 1,842 10 n < n < 10n 7.37 2n 2 70 223 n = 10n 3.16 2 n 13 16 n = n + 3 1.23 Πληροφορικής 22
Ο() Σημειογραφία Έστω οι συναρτήσεις f(n) και g(n), λέμε ότι f(n) είναι O(g(n)) αν υπάρχουν θετικές σταθερές c και n 0 έτσι ώστε f(n) cg(n) για n n 0 Παράδειγμα: 2n 10 είναι O(n) 2n 10 cn (c 2) n 10 n 10 (c 2) Για c 3 και n 0 10 10.000 1.000 100 10 1 3n 2n+10 n 1 10 100 1.000 n Πληροφορικής 23
Ο() Παράδειγμα Παράδειγμα: η συνάρτηση n 2 δεν είναι O(n) n 2 cn n c Η παραπάνω ανίσωση δεν μπορεί να ικανοποιηθεί διότι το c πρέπει να είναι σταθερά 1.000.000 100.000 10.000 1.000 100 10 n^2 100n 10n n 1 1 10 100 1.000 n Πληροφορικής 24
Ασυμπτωτική Ανάλυση: Συμβολισμός Όμικρον Κεφαλαίο (Ο) Ορισμός: f(n) = O(g(n) αν και μόνο αν υπάρχουν θετικές σταθερές c και n 0 τέτοιες ώστε f(n) cg(n) για όλα τα n n 0 Παράδειγμα: Ο αλγόριθμος... είναι O(n 2 ) [καλύτερης, μέσης, χειρότερης] περίπτωσης Ερμηνεία: Για όλα τα αρκετά μεγάλα σύνολα δεδομένων (δηλαδή n n 0 ), ο αλγόριθμος πάντα τερματίζει σε λιγότερα από cg(n) βήματα στην [καλύτερη, μέση, χειρότερη] περίπτωση Αποτελεί άνω όριο κόστους Πληροφορικής 25
Συμβολισμός Όμικρον Κεφαλαίο (Ο) (συν.) Συνηθίζεται σε μία έκφραση κεφαλαίου «Ο» να διατηρούμε μόνο τον πιο σημαντικό όρο. Έτσι, αντί για Ο(n 2 +nlogn+n) γράφουμε απλά O(n 2 ). Ο συμβολισμός Ο δηλώνει ένα άνω όριο. Παράδειγμα: Εάν f(n) = 3n 2 τότε η f(n) είναι O(n 2 ). Επιθυμούμε όσο το δυνατό στενότερα όρια: Παρόλοπουισχύειότιησυνάρτησηf(n) = 3n 2 είναι O(n 3 ), προτιμούμε O(n 2 ) Πληροφορικής 26
Παραδείγματα Χρήσης του Ο Παράδειγμα 1: Εύρεση της τιμής X σε έναν πίνακα (μέσο κόστος) f(n) = c s n/2. Για όλα τα n, c s n/2 c s n. Επομένως, f(n) είναι O(n) για n 0 =1 και c=c s Παράδειγμα 2: f(n) = c 1 n 2 + c 2 n στη μέση περίπτωση. c 1 n 2 + c 2 n c 1 n 2 + c 2 n 2 (c 1 + c 2 )n 2 για όλα τα n Άρα f(n) cn 2 για c = c 1 + c 2 και n 0 = 1 Επομένως, f(n) είναι O(n 2 ) εξ ορισμού Παράδειγμα 3: f(n) = c. Λέμε ότι είναι O(1) Πληροφορικής 27
Περισσότερα Ο() Παραδείγματα 7n-2 7n-2 είναι O(n) Θέλουμε c > 0 και n 0 1 έτσι ώστε 7n-2 c n για n n 0 Αυτό ισχύει για c = 7 και n 0 = 1 3n 3 + 20n 2 + 5 3n 3 + 20n 2 + 5 είναι O(n 3 ) Θέλουμε c > 0 και n 0 1 έτσι ώστε 3n 3 + 20n 2 + 5 c n 3 για n n 0 Αυτό ισχύει για c = 4 και n 0 = 21 3 log n + log log n 3 log n + log log n είναι O(log n) Θέλουμε c > 0 και n 0 1 έτσι ώστε 3 log n + log log n c log n για n n 0 Αυτό ισχύει για c = 4 και n 0 = 2 Πληροφορικής 28
Ο() και ρυθμός ανάπτυξης Η σημειογραφία Ο() δίνει ένα πάνω φράγμα του ρυθμού ανάπτυξης μιας συνάρτησης Η δήλωση f(n) είναι O(g(n)) σημαίνει ότι ο ρυθμός ανάπτυξης της f(n) δεν είναι μεγαλύτερος της g(n) Μπορούμε να χρησιμοποιήσουμε τη σημειογραφία Ο() για να κατηγοριοποιήσουμε συναρτήσεις με βάση τον ρυθμό ανάπτυξής τους g(n) μεγαλύτερη f(n) μεγαλύτερη ίδιες f(n) είναι O(g(n)) Ναι Οχι Ναι g(n) είναι O(f(n)) Οχι Ναι Ναι Πληροφορικής 29
Ασυμπτωτική Ανάλυση Αλγορίθμων Η ασυμπτωτική ανάλυση ενός αλγορίθμου ορίζει το χρόνο εκτέλεσης σε σημειογραφία Ο() Για να κάνουμε ασυμπτωτική ανάλυση Βρίσκουμε τον αριθμό βασικών λειτουργιών που εκτελούνται στη χειρότερη περίπτωση, ως συνάρτηση του μεγέθους εισόδου Εκφράζουμε τη συνάρτηση σε Ο() σημειογραφία Παράδειγμα: Βρίσκουμε ότι ο αλγόριθμος arraymax εκτελεί το πολύ 7n 1 βασικές λειτουργίες Λέμε ότι ο αλγόριθμος arraymax τρέχει σε O(n) χρόνο Λόγω του ότι οι σταθερές και οι μικρότερου βαθμού παράγοντες θα πεταχτούν αργότερα, μπορούμε να τους αγνοήσουμε όταν μετράμε βασικές λειτουργίες Πληροφορικής 30
Ο() κανόνες Εάν η f(n) είναι πολυώνυμο βαθμού d, τότε f(n) είναι O(n d ), i.e., 1. Διώχνουμε τους μικρότερου βαθμού παράγοντες 2. Διώχνουμε τις σταθερές Χρησιμοποιούμε τη μικρότερη τάξη συναρτήσεων Λέμε 2n είναι O(n) αντί 2n είναι O(2n) Χρησιμοποιούμε την πιο απλή έκφραση της τάξης Λέμε 3n 5 είναι O(n) αντί 3n 5 είναι O(3n) Πληροφορικής 31
Μια Συνηθισμένη Παρεξήγηση Η καλύτερη περίπτωση για τον αλγόριθμό μου είναι n=1 επειδή αυτό είναι το γρηγορότερο. ΛΑΘΟΣ! Το Ο αναφέρεται σε ένα αυξανόμενο ρυθμό (rate) καθώς το n τείνει στο. Η καλύτερη περίπτωση ορίζεται ως: ποια είσοδος μεγέθους n είναι φθηνότερη από όλες τις εισόδους μεγέθους n. Πληροφορικής 32
Συμβολισμός Ωμέγα Κεφαλαίο (Ω) Ορισμός: f(n) = Ω(g(n) αν και μόνο αν υπάρχουν θετικές σταθερές c και n 0 τέτοιες ώστε f(n) cg(n) για όλα τα n n 0 Παράδειγμα: Ο αλγόριθμος... είναι Ω(n 2 ) [καλύτερης, μέσης, χειρότερης] περίπτωσης Ερμηνεία: Για όλα τα αρκετά μεγάλα σύνολα δεδομένων (δηλαδή n n 0 ), ο αλγόριθμος πάντα τερματίζει σε περισσότερα από cg(n) βήματα στην [καλύτερη, μέση, χειρότερη] περίπτωση Αποτελεί κάτω όριο κόστους Πληροφορικής 33
Παράδειγμα Χρήσης του Ω f(n) = c 1 n 2 + c 2 n c 1 n 2 + c 2 n c 1 n 2 για όλα τα n Άρα f(n) cn 2 για c = c 1 και n 0 = 1. Επομένως, η f(n) είναι (n 2 ) εξ ορισμού. Θέλουμε το μεγαλύτερο κάτω όριο. Πληροφορικής 34
Συμβολισμός Θήτα Κεφαλαίο (Θ) Όταν τα Ο και ταυτιστούν, το δηλώνουμε αυτό με χρήση του συμβολισμού. Ορισμός: f(n) = Θ(g(n) αν και μόνο αν υπάρχουν θετικές σταθερές c 1, c 2 και n 0 τέτοιες ώστε c 1 g(n) f(n) c 2 g(n) για όλα τα n n 0 Παρατήρηση: Ένας αλγόριθμος λέμε ότι είναι Θ(g(n) εάν είναι ταυτόχρονα Ο(g(n) και Ω(g(n) Πληροφορικής 35
(Ακόμη) μια Συνηθισμένη Παρεξήγηση Μπερδεύουμε τη χειρότερη περίπτωση με το άνω όριο Το άνω όριο αναφέρεται σε ένα αυξανόμενο ρυθμό Η χειρότερη περίπτωση αναφέρεται στη χειρότερη είσοδο ανάμεσα στις πιθανές εισόδους ενός δοθέντος μεγέθους Πληροφορικής 36
Κανόνες Απλοποίησης 1. Εάν f(n) = O(g(n)) και g(n) = O(h(n)), τότε f(n) = O(h(n)) 2. Εάν f(n) = O(kg(n)) για σταθερά k > 0, τότε f(n) = O(g(n)) 3. Εάν f 1 (n) = O(g 1 (n)) και f 2 (n) = O(g 2 (n)), τότε (f 1 + f 2 )(n) = O(max(g 1 (n), g 2 (n))) 4. Εάν f 1 (n) = O(g 1 (n)) και f 2 (n) = O(g 2 (n)), τότε f 1 (n)f 2 (n) = O(g 1 (n)g 2 (n)) Πληροφορικής 37
Ασυμπτωτικές Ταυτότητες Πληροφορικής 38
Συγγενείς του Ο() Ω() f(n) ειναι (g(n)) αν υπάρχει σταθερά c > 0 και ακέραια σταθερά n 0 1 έτσι ώστε f(n) c g(n) για n n 0 Θ() f(n) είναι (g(n)) αν υπάρχουν στεθερές c > 0 και c > 0 και ακέραια σταθερά n 0 1 έτσι ώστε c g(n) f(n) c g(n) για n n 0 ο() f(n) είναι o(g(n)) αν, για κάθε σταθερά c > 0, υπάρχει ακέραια σταθερά n 0 0 έτσι ώστε f(n) c g(n) για n n 0 ω() f(n) είναι (g(n)) αν, για κάθε σταθερά c > 0, υπάρχει ακέραια σταθερά n 0 0 έτσι ώστε f(n) c g(n) για n n 0 Πληροφορικής 39
Σχέσεις Ο() f(n) είναι O(g(n)) αν f(n) είναι ασυμπτωτικά μικρότερη ή ίση με g(n) Ω() f(n) είναι (g(n)) αν f(n) είναι ασυμπτωτικά μεγαλύτερη ή ίση με g(n) Θ() f(n) είναι (g(n)) αν f(n) είναι ασυμπτωτικά ίση με g(n) ο() f(n) είναι o(g(n)) αν f(n) είναι ασυμπτωτικά αυστηρά μικρότερη απο g(n) ω() f(n) είναι (g(n)) αν είναι ασυμπτωτικά αυστηρά μεγαλύτερη απο g(n) Πληροφορικής 40
Παραδείγματα συγγενών του Ο() 5n 2 είναι (n 2 ) f(n) είναι (g(n)) αν υπάρχει σταθερά c > 0 και μια ακέραια σταθερά n 0 1 έτσι ώστε f(n) c g(n) για n n 0 έστω c = 5 και n 0 = 1 5n 2 έστω (n) f(n) είναι (g(n)) αν υπάρχει σταθερά c > 0 και μια ακέραια σταθερά n 0 1 έτσι ώστε f(n) c g(n) για n n 0 έστω c = 1 και n 0 = 1 5n 2 είναι (n) f(n) είναι (g(n)) αν, για κάθε σταθερά c > 0, υπάρχει μια ακέραια σταθερά n 0 0 έτσι ώστε f(n) c g(n) για n n 0 χρειαζόμαστε 5n 02 c n 0 δεδομένου c, το n 0 που ικανοποιεί το παραπάνω, είναι n 0 c/5 0 Πληροφορικής 41
Ρυθμός Αύξησης του χρόνου εκτέλεσης Στις περισσότερες περιπτώσεις είτε δεν είμαστε σε θέση είτε δε μας ενδιαφέρει να βρούμε ακριβείς τύπους και απλά ασχολούμαστε με το ρυθμό αύξησης ή την τάξη αύξησης των συναρτήσεων που εκφράζουν την πολυπλοκότητα του αλγορίθμου. Τότε μιλάμε για ασυμπτωτικές εκτιμήσεις O, Θ ή Ω. c'f cf g g g cf cf O(f) Ω(f) Θ(f) Πληροφορικής 42
Παραδείγματα Παράδειγμα 1: a = b; Αυτή η ανάθεση παίρνει σταθερό χρόνο c, οπότε είναι Θ(1) Παράδειγμα 2: υπολογισμός n(n+1)/2 Παράδειγμα 3: (εναλλακτικός) υπολογισμός n(n+1)/2 sum = 0; for (i=1; i<=n; i++) sum += i; sum = 0; for (i=1; i<=n; i++) for (j=1; j<=i; j++) sum++; Σύγκριση 2 και 3: Υπολογισμός ίδιας έκφρασης με διαφορετικό κόστος! Θ(n) έναντι Θ(n 2 ) Πληροφορικής 43
Παραδείγματα (συν.) Παράδειγμα 4: υπολογισμός n 2 sum = 0; for (i=1; i<=n; i++) for (j=1; j<=n; j++) sum++; Παράδειγμα 5: Σύγκριση 3 και 4: Υπολογισμός διαφορετικών εκφράσεων με ίδιο κόστος! Θ(n 2 ) Παράδειγμα 6: sum = 0; for (k=1; k<=n; k*=2) for (j=1; j<=n; j++) sum++; Κόστος Θ(n log n) sum = 0; for (k=1; k<=n; k*=2) for (j=1; j<=k; j++) sum++; Κόστος Θ(n) Πληροφορικής 44
Χωρικά Όρια Κόστους Ισορροπία Μεταξύ Χρονικού / Χωρικού Κόστους Τα χωρικά όρια μπορούν επίσης να αναλυθούν με χρήση ασυμπτωτικής ανάλυσης Χρόνος: Αλγόριθμος που επιλύει το πρόβλημα Χώρος της δομής δεδομένων που απαιτείται για την υλοποίηση του αλγορίθμου Μπορούμε να μειώσουμε το χρόνο εάν θελήσουμε να θυσιάσουμε το χώρο (και αντίστροφα) Σκεφτείτε (στην πορεία του μαθήματος) παραδείγματα... Πληροφορικής 45
Παράδειγμα 1 Έστω η συνάρτηση g(n) = n 2 + n + 10 Λέμε ότι g(n) = O(n 2 ), διότι μπορούμε να βρούμε μία σταθερά c, και έναν αριθμό n 0 έτσι ώστε n > n 0 n 2 + n + 10 < c n 2 Μπορείτε να βρείτε τιμές για τα c και n 0 ; Π.χ. c=15, n 0 =1 Πληροφορικής 46
Παράδειγμα 2 Αν ξέρουμε ότι ένας αλγόριθμος έχει πολυπλοκότητα O(n) σε ένα σύστημα Pentium IV στα 3 GHz, πόση είναι η πολυπλοκότητα σε ένα σύστημα Pentium III στα 500 ΜHz; ΠΡΟΣΟΧΗ: Η πολυπλοκότητα ενός αλγορίθμου είναι ανεξάρτητη μηχανής. Πληροφορικής 47
Παράδειγμα 3 Βρέστε την πολυπλοκότητα (μέσης και χειρότερης περίπτωσης) των παρακάτω loops: 1. int k=0; for (int i=0; i<n; i++) for (int j=0; j<n; j++) k++; 2. int k=0; for (int i=1; i<n; i=2*i) for (int j=1; j<n; j++) k++; 3. int sum=0; for (int i=0; i<n; i++) for (int j=0; j<i*i; j++) sum++; Πληροφορικής 48
Παράδειγμα 3 Σε όλες τις περιπτώσεις μέση και χειρότερη περίπτωση έχουν ίδια πολυπλοκότητα ΠΡΟΣΟΧΗ: Mη συγχέουμε τη χειρότερη περίπτωση με την Ο() και τη μέση με τη Θ() Βρέστε την πολυπλοκότητα (μέσης και χειρότερης περίπτωσης) των παρακάτω loops: 1. int k=0; for (int i=0; i<n; i++) //n φορές for (int j=0; j<n; j++) k++; //n*n φορές Θ(n 2 ) (παρατηρήστε ότι είναι και O(n 2 ) και Ω(n 2 ) ) Πληροφορικής 49
Παράδειγμα 3 2. int k=0; for (int i=1; i<n; i=2*i) //το i παίρνει τιμές 1,2,4,8,... for (int j=1; j<n; j++) k++; //n-1 φορές Το 1ο loop θα εκτελεστεί συνολικά m φορές όπου 2 m-1 < n 2 m => m-1 < logn m => m=floor(logn) Επομένως Συνολικό κόστος αλγορίθμου (n-1)*logn=nlogn-logn Δηλαδή Θ(nlogn) Πληροφορικής 50
Παράδειγμα 3 3. int sum=0; for (int i=0; i<n; i++) //n φορές for (int j=0; j<i*i; j++) sum++; Για i=0 έχω 0 εκτελέσεις του 2ου loop i=1 1 i=2 4 i=3 9. i=n-1 (n-1) 2 Σύνολο πράξεων: 2 i n n 1)( 2 0 i n ( n 1) 3 ( n ) 6 Πληροφορικής 51
Παράδειγμα 4 Στον αλγόριθμο maxarray() θέλουμε να βρούμε πόσα ενδιάμεσα μέγιστα θα υπολογιστούν στη μέση περίπτωση (στη χειρότερη είναι n) Υποθέτουμε ότι κάθε μία από τις n! διατάξεις των n στοιχείων του πίνακα είναι ισοπίθανη. Πληροφορικής 52
Παράδειγμα 4 Έστω συμβολίζω με Ci το γεγονός της αλλαγής της ΜΑΧ τιμής κατά την i-οστή επανάληψη τότε: Prob[Ci]=Prob[A[i]>A[j], j<i]= 1/(i+1) Αρα Δηλ. T( n) E[ T( n)] T ( n) 0 i n 0 i n (1 Prob[ C 1 i (1 0 ) H i 1 i 1 n ] 0 Prob[ i C i O(log n) ]) Πληροφορικής 53
Έστω ο κάτωθι αλγόριθμος Παράδειγμα 5 Algorithm Max(A) Input: Πίνακας A A.length ακεραίων Output: Ο μεγαλύτερος ακέραιος του Α 1. max = A[0]; 2. for (i = 1; i < A.length; i++) 3. if (max < A[i]) 4. max = A[i]; 5. return max; Ποια η χειρότερη περίπτωση του αλγορίθμου υπολογισμού του μέγιστου στοιχείου ενός πίνακα; Πληροφορικής 54
Παράδειγμα 5 Ποια η χειρότερη περίπτωση του αλγορίθμου υπολογισμού του μέγιστου στοιχείου ενός πίνακα; Απάντηση: Ο πίνακας να είναι ταξινομημένος. Σε αυτή την περίπτωση θα έχουμε n-1 αλλαγές της μεταβλητής max. Πληροφορικής 55
Παράδειγμα 6 Να αναλυθεί λεπτομερώς η πολυπλοκότητα του Αλγορίθμου Ταξινομήσεως Επιλογής, περιγράφοντας με αδρές γραμμές τη λειτουργία του. Algorithm selectionsort(a) Input: Πίνακας Α n ακεραίων Output: Διατεταγμένος πίνακας 1. for (i = 0; I < A.length; i++) { 2. min = I; 3. for (j = i+1; j <= A.length; j++) 4. if (a[j] < a[min]) min = j); 5. temp = a[i]; 6. a[i] = a[min]; 7. a[min] = temp; 8. } Πληροφορικής 56
Παράδειγμα 6 Ο αλγόριθμος σαρώνει τον πίνακα Α με τα προς ταξινόμηση στοιχεία, από αριστερά προς δεξιά, διακρίνοντας τον: στο αριστερό τμήμα α=α[0 i-1], το οποίο στεγάζει διατεταγμένα τα i μικρότερα στοιχεία του Α στο αταξινόμητο δεξί τμήμα δ=α[i n-1], το οποίο αποτελείται από τα υπόλοιπα n-iστοιχεία Κάθε φορά βρίσκει - με απλή σάρωση το μικρότερο στοιχείο του δεξιού τμήματος δ και το ανταλλάσσει με το αριστερότερο στοιχείο του δ, επεκτείνοντας το διατεταγμένο τμήμα α κατά μία θέση προς τα δεξιά. Η όλη διαδικασία σταματά, όταν το δ κενωθεί. Πληροφορικής 57
Παράδειγμα 7 Να αναλυθεί ο ακόλουθος κώδικας αναστροφής ενός πίνακα: 1. void Trans(int [ ] [ ] A) { 2. int n = A.length, temp; 3. for (int i = 0; j < n; i++) { 4. for (int j = i+1; j < n; j++) { 5. temp = A[ i ] [ j ]; 6. A[ i ] [ j ] = A[ j ] [ i ]; 7. A[ j ] [ i ] = temp; 8. } 9. } 10. } Πληροφορικής 58
Παράδειγμα 7 1. void Trans(int [ ] [ ] A) { 2. int n = A.length, temp; 3. for (int i = 0; i < n; i++) { 4. for (int j = i+1; j < n; j++) { 5. temp = A[ i ] [ j ]; 6. A[ i ] [ j ] = A[ j ] [ i ]; 7. A[ j ] [ i ] = temp; 8. } 9. } 10. } Η γραμμή 3 εκτελείται συνολικά n+1φορές Η γραμμή 4 n+(n-1)+ +1=n(n+1)/2φορές, όπως και οι 5-7 Υποθέτοντας ότι όλες οι εντολές κοστίζουν Ο(1) χρόνο, η ολική πολυπλοκότητα είναι c(n 2 +1)=O(n 2 ). 59
Παράδειγμα 8 Έστω το ακόλουθο τμήμα κώδικα: L0 int m = 0; L1 for (int x 1 = 1; x 1 < c+1; x 1 ++) L2 for (int x 2 = 1; x 2 < x 1 + 1; x 2 ++)...... Ln Ln+1 for (int xn = 1; xn < xn-1 + 1; xn++) m++; Πόσες φορές έχει αυξηθεί η τιμή της μεταβλητής m; Πληροφορικής 60
Παράδειγμα 8 Πόσες φορές έχει αυξηθεί η τιμή της μεταβλητής m; Απάντηση: Παρατηρούμε ότι, ανά πάσα χρονική στιγμή, ισχύει ότι 1 xn xn-1 x 1 c. Επομένως, οι τιμές των x i συνιστούν μία συλλογή από μη διακεκριμένους ακεραίους του συνόλου { 1, 2, 3,, c }. Άρα, η τιμή που παίρνει η μεταβλητή m ισούται με όλους τους δυνατούς τρόπους επιλογής με επανάληψη n ακεραίων από το σύνολο { 1, 2, 3,, c } και συνεπώς c n 1 m n 61
Παράδειγμα 9 1. int Sum(int n, int a, int r) { 2. int s = a, p = a*r, k = 1; 3. 4. while (k < n) { 5. s += p; 6. p *= r; 7. k++; 8. } 9. return s; 10. } Να αναλυθεί η χρονική πολυπλοκότητα του παραπάνω κώδικα. Τι υπολογίζει; 62
Παράδειγμα 9 Να αναλυθεί η χρονική πολυπλοκότητα του παραπάνω κώδικα. Τι υπολογίζει; Απάντηση: Ο αλγόριθμος υπολογίζει το άθροισμα Σ 0 i<k ar i και είναι γραμμικός στο πλήθος n των όρων του αθροίσματος Πληροφορικής 63
Παράδειγμα 10 Έστω ο κάτωθι κώδικας του αλγορίθμου ταξινομήσεως εισαγωγής (insertion sort): 1. static void insertionsort (int [ ] a) { 2. int n = a.length, j, v; 3. for (int i = 1; i < n; i++) { 4. j = i; 5. v = a [ i ]; 6. while ((j > 0) && (v < a[ j -1])) { 7. a [ j ] = a [ j -1]; 8. j --; 9. } 10. a [ j ] = v; 11. } 12. } Εξηγήστε εν συντομία πώς λειτουργεί ο παραπάνω αλγόριθμος. 64
Παράδειγμα 10 Εξηγήστε εν συντομία πώς λειτουργεί ο παραπάνω αλγόριθμος. Απάντηση: Η ταξινόμηση εισαγωγής σαρώνει τον πίνακα a από αριστερά προς τα δεξιά, διακρίνοντας τον κάθε χρονική στιγμή σε δύο τμήματα: (α) το αριστερό Α, το οποίο στεγάζει διατεταγμένα τα στοιχεία που έχουν συναντηθεί έως τώρα, και (β) το δεξί Δ, το οποίο αποτελείται από τα στοιχεία που δεν έχουν ακόμη εξετασθεί, και, φυσικά παραμένει αταξινόμητο. Κάθε φορά παίρνει, ως το επόμενο προς εξέταση στοιχείο, το αριστερότερο στοιχείο v του Δ και το ενθέτει στη σωστή θέση στο Α, ολισθαίνοντας τα μεγαλύτερα του v στοιχεία κατά μία θέση προς τα δεξιά. Η όλη διαδικασία σταματά, όταν εξετασθούν όλα τα αντικείμενα του πίνακα και το Δ κενωθεί. 65
Παράδειγμα 11 Τρεις αλγόριθµοι Α, Β, και Γ έχουν αναλυθεί και έχει βρεθεί ότι ο χρόνος εκτέλεσης χειρίστης περίπτωσης για τον καθένα από αυτούς δίνεται αντίστοιχα από τις πιο κάτω συναρτήσεις: f (n) = n 2 g(n) = 150n logn h(n) = n αν n mod2 = 1 n 3 αν n mod2 = 0 Να αποφασίσετε ποιες από τις πιο κάτω προτάσεις είναι αληθείς. Να αιτιολογήσετε τις απαντήσεις σας: 1. Για µεγάλες τιµές του n (n>1000) στη χείριστη περίπτωση ο αλγόριθµος B είναι πιο αποδοτικός από τον αλγόριθµο A. 2. Για µικρές τιµές του n (n<100) στη χείριστη περίπτωση ο αλγόριθµος Β είναι πιο αποδοτικός από τον αλγόριθµοα. 3. Για µεγάλες τιµές του n (n>1000) στη χείριστη περίπτωση ο αλγόριθµος Γ είναι πιο αποδοτικός από τον αλγόριθµοβ. 4. f Ω(g) και g O(h). 5. v) f O(g) και g Θ(h). 6. f O(h) ή h O(f). 66
Παράδειγματα Να δείξετε ότι η συνάρτηση f (n) = 2 n+5 είναι Ο(2 n) ) Να δείξετε ότι η συνάρτηση f (n) = 2 5n δεν είναι Ο(2 n) ) 67