5.1 Επίδοση αλγορίθμων Μέχρι τώρα έχουμε γνωρίσει διάφορους αλγόριθμους (αναζήτησης, ταξινόμησης, κ.α.). Στο σημείο αυτό θα παρουσιάσουμε ένα τρόπο εκτίμησης της επίδοσης (performance) η της αποδοτικότητας (efficiency) των αλγορίθμων. Για να κατανοήσουμε την επίδοση ενός αλγορίθμου χρειάζεται να απαντηθούν πρωταρχικά ερωτήματα που προκύπτουν όπως: Πως υπολογίζεται ο χρόνος εκτέλεσης ενός αλγορίθμου; Πως συγκρίνονται μεταξύ τους οι διάφοροι αλγόριθμοι; Πως ξέρουμε αν ένας αλγόριθμος είναι «βέλτιστος»; Για να απαντήσουμε στα ερωτήματα αυτά πρέπει να καταγραφούν ουσιώδεις πληροφορίες για το πρόβλημα, όπως η αναγνώριση της χειρότερης περίπτωσης του αλγορίθμου και η αποτύπωση του μεγέθους του προβλήματος με βάση το πλήθος των δεδομένων. (μέγεθος εισόδου ενός αλγορίθμου) 5.1.1 Χειρότερη περίπτωση ενός αλγορίθμου Η χειρότερη περίπτωση ενός αλγορίθμου αφορά το μέγιστο κόστος εκτέλεσης του αλγορίθμου, το οποίο μετριέται σε υπολογιστικούς πόρους. Το κόστος αυτό κρίνει την επιλογή σχεδιασμού ενός αλγορίθμου. Για να είναι μετρίσιμη η χειρότερη περίπτωση, μετράμε το πλήθος των βασικών πράξεων που πρέπει να εκτελέσει ο αλγόριθμος στη χειρότερη περίπτωση. Μια βασική πράξη μπορεί να είναι: Ανάθεση τιμής Σύγκριση δύο μεταβλητών Οποιαδήποτε αριθμητική πράξη μεταξύ δύο μεταβλητών. Παράδειγμα: έστω ότι δίνεται ο παρακάτω αλγόριθμος: Αλγόριθμος παράδειγμα N 10 Αρχή_επανάληψης Διάβασε Μ Ν Ν-1 Μέχρις_ότου (Μ=0) Η (Ν=0) Εκτύπωσε Μ Τέλος παράδειγμα Κεφάλαιο 5
Είναι προφανές ότι η χειρότερη περίπτωση για αυτόν τον αλγόριθμο είναι όταν γίνουν δέκα επαναλήψεις. 5.1.2 Μέγεθος εισόδου ενός αλγορίθμου Γενικά τα δεδομένα συνιστούν το μέγεθος εισόδου ενός αλγορίθμου. Για παράδειγμα στον προηγούμενο αλγόριθμο, το μέγεθος του αλγορίθμου μπορεί να εκφραστεί από τη μεταβλητή Ν που εκφράζει το πλήθος των επαναλήψεων του αλγορίθμου. Ο παρακάτω πίνακας περιλαμβάνει παραδείγματα αλγορίθμων και δείχνει το μέγεθος εισόδου καθώς και τη βασική πράξη που εκτελεί κάθε αλγόριθμος. Μέγεθος εισόδου και βασική πράξη αλγορίθμων Αλγόριθμος Μέγεθος εισόδου αλγορίθμου (n) Βασική πράξη ΤΑΞΙΝΟΜΗΣΗ Το πλήθος των αντικειμένων που θα ταξινομηθούν σύγκριση ΠΟΛΛΑΠΛΑΣΙΑΣΜΟΣ Το πλήθος των ψηφίων των αριθμών που θα πολλαπλασιαστούν Αριθμητικές πράξεις ΑΝΑΖΗΤΗΣΗ Το πλήθος των στοιχείων του πίνακα σύγκριση 5.1.3 Χρόνος εκτέλεσης προγράμματος ενός αλγορίθμου Έστω ο παρακάτω αλγόριθμος : Αλγόριθμος παράδειγμα1 χ 123 ψ 234 Για i από 0 μέχρι 4 Εκτύπωσε i z χ + ψ Τέλος_επανάληψης Εκτύπωσε χ Εκτύπωσε ψ Εκτύπωσε z Τέλος παράδειγμα1 Η επίδοσή του θα υπολογιστεί με βάση τον αριθμό των πράξεων που θα εκτελεστούν. Ο βρόχος εκτελείται 5 φορές, έτσι έχουμε την παρακάτω ανάλυση: Εντολή αλγορίθμου Αριθμός πράξεων Ανάθεση τιμών στα χ και ψ 2 Βρόχος επανάληψης Αρχική τιμή i 1 Έλεγχος i 6 Αύξηση του i 5 Εκτύπωση του i 5 Υπολογισμός z (2 X 5) 10 Εκτύπωση του χ,ψ,z 3
ΣΥΝΟΛΟ 32 Εάν ο βρόχος εκτελεστεί n φορές, ο χρόνος εκτέλεσης θα εξαρτάται από το μέγεθος του n. Ο παρακάτω πίνακας παρουσιάζει τους χρόνους εκτέλεσης του αλγορίθμου αυτού για διαφορετικά μεγέθη του n. Χρόνοι εκτέλεσης αλγορίθμου ανάλογα με το μέγεθος Μέγεθος n Χρόνος εκτέλεσης 5 32 Μίκρο-δευτερόλεπτα 10 57 Μίκρο-δευτερόλεπτα 100 507 Μίκρο-δευτερόλεπτα 1000000 5 δευτερόλεπτα (περίπου) 5.1.4 Αποδοτικότητα αλγορίθμου Αν η επίλυση ενός προβλήματος γίνει με δύο η περισσότερους αλγορίθμους, τότε χρειάζεται να επιλέξουμε τον αποδοτικότερο. Δηλαδή αν ο αλγόριθμος Β έχει το ίδιο αποτέλεσμα σε λιγότερο χρόνο τότε είναι αποδοτικότερος του Α. Επίσης αν ο Β χρησιμοποιεί λιγότερη μνήμη από τον Α, πάλι είναι αποδοτικότερος. Βέβαια όταν συγκρίνονται δύο αλγόριθμοι, πρέπει να συγκρίνονται με ίδια δεδομένα και κάτω από ίδιες συνθήκες. Γενικά ο χρόνος εκτέλεσης ενός αλγορίθμου εξαρτάται από τους παρακάτω παράγοντες Τύπος του Η/Υ που θα εκτελεστεί το πρόγραμμα Γλώσσα προγραμματισμού που θα χρησιμοποιηθεί Δομή προγράμματος και δομές δεδομένων που χρησιμοποιούνται Χρόνος πρόσβασης του δίσκου και στις ενέργειες εισόδου-εξόδου Είδος συστήματος, ενός χρήστη η πολλών χρηστών Επομένως για να έχει νόημα η σύγκριση μεταξύ δύο προγραμμάτων αλγορίθμων θα πρέπει να ικανοποιούνται οι παρακάτω προϋποθέσεις και τα δύο προγράμματα να έχουν συνταχθεί στην ίδια γλώσσα προγραμματισμού να έχει χρησιμοποιηθεί ο ίδιος μεταφραστής της γλώσσας προγραμματισμού να χρησιμοποιείται η ίδια υπολογιστική πλατφόρμα, οι δύο αλγόριθμοι να έχουν ακριβώς τα ίδια δεδομένα σαν είσοδο
5.3 Πολυπλοκότητα αλγορίθμων Ο απλούστερος τρόπος μέτρησης της επίδοσης ενός αλγορίθμου είναι ο εμπειρικός η αλλιώς ο λεγόμενος εκ των υστέρων. Ο αλγόριθμος υλοποιείται και εφαρμόζεται σε ένα σύνολο δεδομένων, για να υπολογισθεί ο χρόνος επεξεργασίας και η χωρητικότητα μνήμης. Ο τρόπος αυτός παρουσιάζει δύο κύρια μειονεκτήματα: είναι δύσκολο να προβλεφθεί η συμπεριφορά του αλγορίθμου για κάποιο άλλο σύνολο δεδομένων ο χρόνος επεξεργασίας εξαρτάται από το υλικό, τη γλώσσα προγραμματισμού, το μεταφραστικό πρόγραμμα και τέλος από την ικανότητα του προγραμματιστή. Έτσι μπορεί να γίνουν λανθασμένες εκτιμήσεις για την επίδοση ενός αλγορίθμου. Ένας δεύτερος τρόπος μέτρησης της επίδοσης ενός αλγορίθμου είναι ο θεωρητικός η αλλιώς ο λεγόμενος εκ των προτέρων. Για το σκοπό αυτό θεωρούμε μια μεταβλητή n, που εκφράζει το μέγεθος (size) του προβλήματος, ώστε η μέτρηση της επίδοσης του αλγορίθμου να ισχύει για οποιοδήποτε σύνολο δεδομένων και ανεξάρτητα από παράγοντες όπως αυτοί που αναφέρθηκαν προηγουμένως. Η σημασία της μεταβλητής αυτής εξαρτάται από το πρόβλημα που πρόκειται να επιλυθεί. Για παράδειγμα αν το πρόβλημα είναι η ταξινόμηση k στοιχείων τότε n = k. Ο χρόνος επεξεργασίας και ο απαιτούμενος χώρος μνήμης εκτιμώνται με τη βοήθεια μιας συνάρτησης f(n) που εκφράζει την χρονική πολυπλοκότητα η την πολυπλοκότητα χώρου. Σε πολλές περιπτώσεις δεν μας ενδιαφέρουν οι ακριβείς τιμές αλλά μόνο η γενική συμπεριφορά των αλγορίθμων, δηλαδή η τάξη του αλγορίθμου, ο λεγόμενος συμβολισμός Ο (Order). Ορισμός: Αν η πολυπλοκότητα ενός αλγορίθμου είναι f(n), τότε λέμε ότι είναι της τάξης O(g(n)), αν υπάρχουν δύο θετικοί ακέραιοι c και n 0, έτσι ώστε για κάθε n>=n 0 να ισχύει: f(n) <= c g(n) Λέγεται ότι ο συμβολισμός Ο δίνει ένα άνω φράγμα για την πολυπλοκότητα ενός αλγορίθμου, δηλαδή δίνει ένα μέτρο που ποτέ δεν πρόκειται να ξεπεράσει ένας αλγόριθμος προς τα επάνω. Οι περισσότεροι αλγόριθμοι έχουν χρονική πολυπλοκότητα που ανήκει σε μια από τις παρακάτω κατηγορίες. Ο(1) κάθε εντολή του προγράμματος εκτελείται μία φορά η το πολύ μερικές μόνο φορές. Ο αλγόριθμος είναι σταθερής πολυπλοκότητας. Ο(logn). Ο αλγόριθμος είναι λογαριθμικής πολυπλοκότητας. O(n). Γραμμική πολυπλοκότητα, αυτή είναι η καλύτερη επίδοση για έναν αλγόριθμο που πρέπει να εξετάσει η να δώσει σαν έξοδο n στοιχεία. O(n logn). Διαβάζεται όπως ακριβώς γράφεται (n logn), στην κατηγορία αυτή ανήκουν διάφοροι αλγόριθμοι ταξινόμησης. O(n 2 ). Τετραγωνική πολυπλοκότητα. Πρέπει να χρησιμοποιείται μόνο για προβλήματα μικρού μεγέθους. O(n 3 ). Κυβική πολυπλοκότητα. Και αυτοί οι αλγόριθμοι πρέπει να χρησιμοποιείται μόνο για προβλήματα μικρού μεγέθους. O(2 n ). Εκθετική πολυπλοκότητα. Χρησιμοποιούνται σπάνια στην πράξη.
Στον παρακάτω πίνακα υπολογίζεται ο χρόνος ο χρόνος εκτέλεσης που απαιτείται για διαφορετικές πολυπλοκότητες σε συνάρτηση με το μέγεθος του προβλήματος. Υποτίθεται ότι κάθε στοιχειώδης πράξη απαιτεί ένα μικροδευτερόλεπτο. Έτσι αν για έναν αλγόριθμο της τάξης Ο(n3) διπλασιαστεί το μέγεθος του προβλήματος τότε απαιτείται οκταπλάσιος (2 3 ) χρόνος εκτέλεσης του αλγορίθμου. Χρόνοι εκτέλεσης αλγορίθμων ανάλογα με την πολυπλοκότητα και το μέγεθος Πολυπλοκότητα Μέγεθος προβλήματος αλγορίθμου n=20 n=40 n=60 O(n) 0.00002 δεύτερα 0.00004 δεύτερα 0.00006 δεύτερα O(n 2 ) 0.0004 δεύτερα 0.0016 δεύτερα 0.0036 δεύτερα O(n 3 ) 0.008 δεύτερα 0.064 δεύτερα 216 δεύτερα O(2 n ) 1.0 δεύτερα 2.7 ημέρες 366 αιώνες O(n!) 771 αιώνες 3 10 32 αιώνες 3 10 66 αιώνες Διαπιστώνουμε ότι οι αλγόριθμοι εκθετικής πολυπλοκότητας δεν έχουν πρακτική χρησιμότητα ακόμη και για μικρό αριθμό δεδομένων.
Α Π Α Ν Σ Η Μ Ε Ν Ε Ε Ρ Ω Σ Η Ε Ι 1. Ποια είναι τα πρωταρχικά ερωτήματα που τίθενται για την κατανόηση της επίδοσης ενός αλγορίθμου; Πως υπολογίζεται ο χρόνος εκτέλεσης ενός αλγορίθμου; Πως συγκρίνονται μεταξύ τους οι διάφοροι αλγόριθμοι; Πως ξέρουμε αν ένας αλγόριθμος είναι «βέλτιστος»; 2. Τι είναι και πως μπορεί να εκφραστεί η χειρότερη περίπτωση ενός αλγορίθμου; Η χειρότερη περίπτωση ενός αλγορίθμου αφορά το μέγιστο κόστος εκτέλεσης του αλγορίθμου. Για να εκφραστεί αυτή η χειρότερη περίπτωση συνήθως χρησιμοποιούμε το πλήθος των βασικών πράξεων που θα εκτελέσει ο αλγόριθμος στη χειρότερη περίπτωση. 3. Να περιγραφεί το μέγεθος της εισόδου ενός αλγορίθμου και να δοθεί ένα παράδειγμα αναγνώρισης και καταγραφής αυτού του μεγέθους. Το μέγεθος εισόδου ενός αλγορίθμου είναι το μέγεθος των δεδομένων εισόδου του αλγορίθμου. Παράδειγμα, το μέγεθος εισόδου ενός αλγορίθμου υπολογισμού του μέσου όρου κάποιων αριθμών είναι το πλήθος των αριθμών. 4. Από ποιους κύριους παράγοντες εξαρτάται ο χρόνος εκτέλεσης ενός αλγορίθμου; Ο χρόνος εκτέλεσης ενός αλγορίθμου εξαρτάται από τους παρακάτω παράγοντες: Τύπος του Η/Υ που θα εκτελεστεί το πρόγραμμα Γλώσσα προγραμματισμού που θα χρησιμοποιηθεί Δομή προγράμματος και δομές δεδομένων που χρησιμοποιούνται Χρόνος πρόσβασης του δίσκου και στις ενέργειες εισόδου-εξόδου Είδος συστήματος, ενός χρήστη η πολλών χρηστών 5. Ποιες είναι οι απαραίτητες προϋποθέσεις για να είναι δυνατή η σύγκριση μεταξύ δύο προγραμμάτων αλγορίθμων; Για να έχει νόημα η σύγκριση μεταξύ δύο προγραμμάτων αλγορίθμων θα πρέπει: και τα δύο προγράμματα να έχουν συνταχθεί στην ίδια γλώσσα προγραμματισμού να έχει χρησιμοποιηθεί ο ίδιος μεταφραστής της γλώσσας προγραμματισμού να χρησιμοποιείται η ίδια υπολογιστική πλατφόρμα, οι δύο αλγόριθμοι να έχουν ακριβώς τα ίδια δεδομένα σαν είσοδο
6. Να ορισθεί η αποδοτικότητα αλγορίθμων. Αποδοτικότητα αλγορίθμου είναι μια έννοια που εκφράζει τη χρήση των υπολογιστικών πόρων (χώρος και χρόνος) από τον αλγόριθμο και αποτελεί το γενικότερο κριτήριο σύγκρισης αλγορίθμων. 7. Να δοθεί ο ορισμός της πολυπλοκότητας αλγορίθμου. Η πολυπλοκότητα αλγορίθμου είναι ένας τύπος με τη βοήθεια του οποίου υπολογίζεται προσεγγιστικά το πλήθος των εντολών που θα εκτελεστούν σε συνάρτηση με το μέγεθος του προβλήματος. 8. Ποια είναι η πολυπλοκότητα των λειτουργιών σε στοίβες και ουρές; Ώθηση Απώθηση Ο(1) Εισαγωγή Εξαγωγή Ο(1) 9. Ποια είναι η πολυπλοκότητα της σειριακής αναζήτησης; Σειριακή αναζήτηση Ο(n)