ΚΕΦΑΛΑΙΟ 5: Αλγόριθµοι 5.1 Η έννοια του αλγορίθµου 5.2 Αναπαράσταση αλγορίθµων 5.3 Επινόηση αλγορίθµων 5.4 Δοµές επανάληψης 5.5 Αναδροµικές δοµές 1
Αλγόριθµος: Ορισµός Ένας αλγόριθµος είναι ένα διατεταγµένο σύνολο, πεπερασµένων, σαφώς ορισµένων, εκτελέσιµων βηµάτων, το οποίο ορίζει µία τερµατιζόµενη διαδικασία. 2
Αλγόριθµοι, προγράµµατα και γλώσσες είσοδος Αλγόριθµος έξοδος - αλγόριθµοι τερµατίζουν ή δεν τερµατίζουν - πως να περιγράψουµε έναν αλγόριθµο; - φυσική γλώσσα (ελληνικά, αγγλικά) είναι ασαφής «µαζεύετε τριαντάφυλλα όσο σας επιτρέπεται» - γλώσσα προγραµµατισµού: - εύκολη και περιεκτική έκφραση αλγορίθµων - άµεσα κατανοητή από υπολογιστές και ανθρώπους - περιορισµός λαθών 3
Αλγόριθµοι : επίπεδα αφαίρεσης Ένα πρόβληµα αποτελεί το κίνητρο για την επινόηση ενός αλγόριθµου. Ο αλγόριθµος είναι µια διαδικασία επίλυσης του προβλήµατος αυτού. Συνήθως µία διαδικασία από πολλές πιθανές Η αναπαράσταση είναι η επαρκής περιγραφή ενός αλγορίθµου για τη µετάδοση του στο επιθυµητό κοινό. Πάντα µία περιγραφή από πολλές πιθανές. 4
Βήµατα επίλυσης προβλήµατος 1. Κατανόηση του προβλήµατος. 2. Σχηµατισµός (στο νου µας) µιας ιδέας για το πώς µπορεί να λυθεί το πρόβληµα από µία αλγοριθµική διαδικασία. 3. Συγκρότηση του αλγορίθµου και αναπαράσταση του ως πρόγραµµα. 4. Αξιολόγηση του προγράµµατος όσον αφορά την ακρίβεια του και τη δυνατότητα να χρησιµοποιηθεί ως εργαλείο για την επίλυση άλλων προβληµάτων. 5
Τεχνικές για το πρώτο βήµα Επίλυση του προβλήµατος προς τα πίσω. Επίλυση ενός πιο εύκολου, σχετικού προβλήµατος: «Χαλαρώνει» κάποιους από τους ασφυκτικούς περιορισµούς του προβλήµατος. Επιλύει πρώτα κάποια επιµέρους τµήµατα του προβλήµατος - συνθετική µεθοδολογία. Η βηµατική εκλέπτυνση είναι µία αναλυτική µεθοδολογία. Δηµοφιλής τεχνική επειδή παράγει τµηµατικά προγράµµατα. 6
Αλγόριθµος: (1) βράσε νερό Βηµατική εκλέπτυνση φτιάξε στιγµιαίο καφέ (1.1) γέµισε χύτρα (1.1.1) βάλε χύτρα κάτω από βρύση (1.1.2) άνοιξε βρύση (1.1.3) περίµενε να γεµίσει η χύτρα (1.2) άναψε το µάτι (1.1.4) κλείσε βρύση (1.3) περίµενε να βράσει (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) βαλε το δοχείο στο ντουλάπι 7
Ακολουθία βηµάτων 1. βάλε την χύτρα κάτω από βρύση 2. άνοιξε την βρύση εάν δεν υπάρχει νερό; 3. περίµενε να γεµίσει η χύτρα 4. κλείσε την βρύση 5. άναψε το µάτι 6. περίµενε να σφυρίξει η χύτρα 7. σβήσε το µάτι 8. πάρε το δοχείο του καφέ από το ντουλάπι 9. βγάλε το καπάκι 10. πάρε ένα κουταλάκι καφέ 11. άδειασε το κουταλάκι στο φλιτζάνι 12. βάλε το καπάκι στο δοχείο 13. βαλε το δοχείο στο ντουλάπι 14. βάλε νερό από την χύτρα στο φλιτζάνι µέχρι να γεµίσει εάν δεν υπάρχει καφές, να δοκιµάσει το επόµενο δοχείο καφέ; εάν υπάρχουν 1000 δοχεία, πολλά από αυτά άδεια, τι να κάνει; 8
Διαγράµµατα ροής Διαγράµµατα ροής: γραφικός τρόπος περιγραφής δοµής αλγορίθµων Ορίζουµε τα βασικά συστατικά διαγραµµάτων ροής - - ακολουθία - - δοκιµή (διάφοροι τύποι) - - επανάληψη (διάφοροι τύποι) βάλε την χύτρα κάτω από βρύση άνοιξε την βρύση περίµενε να γεµίσει η χύτρα κλείσε την βρύση άναψε το µάτι περίµενε να σφυρίξει η χύτρα σβήσε το µάτι πάρε το δοχείο του καφέ από το ντουλάπι ακολουθία δοκιµή (test) συνθήκη = false συνθήκη = false συνθήκη = true 9
Σύνθεση βασικών διαγραµµάτων Αλγόριθµος: σύνθεση βασικών διαγραµµάτων ακολουθία δοκιµή (test) false true ακολουθία ακολουθία 10
Η δοµή ελέγχου επιλογής δοκιµή συνθήκης 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 11
Παράδειγµα φωλιασµένων επιλογών δοκιµή συνθήκης false δοκιµή συνθήκης false P2 true true δοκιµή συνθήκης false P1 P1 P2 true P3 P4 if condition then P1 else if condition then P3 else P4 P2 12
Η δοµή ελέγχου επανάληψης Η δοµή βρόχου όσο (while) 13
Άλλο παράδειγµα δοµής επανάληψης Η δοµή βρόχου επανέλαβε (repeat) 14
Αρχέτυπα (εντολές) ψευδοκώδικα Ανάθεση όνοµα ß έκφραση Επιλογή συνθήκης αν (συνθήκη) τότε (ενέργεια) Επαναλαµβανόµενη εκτέλεση όσο (συνθήκη) κάνε (ενέργεια) Διαδικασία διαδικασία όνοµα (συγκεκριµένο όνοµα της µονάδας) 15
Η διαδικασία Χαιρετισµός σε ψευδοκώδικα διαδικασία Χαιρετισµός Μετρητής ß 3; όσο (Μετρητής >0) κάνε (τύπωσε το µήνυµα Γεια χαρά και Μετρητήςß Μετρητής-1) 16
Αλφαβητική ταξινόµηση της λίστας Fred, Alex, Diana, Byron, Carol Ορίζουµε βήµα = σύγκριση Αριθµός βηµάτων χειρότερης περίτπωσης 1 + 2 + 3 + + (n 1) = 1 2 (n 2 n) Βασικές έννοιες: πρόβληµα, µέγεθος προβλήµατος, Πολυπλοκότητα αλγορίθµου 17
Εφαρµογή της ταξινόµησης παρεµβολής σε ένα σενάριο χειρότερης περίπτωσης 18
Ο αλγόριθµος ταξινόµησης παρεµβολής σε ψευδοκώδικα διαδικασία Ταξινόµηση (Λίστα) Νß 2 όσο (η τιµή του Ν δεν υπερβαίνει το µήκος της Λίστας) κάνε (επίλεξε την Ν-οστή καταχώρηση της Λίστας ως οριακή καταχώρηση. Μετακίνησε την οριακή καταχώριση σε µία προσωρινή θέση, αφήνοντας ένα κενό στη Λίστα. όσο (υπάρχει κάποιο όνοµα επάνω από το κενό, και το όνοµα αυτό είναι µεγαλύτερο από την οριακή καταχώριση) κάνε (µετακίνησε το όνοµα που βρίσκεται επάνω από το κενό προς τα κάτω, αφήνοντας ένα κενό από πάνω του) Τοποθέτησε την οριακή καταχώριση στο κενό της Λίστας. Ν ß Ν + 1 ) 19
Αναδροµή Αναδροµικός αλγόριθµος: καλεί τον εαυτό του Μεθοδολογία: εκφράζουµε την διαδικασία µε βάση ιδίου τύπου διαδικασίες που λειτουργούν σε απλούστερα προβλήµατα, γνωρίζουµε την απάντηση για το πλέον απλό πρόβληµα 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 2 1 3 * 2 * 1 20
Παράδειγµα: οι πύργοι του Hanoi Πρόβληµα: να µεταφέρουµε όλους τους δίσκους σε έναν άλλο πάσσαλο κουνώντας ένα δίσκο τη φορά, χωρίς ποτέ ένας δίσκος να τοποθετηθεί πάνω από µικρότερους δίσκους. 64 δίσκοι a b c Ψάχνουµε για αναδροµική σχέση: Πρόβληµα Α: µετάφερε 64 δίσκους από το a στο b (χωρίς να παραβείς τους περιορισµούς) Πρόβληµα Β: µετάφερε 63 δίσκους από το a στο c, µετάφερε τον τελευταίο δίσκο από το a στο b, µετάφερε 63 δίσκους από το c στο b. 21
Παράδειγµα: οι πύργοι του Hanoi (2) 64 δίσκοι a b c πηγή προορισµός βοηθητικός µεταφορά_πύργου (Ν, πηγή, προορισµός, βοηθητικός) module µεταφορά_πύργου (Ν, a, b, c) if N=1 then µετακίνησε 1 δίσκο από a σε b else { µεταφορά_πύργου (Ν-1, a, c, b); µετακίνησε 1 δίσκο από a σε b; µεταφορά_πύργου (Ν-1, c, b, a) } 22
Παράδειγµα: οι πύργοι του Hanoi (3) module µεταφορά_πύργου (Ν, a, b, c) if N=1 then µετακίνησε τον δίσκο από πηγή σε προορισµό else { µεταφορά_πύργου (Ν-1, a, c, b); µετακίνησε 1 δίσκο από πηγή σε προορισµό; µεταφορά_πύργου (Ν-1, c, b, a) } Δ3 Δ2 Δ1 µ_π (3, a, b, c) µ_π (2, a, c, b) Δ2,a,c Δ1,a,b µ_π (2, c, b, a) Δ2,c,b µ_π (1, a, b, c) µ_π (1, b, c, a) µ_π (1, c, a, b) µ_π (1, a, b, c) Δ1,a,b Δ1,b,c Δ1,c,a Δ1,a,b 23
Ο αλγόριθµος της δυαδικής αναζήτησης σε ψευδοκώδικα Διαδικασία Αναζήτηση (Λίστα, ΤιµήΣτόχος) αν ( Η Λίστα είναι άδεια) τότε (Ανάφερε ότι η αναζήτηση απέτυχε) αλλιώς [Επίλεξε τη µεσαία καταχώριση της Λίστας ως την ΚαταχώρισηΠροςΈλεγχο. Εκτέλεσε το παρακάτω µπλοκ εντολών που αντιστοιχεί στην κατάλληλη περίπτωση. περίπτωση 1: ΤιµήΣτόχος=ΚαταχώρισηΠροςΈλεγχο (Ανέφερε ότι η αναζήτηση είναι επιτυχής.) περίπτωση 2: ΤιµήΣτόχος<ΚαταχώρισηΠροςΈλεγχο (Εφάρµοσε τη διαδικασία Αναζήτηση για να δεις αν η ΤιµήΣτόχος βρίσκεται στο τµήµα της λίστα που προηγείται της ΚαταχώρισηΠροςΈλεγχο, και ανέφερε το αποτέλεσµα αυτής της αναζήτησης.) περίπτωση3: ΤιµήΣτόχος> ΚαταχώρισηΠροςΈλεγχο (Εφάρµοσε τη διαδικασία Αναζήτηση για να δεις αν η ΤιµήΣτόχος βρίσκεται στο τµήµα της λίστα µετά την ΚαταχώρισηΠροςΈλεγχο, και ανέφερε το αποτέλεσµα αυτής της αναζήτησης.) ] τέλος αν 24
Binary search 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 } 25
Δυαδική αναζήτηση 26
Εφαρµογή της δυαδικής αναζήτησης για την καταχώριση Κώστας σε µία ταξινοµηµένη λίστα Αριθµός βηµάτων χειρότερης περίτπωσης Log 2 n = πόσες φορές διαιρείται το n µε το 2 2 log n = n 27
Αποδοτικότητα Λογισµικού Μετριέται ως το πλήθος των εκτελούµενων εντολών. Ο συµβολισµός µε Θ προσδιορίζει την αποδοτικότητα των αλγορίθµων Παράδειγµα η ταξινόµηση παρεµβολής αναπαριστάται µε Θ(n 2 ) Καλύτερη, χειρότερη και µέση περίπτωση. 28
Ορισµός ταχύτητας αύξησης µιας συνάρτησης f ( n) O( g( n)): f έχει την g ασυµπτωτικό άνω φράγµα όταν n, f ( n) g( n) k η f αυξάνεται το πολύ σαν την g n 2,5 O(n 3 ), 2n 2 +10n 5 O(n 2 ), 2 n + 2n 2 O(2 n ) f ( n) Θ( g( n)): f έχει την g ασυµπτωτικό άνω και κάτω φράγµα όταν n, η f αυξάνεται σαν την g, άρα είναι στην οικογένεια Θ(g) g( n) k 1 f( n) g( n) k 2n 2 +10n 5 Θ(n 2 ), 2nlogn +10n 5 Θ(n logn) 2 29
Γράφηµα της ανάλυσης χειρότερης περίπτωσης του αλγορίθµου ταξινόµησης παρεµβολής (ρυθµός αύξησης) 30
Γράφηµα της ανάλυσης χειρότερης περίπτωσης του αλγορίθµου δυαδικής αναζήτησης (ρυθµός αύξησης) 31