ΚΕΦΑΛΑΙΟ 5: Αλγόριθμοι Αρχικές έννοιες Αναπαράσταση αλγορίθμων Διαγράμματα ροής και δομές επανάληψης Αλγόριθμος σειριακής αναζήτησης Αλγόριθμος αλφαβητικής ταξινόμησης Αναδρομικοί αλγόριθμοι Αλγόριθμος δυαδικής ταξινόμησης Εισαγωγή στην αλγοριθμική πολυπλοκότητα Οι διαφάνειες βασίζονται σε μεγάλο βαθμό σε αυτές που συνοδεύονται με το προτεινόμενο σύγγραμμα, καθώς και στις διαφάνειες προηγούμενων ετών του κ. Κουρκουμπέτη. 1
Αλγόριθμος: Ορισμός Ένας αλγόριθμος είναι ένα διατεταγμένο σύνολο, πεπερασμένων, σαφώς ορισμένων, εκτελέσιμων βημάτων, το οποίο ορίζει μία τερματιζόμενη διαδικασία. Έχουμε ήδη δει αλγορίθμους για: Μετατροπή δεκαδικής αναπάραστασης αριθμού σε δυαδική Ανίχνευση και διόρθωση σφαλμάτων Χρονοδρομολόγηση πολλών διεργασιών από το λειτουργικό σύστημα Τον κύκλο μηχανής μιας CPU: 2
Αλγόριθμος: Ορισμός (2) Διατεταγμένο (ordered) σύνολο βημάτων: που να ξεχωρίζουν Όχι απαραίτητα να εκτελούνται με τη σειρά (π.χ. παράλληλοι αλγόριθμοι για πολλούς επεξεργαστές ή για πολλαπλά threads) Πεπερασμένα (finite) Σαφώς ορισμένα (unambiguous) Eκτελέσιμα βήματα: π.χ. όχι κάτι σαν το οποίο ορίζει μία τερματιζόμενη διαδικασία Αν και ορίζονται και αλγόριθμοι για ατέρμονες διεργασίες, π.χ. Διαίρεση του 1 με το 3 3
Αλγόριθμοι, προγράμματα και γλώσσες είσοδος Αλγόριθμος έξοδος Aλγόριθμοι που τερματίζουν ή δεν τερματίζουν πως να περιγράψουμε έναν αλγόριθμο; φυσική γλώσσα (ελληνικά, αγγλικά) είναι ασαφής «μαζεύετε τριαντάφυλλα όσο σας επιτρέπεται» Γλώσσα προγραμματισμού: εύκολη και περιεκτική έκφραση αλγορίθμων άμεσα κατανοητή από υπολογιστές και ανθρώπους 4
Αλγόριθμοι : επίπεδα αφαίρεσης Ένα πρόβλημα αποτελεί το κίνητρο για την επινόηση ενός αλγόριθμου Ο αλγόριθμος είναι μια διαδικασία επίλυσης του προβλήματος Συνήθως, μία διαδικασία, από πολλές πιθανές Αναπαράσταση: είναι η επαρκής περιγραφή ενός αλγορίθμου μία περιγραφή από πολλές πιθανές Πρόγραμμα (program): είναι μια αναπαράσταση ενός αλγορίθμου Η επίσημη αναπαράσταση, γραμμένη για εκτέλεση από υπόλογιστή Διεργασία (process): η διαδικασία εκτέλεσης ενός προγράμματος (και συνεπώς και του αλγορίθμου) 5
Αρχέτυπα Αρχέτυπα (primitives): Καλά ορισμένα σύνολα από δομικά μπλοκ από τα οποία μπορεί να κατασκευαστούν αναπαραστάσεις αλγορίθμων Μια συλλογή αρχετύπων μαζί με μια συλλογή κανόνων με το πως αυτά μπορούν να συνδυαστούν για να αναπαραστήσουν περίπλοκες ιδέες, συνιστά μια γλώσσα προγραμματισμού Κάθε αρχέτυπο έχει τη δική του σύνταξη (syntax) και σημασιολογία (semantics) Σύνταξη: συμβολική αναπαράσταση Σημασιολογία: Σημασία του αρχέτυπου Τα αρχέτυπα είναι σε πιο υψηλό επίπεδο από αυτό των εντολών της γλώσσας μηχανής (που είδαμε στον Κεφ. 2) 6
Αρχέτυπα ψευδοκώδικα Ψευδοκώδικας (pseudo- code): ένα λιγότερο επίσημο (από την γλώσσα προγραμματισμού) σύστημα από συμβολισμούς το οποίο μπορεί να αναπαραστήσει τις ιδέες που διέπουν έναν αλγόριθμο Ανάθεση: όνομα ß έκφραση name ß expression Επιλογή συνθήκης: αν (συνθήκη) τότε (ενέργεια 1) αλλιώς (ενέργεια 2) if (συνθήκη) then (ενέργεια 1) else (ενέργεια 2) 7
Αρχέτυπα ψευδοκώδικα (2) Επαναλαμβανόμενη εκτέλεση: όσο (συνθήκη) κάνε (ενέργεια) while (συνθήκη) do (ενέργεια) Διαδικασία (procedure): Μπλοκ από εντολές που εκτελούν μια αυτόνομη λειτουργία Λέγεται και υπο- πρόγραμμα (subprogram) υπορουτίνα (subroutine), διαδικασία (procedure), συνάρτηση (function) διαδικασία όνομα procedure name 8
Διαδικασία Η διαδικασία (procedure) πρέπει να είναι γενική και εφαρμόσιμη σε κάθε περίπτωση Π.χ. η περιγραφή μιας διαδικασίας για ταξινόμηση μιας λίστας ονομάτων κατά αλφαβητική σειρά πρέπει να εφαρμόζεται σε οποιαδήποτε λίστα ονομάτων και όχι σε μια συγκεκριμένη μόνο Παράμετροι (parameters): στην προκειμένη περίπτωση η λίστα προς ταξινόμηση Π.χ. Procedure Sort (List) 9
Παραδείγματα στοίχισης Η ανάγνωση ψευδο- κώδικα διευκολύνεται αν κάνουμε καλή στοίχιση και περιγραφή των βρόχων και του τέλος των if, while, 10
Βήματα επίλυσης προβλήματος Βήματα κατά τον Polya (1945) 1. Κατανόηση του προβλήματος. 2. Σχηματισμός (στο νου μας) μιας ιδέας για το πώς μπορεί να λυθεί το πρόβλημα από μία αλγοριθμική διαδικασία. 3. Συγκρότηση του αλγορίθμου και αναπαράσταση του ως πρόγραμμα. 4. Αξιολόγηση του προγράμματος όσον αφορά την ακρίβεια του και τη δυνατότητα να χρησιμοποιηθεί ως εργαλείο για την επίλυση άλλων προβλημάτων. Όχι απαραίτητο (και πολλές φορές όχι αποδοτικό) να τηρείται αυστηρή αλληλουχία στα βήματα αυτά 11
Τεχνικές για το πρώτο βήμα Επίλυση ενός πιο εύκολου, σχετικού προβλήματος: «Χαλαρώνει» κάποιους από τους (πολλούς) περιορισμούς του προβλήματος. Επιλύει πρώτα κάποια επιμέρους τμήματα του προβλήματος - συνθετική μεθοδολογία. Λέγεται και τεχνική από- κάτω- προς- τα- πάνω (bottom- up) Βηματική εκλέπτυνση (step- wise refinement) Δημοφιλής τεχνική επειδή παράγει τμηματικά προγράμματα Απλοποίηση βήματων σε πολλά απλούστερα Λέγεται και τεχνική από πάνω- προς- τα- κάτω (top- down) 12
Βηματική εκλέπτυνση Αλγόριθμος: (1) βράσε νερό φτιάξε στιγμιαίο καφέ (1.1) γέμισε χύτρα (1.1.1) βάλε χύτρα κάτω από βρύση (1.1.2) άνοιξε βρύση (1.2) άναψε το μάτι (1.3) περίμενε να βράσει (1.4) σβήσε το μάτι (1.1.3) περίμενε να γεμίσει η χύτρα (1.1.4) κλείσε βρύση (1.3.1) περίμενε να σφυρίξει η χύτρα (2) βάλε καφέ στο φλιτζάνι (3) πρόσθεσε νερό στο φλιτζάνι (2.1) άνοιξε το δοχείο του καφέ (2.2) πάρε ένα κουταλάκι καφέ (2.3) άδειασε το κουταλάκι στο φλιτζάνι (2.4) κλείσε το δοχείο του καφέ (3.1) βάλε νερό από την χύτρα στο φλιτζάνι μέχρι να γεμίσει (2.1.1) πάρε το δοχείο του καφέ από το ντουλάπι (2.1.2) βγάλε το καπάκι (2.4.1) βάλε το καπάκι στο δοχείο (2.4.2) βαλε το δοχείο στο ντουλάπι 13
Ακολουθία βημάτων για αλγόριθμο 1. βάλε την χύτρα κάτω από βρύση 2. άνοιξε την βρύση εάν δεν υπάρχει νερό; 3. περίμενε να γεμίσει η χύτρα 4. κλείσε την βρύση 5. άναψε το μάτι 6. περίμενε να σφυρίξει η χύτρα 7. σβήσε το μάτι 8. πάρε το δοχείο του καφέ από το ντουλάπι 9. βγάλε το καπάκι 10. πάρε ένα κουταλάκι καφέ 11. άδειασε το κουταλάκι στο φλιτζάνι 12. βάλε το καπάκι στο δοχείο 13. βαλε το δοχείο στο ντουλάπι 14. βάλε νερό από την χύτρα στο φλιτζάνι μέχρι να γεμίσει εάν δεν υπάρχει καφές, να δοκιμάσει το επόμενο δοχείο καφέ; εάν υπάρχουν 1000 δοχεία, πολλά από αυτά άδεια, τι να κάνει; 14
Διαγράμματα ροής Διαγράμματα ροής (flow charts): γραφικός τρόπος περιγραφής δομής αλγορίθμων Ορίζουμε τα βασικά συστατικά διαγραμμάτων ροής - - ακολουθία - - δοκιμή (διάφοροι τύποι) - - επανάληψη (διάφοροι τύποι) ακολουθία βάλε την χύτρα κάτω από βρύση άνοιξε την βρύση περίμενε να γεμίσει η χύτρα κλείσε την βρύση άναψε το μάτι περίμενε να σφυρίξει η χύτρα σβήσε το μάτι πάρε το δοχείο του καφέ από το ντουλάπι δοκιμή (test) συνθήκη = false συνθήκη = false συνθήκη = true 15
Σύνθεση βασικών διαγραμμάτων Αλγόριθμος: σύνθεση βασικών διαγραμμάτων ακολουθία δοκιμή (test) false true ακολουθία ακολουθία 16
Η δομή ελέγχου επιλογής δοκιμή συνθήκης false if condition then P1 true δοκιμή συνθήκης false P1 P2 true P1 if condition then P1 else P2 if x>3 then z:=1 else y:=8 17
Παράδειγμα φωλιασμένων επιλογών δοκιμή συνθήκης false δοκιμή συνθήκης false P2 true true P1 δοκιμή συνθήκης false P1 P2 true P3 P4 if condition then P1 else if condition then P3 else P4 P2 18
Δομές Επανάληψης Βρόχος προ- ελέγχου (pro- test loop): όσο (συνθήκη) κάνε (σώµα βρόχου) while (condition) do () Βρόχος μετα- ελέγχου (post- test loop): επανάλαβε (σώµα βρόχου) µέχρι(συνθήκη) repeat (loop body) until(condition) 19
Δομές επανάληψης (2) Υποθέτει ότι υπάρχει ένα κέρμα στην τσέπη στην αρχή Δεν υποθέτει ότι υπάρχει ένα κέρμα στην τσέπη στην αρχή (και ελέγχει) 20
Η δομή ελέγχου επανάληψης Η δομή βρόχου όσο (while) 21
Άλλο παράδειγμα δομής επανάληψης Η δομή βρόχου επανέλαβε(repeat) 22
Στοιχεία ελέγχου επανάληψης Χρειάζεται προσοχή με τον έλεγχο και την τροποποίηση! 23
Επανάληψη: Αρχέτυπα (εντολές) ψευδοκώδικα Ανάθεση όνομα ß έκφραση Επιλογή συνθήκης αν (συνθήκη) τότε (ενέργεια) Επαναλαμβανόμενη εκτέλεση όσο (συνθήκη) κάνε (ενέργεια) Διαδικασία διαδικασία όνομα (συγκεκριμένο όνομα της μονάδας) 24
Παράδειγμα Διαδικασίας διαδικασία Χαιρετισμός Μετρητής ß 3; όσο (Μετρητής >0) κάνε (τύπωσε το μήνυμα Γεια χαρά και Μετρητήςß Μετρητής- 1) 25
Ο αλγόριθμος της σειριακής αναζήτησης (sequential search) σε ψευδοκώδικα Αρχή: μια λίστα με ονόματα αλφαβητικά ταξινομημένη Στόχος είναι να βρεθεί η ΤιμήΣτόχος (π.χ. Ένα συγκεκριμένο όνομα) στην Λίστα 26
Sequential Search Ερώτηση: Πόσοι έλεγχοι χρειάζονται κατά μέσο όρο για σειριακή αναζήτηση ενός ονόματος σε μια λίστα μήκους n; Στη χειρότερη περίπτωση; 27
Αλγόριθμος Αλφαβητικής ταξινόμησης λίστας Αλγόριθμος Ταξινόμησης με Εισαγωγή (InsertionSort) Ο έλεγχος είναι η πράξη με την μεγαλύτερη δυσκολία, συνεπώς έχει Νόημα να εκφράσουμε την δυσκολία του αλγορίθμου συναρτήσει αυτής της πράξης Αριθμός ελέγχων στην χειρότερη περίπτωση για μια λίστα μήκους n 1+ 2+ 3+! + ( n 1) = 1 n( n 1) 2 = 1 ( n 2 2 n) 28
Ο αλγόριθμος ταξινόμησης με εισαγωγή (insertion sort) σε ψευδοκώδικα διαδικασία Ταξινόμηση (Λίστα) Νß 2 όσο (η τιμή του Ν δεν υπερβαίνει το μήκος της Λίστας) κάνε (επίλεξε την Ν- οστή καταχώρηση της Λίστας ως οριακή καταχώρηση. Μετακίνησε την οριακή καταχώριση σε μία προσωρινή θέση, αφήνοντας ένα κενό στη Λίστα. όσο (υπάρχει κάποιο όνομα επάνω από το κενό, και το όνομα αυτό είναι «μετά αλφαβητικά» από την οριακή καταχώριση) κάνε (μετακίνησε το όνομα που βρίσκεται επάνω από το κενό προς τα κάτω, αφήνοντας ένα κενό από πάνω του) Τοποθέτησε την οριακή καταχώριση στο κενό της Λίστας. Ν ß Ν + 1 ) 29
Insertion Sort 30
Αναδρομή (Recursion) (2) Αναδρομική (recursive) διαδικασία: καλεί τον εαυτό του Μεθοδολογία: εκφράζουμε την διαδικασία με βάση ιδίου τύπου διαδικασίες που λειτουργούν σε απλούστερα προβλήματα, Γνωρίζουμε την απάντηση για το πλέον απλό πρόβλημα factorial(n) = 1*2*3*... (N- 1)*N = N*factorial(N- 1) module factorial(n) if N=1 then answer = 1 else answer = N * factorial(n-1) 3 3 * 2 1 2 * 1 31
Αναδρομικές διαδικασίες Η διαδικασία καλεί τον εαυτό της Κάθε αντίτυπο της διαδικασίας καλεί τον εαυτό της (με διαφορετικές παραμέτρους) Π.χ. Η διαδικασία για το n! (n παραγοντικό) Κάθε κλήση της διαδικασίας λέγεται ενεργοποίηση (activation) Σε μια χρονική στιγμή μόνο ένα αντίτυπο της διαδικασίας εκτελείται, τα υπόλοιπα (που έχουν κληθεί πριν) περιμένουν το αποτέλεσμα αυτού του αντιτύπου Κάθε αναδρομική διεργασία περιέχει συνθήκη τερματισμού - λέγεται περίπτωση βάσης (base case) ή εκφυλισμένη περίπτωση (degenerate case) Αν η συνθήκη δεν ικανοποιείται, καλείται και πάλι η διαδικασία με άλλες παραμέτρους, που πλησιάζουν στην συνθήκη τερματισμού module factorial(n) if N=1 then answer = 1 else answer = N * factorial(n-1) 32
Εφαρμογή Αναδρομής:Δυαδική Αναζήτηση για αναζήτηση της καταχώρισης Κώστας σε μια ταξινομημένη λίστα Είσοδος: Μια λίστα που είναι ταξινομημένη αλφαβητικά 33
Δυαδική αναζήτηση σε ταξινομημένη λίστα Αριθμός βημάτων το πολύ (δηλ. στη χειρότερη περίπτωση ) Log 2 n = πόσες φορές διαιρείται το n με το 2 2 logn = n 34
Ο αλγόριθμος της δυαδικής αναζήτησης σε ψευδοκώδικα Διαδικασία Αναζήτηση (Λίστα, ΤιμήΣτόχος) αν ( Η Λίστα είναι άδεια) τότε (Ανάφερε ότι η αναζήτηση απέτυχε) αλλιώς [Επίλεξε τη μεσαία καταχώριση της Λίστας ως την ΚαταχώρισηΠροςΈλεγχο. Εκτέλεσε το παρακάτω μπλοκ εντολών που αντιστοιχεί στην κατάλληλη περίπτωση. περίπτωση 1: ΤιμήΣτόχος=ΚαταχώρισηΠροςΈλεγχο (Ανέφερε ότι η αναζήτηση είναι επιτυχής.) περίπτωση 2: ΤιμήΣτόχος<ΚαταχώρισηΠροςΈλεγχο (Εφάρμοσε τη διαδικασία Αναζήτηση για να δεις αν η ΤιμήΣτόχος βρίσκεται στο τμήμα της λίστα που προηγείται της ΚαταχώρισηΠροςΈλεγχο, και ανέφερε το αποτέλεσμα αυτής της αναζήτησης.) περίπτωση3: ΤιμήΣτόχος> ΚαταχώρισηΠροςΈλεγχο (Εφάρμοσε τη διαδικασία Αναζήτηση για να δεις αν η ΤιμήΣτόχος βρίσκεται στο τμήμα της λίστα μετά την ΚαταχώρισηΠροςΈλεγχο, και ανέφερε το αποτέλεσμα αυτής της αναζήτησης.) ] τέλος αν 35
Ο αλγόριθμος της Δυαδικής Αναζήτησης Αναζήτηση του Β στην λίστα Α Β Γ Δ Ε Ζ Η 36
Ο αλγόριθμος της Δυαδικής Αναζήτησης (2) Αναζήτηση του Δ στην λίστα Α Γ Ε Ζ Η 37
Ο αλγόριθμος της Δυαδικής Αναζήτησης (3) Αναζήτηση του Δ στην λίστα Α Γ Ε Ζ Η 38
Δυαδική Αναζήτηση (Τερματισμός) Αρχικοποίηση με μια ταξινομημένη λίστα Αν βρεθεί η Τιμή- Στόχος ή αν προκύψει άδεια λίστα, ο αλγόριθμος τερματίζει Διαφορετικά, καλείται ένα αντίτυπο της διαδικασίας με το μισό της λίστας (άνω ή κάτω μισό) Σίγουρος τερματισμός: εφόσον η λίστα είναι πεπερασμένη και κάθε φορά η διαδικασία καλείται για το μισό της λίστας της προηγούμενης κλήσης, κάποια στιγμή ο αλγόριθμος θα τελειώσει Θα βρεθεί η Τιμή- Στόχος ή θα προκύψει άδεια λίστα 39
Ψευδοκώδικας Δυαδικής Αναζήτησης για έναν αριθμό σε μια ταξινομημένη λίστα αριθμών low = 0; high = N- 1; BinarySearch(A[0..N- 1], value, low, high) { if (high < low) return - 1 // not found mid = (low + high) / 2 if (A[mid] > value) return BinarySearch(A, value, low, mid- 1) else if (A[mid] < value) return BinarySearch(A, value, mid+1, high) else return mid // found } 40
Αποδοτικότητα Αλγορίθμων (Παράδειγμα) Λίστα 30,000 ονομάτων φοιτητών Ακολουθιακή (sequential) αναζήτηση: κατά μέσο όρο χρειάζεται να περάσει 15,000 ονόματα 10msec για να ελέγξει ένα όνομα Μέσος χρόνος για έλεγχο: 150 sec Δυαδική (binary) αναζήτηση: χρειάζεται να ελέγξει το πολύ 15 ονόματα Όσες φορές (το πολύ) μπορεί να κοπεί μια λίστα 30,000 ονομάτων στην μέση 10msec για να ελέγξει ένα όνομα Χρόνος για έλεγχο (στη χειρότερη περίπτωση): 0,15 sec 41
Αποδοτικότητα Μετράται ως πλήθος των εκτελούμενων εντολών του αλγορίθμου Συνήθως θεωρούμε τις πιο σημαντικές (από άποψη υπολογιστικού φόρτου) εντολές Αυτές κυρίως επιδρούν στο χρόνο που απαιτείται για εκτέλεση ενός αλγορίθμου Ενδιαφερόμαστε για μια λίστα οποιουδήποτε μήκους n Καλύτερη (best- case), χειρότερη (worst- case) και μέση (average- case) περίπτωση. Είδαμε την μέση περίπτωση για την ακολουθιακή αναζήτηση: n/2 έλεγχοι για λίστα μήκους n (χειρότερη περίπτωση είναι n έλεγχοι) χειρότερη περίπτωση log n για την δυαδική αναζήτηση για λίστα μήκους n Ο συμβολισμός Θ προσδιορίζει την αποδοτικότητα των αλγορίθμων Παράδειγμα η ταξινόμηση με εισαγωγή αναπαριστάται με Θ(n 2 ) Θ: σύμβολο Landau 42
Ανάλυση αλγορίθμου ταξινόμησης με εισαγωγή Επικεντρωνόμαστε στο πόσες συγκρίσεις χρειάζονται στον αλγόριθμο Επιλογή μιας καταχώρησης σαν οριακή καταχώρηση (pivot): 2,3,...n Σύγκριση του pivot με όλα τα προηγούμενα στοιχεία Καλύτερη περίπτωση: Η λίστα είναι ταξινομημένη ήδη αλφαβητικά Οπότε χρειάζεται σύγκριση του pivot με ένα στοιχείο κάθε φορά n- 1 συγκρίσεις Χειρότερη περίπτωση: Η λίστα είναι σε ανάποδη αλφαβητική σειρά Χρειάζεται σύγκριση του pivot (που είναι σε μια θέση k) με όλα τα προηγούμενα στοιχεία 1,2,...k- 1 Συνολικά 1+2+3+...+ (n- 1) συγκρίσεις = (1/2)*(n 2 - n) συγκρίσεις Μέση περίπτωση: (1/4)*(n 2-1) συγκρίσεις 43
Σενάριο χειρότερης περίπτωσης για ταξινόμηση με εισαγωγή Χειρότερη περίπτωση: Η λίστα είναι σε ανάποδη αλφαβητική σειρά Χρειάζεται σύγκριση του pivot (που είναι σε μια θέση k) με όλα τα προηγούμενα στοιχεία 1,2,...k- 1 Συνολικά 1+2+3+...+ (n- 1) συγκρίσεις = (1/2)*(n 2 - n) συγκρίσεις 44
Ορισμός ταχύτητας αύξησης μιας συνάρτησης: Σύμβολα Landau f ( n) O( g( n)): f έχει την g ασυμπτωτικό άνω φράγμα όταν n, f ( n) g( n) k η f αυξάνεται το πολύ όπως η g f ( n) Θ( g( n)): f έχει την g ασυμπτωτικό άνω και κάτω φράγμα η f αυξάνεται σαν τη g, άρα είναι στην οικογένεια Θ(g) όταν n, g( n) k f( n) g( n) 1 k 2 2n 2 + 10n 5 Θ( n 2 ),2nlogn + 10n 5 Θ( nlogn) 45
Γράφημα της χειρότερης περίπτωσης του αλγορίθμου ταξινόμησης με εισαγωγή f(n) = (1/2)*(n 2 - n) n Ο αλγόριθμος ταξινόμησης με εισαγωγή ανήκει στην κλάση αλγορίθμων Θ(n 2 ) 46
Γράφημα της ανάλυσης χειρότερης περίπτωσης του αλγορίθμου δυαδικής αναζήτησης f(n) = log(n) Αύξηση χρόνου με όλο Και μικρότερα βήματα n Ο αλγόριθμος δυαδικής αναζήτησης ανήκει στην κλάση αλγορίθμων O (logn) 47