Τµήµα Πανεπιστήµιο Πληροφορικής Ιωαννίνων ΟΜΕΣ Ε ΟΜΕΝΩΝ
ΕΝΟΤΗΤΑ 1 ΕΙΣΑΓΩΓΗ 1
εδοµένα Σύνολο από πληροφορίες που πρέπει να αποθηκευτούν σε έναν υπολογιστή Υπολογιστικό Μοντέλο ένας επεξεργαστής και µεγάλος χώρος µνήµης κάθε θέση µνήµης έχει µια αριθµητική διεύθυνση (διεύθυνση µνήµης) η µνήµη είναι τυχαίας προσπέλασης, δηλ., η πρόσβαση σε οποιαδήποτε θέση µνήµης (ανεξάρτητα από τη διεύθυνσή της) γίνεται µε την ίδια ταχύτητα 1
Τύποι εδοµένων Η πληροφορία κωδικοποιείται µε bits. Οι τύποι δεδοµένων µάς επιτρέπουν να ερµηνεύσουµε σωστά τα bits. Τύποι εδοµένων του υλικού αριθµοί, χαρακτήρες, στο υλικό Ιδεατοί Τύποι εδοµένων τύποι δεδοµένων σε επίπεδο γλώσσας προγραµµατισµού π.χ., boolean, packed array, string Αφηρηµένοι Τύποι εδοµένων τύποι δεδοµένων που ορίζονται από τον προγραµµατιστή (ανώτερου επιπέδου) Αντικειµενοστρεφής Προγραµµατισµός 2
Αφηρηµένος Τύπος εδοµένων αποτελείται από δύο µέρη: ένα ή περισσότερα πεδία ένα σύνολο λειτουργιών πάνω σε αυτά τα πεδία Παράδειγµα Αφηρηµένος τύπος: Σύνολο µε στοιχεία κάποιου τύπου (έστω key) Πεδία συλλογή στοιχείων τύπου key πλήθος στοιχείων συλλογής Λειτουργίες εισαγωγή στοιχείου (τύπου key) διαγραφή στοιχείου πληθάριθµος συνόλου ανήκει (στοιχείο σε σύνολο) ένωση συνόλων τοµή συνόλων 3
οµή εδοµένων καθορίζει τον τρόπο αποθήκευσης και επεξεργασίας των δεδοµένων Άρα, µια δοµή δεδοµένων περιλαµβάνει: ένα σύνολο αποθηκευµένων δεδοµένων µια αναπαράσταση της δοµής σε χαµηλότερο φυσικό επίπεδο ένα σύνολο από λειτουργίες που µπορούν να εκτελεστούν ένα σύνολο από αλγορίθµους, έναν για κάθε λειτουργία Βασικές λειτουργίες Προσπέλαση Εισαγωγή ιαγραφή Αναζήτηση Ταξινόµηση Αντιγραφή Συνένωση ιαχωρισµός Ποικίλες οµές εδοµένων πίνακες, λίστες, δέντρα, σωροί, γράφοι π.χ., τηλεφωνικός κατάλογος 4
Αλγόριθµοι Abu Ja far Mohammed ibn Musa al Kowarizmi (825 µ.χ.) Αλγόριθµος είναι ένα σύνολο εντολών οι οποίες είναι πεπερασµένες στον αριθµό, είναι αυστηρά καθορισµένες και εκτελέσιµες σε πεπερασµένο χρόνο, επιλύουν το πρόβληµα που µελετάµε. Άρα, ένας αλγόριθµος πρέπει να είναι σαφώς καθορισµένος να ολοκληρώνεται σε πεπερασµένο χρόνο να είναι εκτελέσιµος και αποτελεσµατικός Επίσης, ένας αλγόριθµος χαρακτηρίζεται από την είσοδό του (input) δεδοµένα προς επεξεργασία την έξοδό του (output) Πρόγραµµα αποτελέσµατα του αλγορίθµου υλοποίηση αλγορίθµου σε κάποια γλώσσα προγραµµατισµού 5
Οι αλγόριθµοι µπορούν να περιγραφούν σε φυσική γλώσσα µε διαγράµµατα ροής µε ψευδο-κώδικα µε κώδικα σε κάποια γλώσσα προγραµ- µατισµού Wirth: «Αλγόριθµοι + οµές εδοµένων = Προγράµµατα» Niklaus Emil Wirth (ηµ.γεν. 15 Φεβρουαρίου 1934): Ελβετός επιστήµονας της πληροφορικής, γνωστός κυρίως από τη σχεδίαση διαφόρων γλωσσών προγραµµατισµού, όπως π.χ. η Pascal, και από την πρωτοποριακή εργασία του στην τεχνολογία λογισµικού. Το 1984 του απονεµήθηκε το Turing Award για την ανάπτυξη πρωτοποριακών γλωσσών προγραµµατισµού. 6
Παράδειγµα 1: Αναζήτηση ενός στοιχείου x σε έναν ταξινοµηµένο πίνακα Α[1..n] Αλγόριθµος 1 Ξεκινώντας από το 1ο στοιχείο του πίνακα Α, έλεγξε κάθε στοιχείο του Α εάν είναι ίσο µε x µέχρι ή να βρεθεί το x ή να εξεταστούν όλα τα στοιχεία Αλγόριθµος 2 Ξεκινώντας από το 1ο στοιχείο του πίνακα Α, έλεγξε κάθε στοιχείο του Α εάν είναι ίσο µε x µέχρι ή να βρεθεί το x ή να βρεθεί κάποιο στοιχείο > x ή να εξεταστούν όλα τα στοιχεία Αλγόριθµος 3 b_search(x,1,n) b_search(x, L, R) /* υαδική Αναζήτηση*/ Αν L > R return( -1 ); /* δεν βρέθηκε */ I = (L+R)/2 ; t A[ I ]; Αν t = x return( I ); /* x = Α[Ι] */ Αν x < t /* επανάλαβε στο 1ο µισό */ return(b_search(x, L, I-1) ); Αν x > t /* επανάλαβε στο 2ο µισό */ return(b_search(x, I+1, R) ); 7
Παράδειγµα 2: Ύψωση ενός αριθµού x σε µια ακέραια δύναµη n > 0 Αλγόριθµος power1 (ψευδο-κώδικας) double power1(double x, int n) int j = 0; double y = 1; while (j < n) y = y*x; j = j+1; return y; Υλοποίηση του Αλγ. power1 στη γλώσσα C double power1(double x, int n) { int j; double y = 1.0; for (j = n; --j >= 0; ) y = y*x; } return y; 8
Κριτήρια Επιλογής Αλγορίθµων ταχύτητα απαιτούµενος χώρος µνήµης ευκολία προγραµµατισµού γενικότητα Η αποδοτικότητα ενός αλγόριθµου καθορίζεται κυρίως από την ταχύτητα και τον απαιτούµενο χώρο µνήµης. Είναι η Power1 ο πιο αποδοτικός αλγόριθµος για το πρόβληµα µας? Αλγόριθµος power2 double power2(double x, int n) double y; 1. if (n == 1) return x; 2. y = power2(x, n/2 ); 3. if n είναι άρτιος αριθµός 4. return y*y; 5. else /* περιττός αριθµός */ 6. return x*y*y; 9
Μαθηµατικό Υπόβαθρο Μονοτονία Συναρτήσεων Ακέραια Μέρη πραγµατικών αριθµών x, x Πολυώνυµα Πολυωνυµικές Συναρτήσεις f(x) = a n x n + a n-1 x n-1 + + a 1 x + a 0 Λογάριθµοι & Εκθέτες lg n = log 2 n ln n = log e n lg k n = (lg n) k lg lg n = lg(lg n) Αλλαγή βάσης: log a x = (log a b) (log b x) Παραγοντικά n! Άθροισµα όρων γεωµετρικής ή αριθµητικής προόδου 10
Ορθότητα Αλγορίθµων Χρήσιµο εργαλείο: Μαθηµατική Επαγωγή Παράδειγµα1 (Βασική Μέθοδος Επαγωγής) Ορθότητα Αλγορίθµου Power1 double power1(double x, int n) int j = 0; double y = 1; while (j < n) y = y*x; j = j+1; return y; Επαγωγή στο πλήθος επαναλήψεων του βρόχου. Αρκεί να δείξουµε ότι y k = x k όπου y k ισούται µε την τιµή της µεταβλητής y κατά την ολοκλήρωση της k-οστής επανάληψης του βρόχου (k 1). 11
Βάση επαγωγής k = 1. Αρχικά, y = 1 και η επανάληψη του βρόχου δίνει y 1 = y*x = x 1, όπως θέλουµε. Επαγωγική Υπόθεση Έστω ότι για κάποιο t (t 1), y t = x t. Επαγωγικό Βήµα Θα δείξουµε την πρόταση για k = t+1 δηλαδή, ότι: y t+1 = x t+1. Από αλγόριθµο: Aπό επαγωγική υπόθεση: y t+1 = y t * x y t = x t Άρα, y t+1 = x t+1, όπως θέλουµε. Άρα y k = x k για κάθε k 1. 12
Παράδειγµα 2 (Ισχυρή Εκδοχή Επαγωγής) Αιγυπτιακός Πολλαπλασιασµός Έστω: { 0, αν y = 0 m(x,y)= m(x+x, y/2), αν y άρτιος & y 0 x + m(x, y-1), διαφορετικά Θα δείξουµε ότι m(x,y) = x*y, ακέραιο x,y 0 Απόδειξη: Επαγωγή στο y 0. Βάση της επαγωγής Αν y = 0, m(x,y) = 0, αλλά και x*y = 0. Ισχύει. Επαγωγική Υπόθεση Υποθέτουµε ότι m(x,y) = x*y, y: 0 y t. Επαγωγικό Βήµα Θα δείξουµε ότι m(x,t+1) = x*(t+1). t+1 περιττός: m(x,t+1) = x + m(x,(t+1)-1). Eπαγ. Υπόθ. (t t): m(x,t) = x*t Άρα: m(x,t+1) = x + x*t = x*(t+1). t+1 άρτιος: m(x,t+1) = m(x+x, (t+1)/2). Eπαγ.Υπόθ.((t+1)/2 t): m(x+x,(t+1)/2) = (x+x)*(t+1)/2 Άρα: m(x,t+1) = (x+x) * (t+1)/2 = x*(t+1). Άρα: m(x,y) = x*y, ακέραιο x, y 0 13
Ανάλυση Αλγορίθµων Μας ενδιαφέρει να εκτιµηθεί ο χρόνος εκτέλεσης δηλ., το πλήθος βασικών βηµάτων/εντολών που εκτελούνται πολυπλοκότητα χρόνου ο απαιτούµενος χώρος µνήµης πολυπλοκότητα χώρου Εµπειρικός τρόπος µέτρησης της επίδοσης Θετικά : απλότητα Αρνητικά : αφορά το συγκεκριµένο σύνολο δεδοµένων στο οποίο εφαρµόζεται ο αλγόριθµος ο χρόνος εκτέλεσης εξαρτάται από το υλικό, τη γλώσσα προγραµµατισµού και τον µεταφραστή, αλλά και από το πόσο ικανός είναι ο προγραµµατιστής 14
Θεωρητικός τρόπος µέτρησης της επίδοσης εκφράζεται ως συνάρτηση του µεγέθους του προβλήµατος Παράδειγµα: Σε ένα πρόβληµα αναζήτησης ενός αριθµού x σε έναν πίνακα, το µέγεθος του προβλήµατος είναι: 1 + το πλήθος των στοιχείων του πίνακα Η πολυπλοκότητα χρόνου/χώρου επικεντρώνεται στην τάξη µεγέθους (αγνοώντας σταθερούς συντελεστές). στη χειρότερη περίπτωση (worst case) ο µέγιστος χρόνος εκτέλεσης για κάθε είσοδο µεγέθους n (και είναι συνάρτηση του n) στη µέση περίπτωση (average case) 15
Ανάλυση Αλγορίθµων Σειριακή Αναζήτηση σε Πίνακα Είσοδος: αριθµός x και ένας πίνακας Α[0..n-1] Έξοδος: η θέση του x στον πίνακα A, αν το x βρίσκεται στον πίνακα A, και 1 διαφορετικά. int s_search(double x, double A[n]) { int i; 1. i = 0; 2. while (i < n) 3. if (A[i] == x) 4. break; 5. else i = i+1; 6. if (i < n) 7. return i; /* το x βρίσκεται στο A[i] */ 8. return 1; /* το x δεν βρέθηκε */ } Ποιος είναι ο καλύτερος χρόνος εκτέλεσης; Ποιος είναι ο χειρότερος χρόνος εκτέλεσης; 16
Τάξη Πολυπλοκότητας Χρόνου Μας ενδιαφέρει µόνο ο όρος µέγιστης τάξης στη συνάρτηση της πολυπλοκότητας χρόνου: Από το άθροισµα an+b µας ενδιαφέρει µόνο ο κυρίαρχος όρος an, αφού ο άλλος όρος δεν είναι σηµαντικός για µεγάλες τιµές του n. Αγνοούµε επίσης τον συντελεστή a, αφού οι σταθεροί παράγοντες είναι λιγότερο σηµαντικοί για µεγάλες τιµές του n. Συνεπώς: Η πολυπλοκότητα χρόνου της s_search() είναι γραµµικής τάξης (Ο(n)). Η µελέτη της πολυπλοκότητας για πολύ µεγάλα n (όριο συνάρτησης πολυπλοκότητας όταν το n τείνει στο άπειρο) ονοµάζεται ασυµπτωτική µελέτη. Συνήθως, ένας αλγόριθµος που είναι ασυµπτωτικά ο πιο αποτελεσµατικός, είναι η καλύτερη επιλογή για όλες εκτός από πολύ µικρές εισόδους. 17
Ανάλυση Αλγορίθµων Συµβολισµός Ο Έστω f(n) και g(n) δύο συναρτήσεις. Η f(n) είναι Ο(g(n)), ή f(n) = O(g(n)), αν υπάρχουν θετική πραγµατική σταθερά c και ακέραιος n 0 0: για κάθε n n 0 να ισχύει: 0 f(n) cg(n) Παράδειγµα Έστω f(n) = an 2 +bn, όπου a,b θετικές σταθερές. Ισχύει f(n) = O(n 2 ); Ψάχνουµε για c & n 0 τ.ω. an 2 + bn cn 2, για κάθε n n 0 cn 2 an 2 + bn (c-a)n 2 bn 0 n [(c-a)n b] 0 (c-a)n - b 0 Αν επιλέξουµε c = a+1 και οποιοδήποτε n 0 b, η ανισότητα (c-a)n - b 0 ισχύει. Εναλλακτικά, εάν επιλέξουµε c = 2a και οποιοδήποτε n 0 b/α, η ανισότητα (c-a)n - b 0 ισχύει και πάλι. 18
Συµβολισµός Ω Έστω f(n) και g(n) δύο συναρτήσεις. Η f(n) είναι Ω(g(n)), ή f(n) = Ω(g(n)), αν υπάρχουν θετική πραγµατική σταθερά c και ακέραιος n 0 0: για κάθε n n 0 να ισχύει: 0 cg(n) f(n) Παράδειγµα Θα αποδείξουµε ότι f(n) = an 2 +bn = Ω(n). an 2 + bn cn an 2 + (b-c)n 0 an + b-c 0. Aν επιλέξουµε c = b ισχύει ότι an 0, για κάθε n 0. Άρα για c = b & n 0 = 0, ισχύει ότι f(n) cn για κάθε n n 0. Εναλλακτικά, εάν επιλέξουµε c = 2b και οποιοδήποτε n 0 b/α, η ανισότητα an + b-c 0 ισχύει και πάλι. 19
Συµβολισµός Θ Έστω f(n) και g(n) δύο συναρτήσεις. Η f(n) είναι Θ(g(n)), ή f(n) = Θ(g(n)), αν f(n) = O(g(n)) και f(n) = Ω(g(n)). Παράδειγµα Για να δείξουµε ότι f(n) = an 2 +bn = Θ(n 2 ), αρκεί να αποδείξουµε ότι f(n) = an 2 +bn = Ω(n 2 ) (ήδη δείξαµε ότι f(n) = Ο(n 2 )). Ψάχνουµε για c > 0 & n 0 0, τ.ω. an 2 + bn cn 2, για κάθε n n 0 cn 2 an 2 + bn (c-a)n 2 bn 0 n [(c-a)n b] 0 (c-a)n -b 0. Aν επιλέξουµε c = a/2 > 0 ισχύει ότι (c-a)n - b = -an/2 - b 0, για κάθε n 0. Άρα για c = a/2 & n 0 = 0, ισχύει ότι f(n) c n 2 για κάθε n n 0. 20
Τάξη Πολυπλοκότητας Συµβολισµοί Ο, Ω, Θ Σχηµατικά 21
Συνήθεις Κατηγορίες Πολυπλοκότητας Χρόνου Θ(1): σταθερή πολυπλοκότητα Θ(logn): λογαριθµική πολυπλοκότητα Θ(n): γραµµική πολυπλοκότητα Θ(n logn): πολυπλοκότητα n log n (συνήθης πολυπλοκότητα βέλτιστων αλγορίθµων ταξινόµησης) Θ(n 2 ): τετραγωνική πολυπλοκότητα Θ(n 3 ): κυβική πολυπλοκότητα Θ(n k ), για κάποιο συγκεκριµένο ακέραιο k: πολυωνυµική πολυπλοκότητα Θ(2 n ): εκθετική πολυπλοκότητα 22
Ιδιότητες Ο, Ω, Θ Ανακλαστική Ιδιότητα f(n) = Ο(f(n)) f(n) = Ω(f(n)) f(n) = Θ(f(n)) Μεταβατική Ιδιότητα f(n)=ο(g(n)) & g(n)=ο(h(n)) f(n) = Ο(h(n)) f(n)=ω(g(n)) & g(n)=ω(h(n)) f(n) = Ω(h(n)) f(n)=θ(g(n)) & g(n)=θ(h(n)) f(n) = Θ(h(n)) Συµµετρική Ιδιότητα f(n) = Θ(g(n)) αν και µόνο αν g(n) = Θ(f(n)) Αντίστροφη Συµµετρική Ιδιότητα f(n) = O(g(n)) αν και µόνο αν g(n) = Ω(f(n)) Καλή άσκηση για το σπίτι Αποδείξτε τις παραπάνω ιδιότητες. ----------------------------------------------------------------------------------------- 23
Απλές Αναδροµικές Σχέσεις Παράδειγµα 1. Έστω: f(1) = 1 και f(n) = f(n-1) + n αν n > 1. O υπολογισµός ενός µη-αναδροµικού τύπου για την f(n) είναι απλός: f(n) = f(n-1) + n = f(n-2) + (n-1) + n =... = f(1) + 2 +... + (n-1) + n = 1 + 2 +... + (n-1) + n = (n+1) n / 2 Παράδειγµα 2. Έστω ότι f(0) = 1 και f(n) = 2 f(n-1) για n > 0. Υπολογισµός µη-αναδροµικού τύπου για f(n): f(n) = 2 f(n-1) = 2 2 f(n-2) =... = 2 n f(0) = 2 n. ----------------------------------------------------------------------------------------- 24
Αναδροµές τύπου «ιαίρει και Βασίλευε» υαδική Αναζήτηση Κάθε µια από τις αναδροµικές κλήσεις εξετάζει περίπου το µισό πίνακα. Αν T(n) : µέγιστος δυνατός χρόνος εκτέλεσης σε πίνακα µε n στοιχεία, τότε όπου c σταθερά. Επίσης, έστω T(1) = d. T(n) = T(n/2) + c Αν n = 2 k, τότε Τ(2 k ) = c + T(2 k-1 ) = c + c + T(2 k-2 ) = 2 c + T(2 k-2 ) =... = k c + T(2 0 ) = k c + T(1) = k c + d. Αφού n = 2 k, άρα k = log(n) και T(n) = c log(n) + d = Ο(log(n)) ----------------------------------------------------------------------------------------- 25