ΑΛΓΟΡΙΘΜΟΙ http://eclass.aueb.gr/courses/if161/ Άνοιξη 2017 I. ΜΗΛΗΣ Ώρες Γραφείου: Δευτέρα, Παρασκευή 11:00-13:00 Κοδριγκτώνος 12, 3 ος οροφος (Κωδικός Εισόδου 4267) E-mail: milis@aueb.gr
Αλγόριθμοι Τους χρησιμοποιείτε καθημερινά Web search Text editors σε κάθε εφαρμογή που τρέχετε Έχετε ήδη γράψει πολλές φορές Μαθήματα προγραμματισμού Δομές δεδομένων Σε αυτό το μάθημα Συστηματική μελέτη Τεχνικές σχεδιασμού και ανάλυσης Υπόβαθρο Διακριτά Μαθηματικά Δομές Δεδομένων Πιθανότητες 2
Shortest path Dijkstra 1959 etwork flows Internet routing Avi Wigderson define Dijkstra(Graph G, ode s) S := {} Q := odes(g) while not empty(q) u := extractmin( Q ) S := S È u for each node v in neighbors( u ) if d(u) + w(u,v) < d(v) then d(v) := d(u) + w(u,v) pi(v) := u Distance (Delhi, Bangalore) Path (Delhi, Bangalore)
String matching Knuth-Morris-Pratt Boyer-Moore 1977 Text CAUCGCGCUUCGC String CGC algorithm kmp_search: input: T (text), P (pattern sought) define variables: Spell checking Text processing Genome Molecular Biology Web search m 0, i 0, M (the table) while m + i is less than length of T, do: if P[i] = T[m + i], let i i + 1 if i = length of P then return m otherwise, let m m + i - M[i], if i > 0 let i M[i] Text CAUCGCGCUUCGC Location X X X Avi Wigderson
Αλγόριθμοι Βήμα-βήμα ΣΑΦΕΙΣ διαδικασίες για τη λύση προβλημάτων (επακριβώς ορισμένες, μη-διφορούμενες, μηχανικές διαδικασίες) Στην περίπτωσή μας: προβλήματα που θα λυθούν από υπολογιστή (μετασχηματισμός της εισόδου στην επιθυμητή έξοδο) Ότι τρέχει στον υπολογιστή σας χρησιμοποιεί έναν αλγόριθμο Ανεξάρτητοι από γλώσσα, υλοποίηση, υπολογιστή Ο πυρήνας της Επιστήμης Υπολογιστών 5
Αλγόριθμοι και προβλήματα Σχεδιάζουμε αλγόριθμους για να λύσουν προβλήματα Προβλήματα που πρόκειται να λυθούν από υπολογιστή Επακριβώς ορισμένα, μη διφορούμενα ΠΡΟΒΛΗΜΑ ΕΙΣΟΔΟΣ/ΣΤΙΓΜΙΟΤΥΠΟ (IPUT/ISTACE): οι παράμετροι του προβλήματος, oι τιμές τους και πιθανοί περιορισμοί ή σχέσεις μεταξύ τους ΕΞΟΔΟΣ/ΕΡΩΤΗΣΗ (ΟUTPUT/QUESTIO): το αποτέλεσμα που ψάχνουμε 6
Αλγόριθμοι Τρείς κρίσιμες ερωτήσεις για κάθε αλγόριθμο για ένα πρόβλημα: ΕΙΝΑΙ ΣΩΣΤΟΣ? - ΟΡΘΟΤΗΤΑ Δίνει τη σωστή απάντηση για κάθε επιτρεπτή είσοδο? Τερματίζει? ΕΙΝΑΙ ΓΡΗΓΟΡΟΣ? ΠΟΛΥΠΛΟΚΟΤΗΤΑ Πως την μετράμε? Αριθμός βημάτων = συνάρτηση T(n) του μήκους της εισόδου n ( # bits) ΥΠΑΡΧΕΙ ΚΑΛΥΤΕΡΟΣ? 7
Αλγόριθμοι Al Khwarizmi (780-850 μ.χ.) "Dixit algorizmi 12 ος αιώνας μ.χ. Δεκαδικό αριθμητικό σύστημα + οι πρώτοι αλγόριθμοι που μαθαίνουμε στο δημοτικό + άλλοι αλγόριθμοι x,p 53 +35 88 13 x 11 13 13 143 8
Αλγόριθμος πρόσθεσης 1 1 1 1 (κρατούμενο) 1 1 0 1 0 1 (53) à n bits + 1 0 0 0 1 1 (35) à n bits 1 0 1 1 0 0 0 (88) à n+1 bits Γιατί είναι σωστός ο αλγόριθμος? (ΟΡΘΟΤΗΤΑ) Το άθροισμα 3 μονοψήφιων αριθμών έχει 2 ψηφία (απόδειξη?) Πόσα βήματα/χρόνο χρειάζεται ο αλγόριθμος? (ΠΟΛΥΠΛΟΚΟΤΗΤΑ) Βήματα =n+1, Χρόνος: Τ(n) = c 1 n + c 2 = O(n) Αριθμοί 32/64 bits προστίθενται από τους υπολογιστές σε 1 βήμα! Μπορούμε να κάνουμε καλύτερα? ΟΧΙ: πρέπει τουλάχιστον να διαβάσουμε όλα τα ψηφία 9
Αλγόριθμος πολλαπλασιασμού 1 1 1 0 1 (13) à n bits x 1 0 1 1 (11) à n bits 1 1 0 1 (1101 επί 1) à n bits 1 1 0 1 (1101 επί 1, μετατοπισμένο 1 θέση) à n+1 bits 0 0 0 0 (1101 επί 0, μετατοπισμένο 2 θέσεις) + 1 1 0 1 (1101 επί 1, μετατοπισμένο 3 θέσεις) à 2n-1 bits 1 0 0 0 1 1 1 1 (143) à 2n bits Γιατί είναι σωστός ο αλγόριθμος? (ΟΡΘΟΤΗΤΑ) Η μετατόπιση αριστερά είναι πολλαπλασιασμός με τη βάση Πόσα βήματα/χρόνο χρειάζεται ο αλγόριθμος? (ΠΟΛΥΠΛΟΚΟΤΗΤΑ) Βήματα: n μετατοπίσεις + n-1 προσθέσεις 2 αριθμών x O(n) η κάθε μία Άρα T(n)=n+(n-1) n = O(n 2 ) Μπορούμε να κάνουμε καλύτερα? 10
Αλγόριθμος πολλαπλασιασμού 2 // Αναδρομική κλήση 11 x13=11+2(11 x 6) =11+2(2(11 x 3)) =11+2(2(11+2(11 x 1))) =11+2(2(11+2(11+2(11 x 0)))) 11
Αλγόριθμος πολλαπλασιασμού 2 // Αναδρομική κλήση 11 x13=11+2(11 x 6) =11+2(2(11 x 3)) =11+2(2(11+2(11 x 1))) =11+2(2(11+2(11+2(11 x 0)))) z=x+2z=143 z=2z=66 z=x+2z=33 z=x+2z=11 z=0 x,y 11,13 11,6 11,3 11,1 11,0 12
Αλγόριθμος πολλαπλασιασμού 2 ΟΡΘΟΤΗΤΑ: Η παραπάνω αναδρομική σχέση είναι σωστή (αυστηρή απόδειξη με επαγωγή) Αρκεί να τη μεταφράσουμε σωστά σε αλγόριθμο 13
Αλγόριθμος πολλαπλασιασμού 2 // Αναδρομική κλήση ΠΟΛΥΠΛΟΚΟΤΗΤΑ: n αναδρομικές κλήσεις (n=# bits) γιατί? σε κάθε μία: διαίρεση δια 2 (right shift) έλεγχος αρτιότητας (LSB) πολλαπλασιασμός επί 2 (left shift) μία πρόσθεση (εάν y περιττός) Άρα T(n) = n (3+ n) = Ο(n 2 ) και πάλι! 1 βήμα 1 βήμα 1 βήμα Ο(n) βήματα 14
Αλγόριθμοι πολλαπλασιασμού Και οι 2 είναι πολυπλοκότητας Ο(n 2 ) Μπορούμε να κάνουμε καλύτερα? Σε πρώτη ματιά θα λέγαμε όχι: Εύρεση n πολλαπλασίων του x (ένα για κάθε ψηφίο του y) Πρόσθεση αυτών των n πολλαπλασίων Άρα Ο(n 2 ) ΚΑΙ ΟΜΩΣ ΜΠΟΡΟΥΜΕ! Υπομονή λίγα μαθήματα Αριθμοί 32/64 bits πολλαπλασιάζονται από τους υπολογιστές σε 1 βήμα 15
Exponentiation συνάρτηση exp1(a,) Είσοδος: Μη-αρνητικοί ακέραιοι α, Ν Έξοδος: a Ν p = 1 for i = 1 to : p = p a return p OΡΘΟΤΗΤΑ: προφανής ΠΟΛΥΠΛΟΚΟΤΗΤΑ: Ν επαναλήψεις, Πολλαπλασιασμός σε ένα βήμα, Άρα Ο(Ν) Μέχρι τώρα: Πολυπλοκότητα = T(n), n: αριθμός bits δεδομένων ΑΥΤΗ ΜΑΣ ΕΝΔΙΑΦΕΡΕΙ Eδώ: Πολυπλοκότητα =T(), : τιμή δεδομένου ΤΗΝ ΘΕΛΟΥΜΕ ΣΑΝ ΣΥΝΑΡΤΗΣΗ του n: αριθμός bits του Ν 16
Exponentiation συνάρτηση exp1(a,): ΠΟΛΥΠΛΟΚΟΤΗΤΑ Ο(Ν) ΠΟΙΑ ΕIΝΑΙ Η ΣΧΕΣΗ Ν και n? (n =αριθμός bits του Ν) Πόσα ψηφία χρειάζονται για να γράψουμε το Ν? β-αδικό σύστημα Δυαδικό σύστημα: n = é n = log ( + 1) b ù n élog 2 ( + 1) ù Þ = O(2 ) Άρα συνάρτηση exp1(a,): ΠΟΛΥΠΛΟΚΟΤΗΤΑ O()=Ο(2 n ) ΕΚΘΕΤΙΚΗ ΣΤΟ n n=mhkoσ ΕΙΣΟΔΟΥ= αριθμός bits εισόδου/δεδομένων Μπορούμε να κάνουμε καλύτερα? O(log ) =O(n)? 17
Exponentiation a ì æ ï ç ï a è ï = í ï ï æ ç ï a a ç î è 2 ê ê ë 2 ö ø ú ú û 2 ö ø 2 if if is is even odd a 0 = 1 συνάρτηση exp2(a,) Είσοδος: Μη-αρνητικοί ακέραιοι α, Ν Έξοδος: a Ν if Ν=0: return 1 z = exp2 (a, ë / 2û ); if είναι άρτιος: return z 2 else: return az 2 OΡΘΟΤΗΤΑ: προφανής 18
Exponentiation συνάρτηση exp2(a,) Είσοδος: Μη-αρνητικοί ακέραιοι α, Ν Έξοδος: a Ν if Ν=0: return 1 z = exp2 (a, ë / 2û ); if είναι άρτιος: return z 2 else: return az 2 z=az 2 =a 13 a, a,13 z=z 2 =a 6 a,6 z=az 2 =a 3 a,3 z=az 2 =a a,1 z=1 a,0 19
Exponentiation συνάρτηση exp2(a,) Είσοδος: Μη-αρνητικοί ακέραιοι α, Ν Έξοδος: a Ν if =0: return 1 z= exp2 (a, ë / 2û) if είναι άρτιος: return z 2 else: return az 2 ΠΟΛΥΠΛΟΚΟΤΗΤΑ: k αναδρομικές κλήσεις για: (για την ακρίβεια élog ù+ 1 Πολλαπλασιασμός σε ένα βήμα,,,,..., = 1Þ k = log 2 3 k 2 2 2 2 επαναλήψεις) Άρα συνάρτηση exp2(a,): πολυπλοκότητα Ο(log Ν)=O(n) 20
Fibonacci numbers Leonardo da Pisa (Fibonacci) 1171-1249 Liber Abaci, 1202 Fibonacci numbers: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, F ì F ï = í 1 ï î 0-1 + F -2 if if if ³ 2 = 1 = 0 Αυξάνουν εκθετικά, F 0.694» 2 21
Fibonacci numbers συνάρτηση fib1() Είσοδος: Μη-αρνητικός ακέραιος n Έξοδος: F if <2: return return fib1(-1) + fib1(-2) OΡΘΟΤΗΤΑ: προφανής ΠΟΛΥΠΛΟΚΟΤΗΤΑ: T(): βήματα για τον υπολογισμό του F T(0) =1 T(1) =1 T() = T(-1) + T(-2) +2 (έλεγχος <2, πρόσθεση σε ένα βήμα) Τ() > F : εκθετική πολυπλοκότητα! Τ(200) >F 200» 2 138 22
Fibonacci numbers συνάρτηση fib1(6): Αναδροµικές κλήσεις 3 rd 2 nd 5 4 3 1 st call 12 th 6 18 th 3 4 17 th 2 23 rd 4 th 9 th 13 th 19 th 22 nd 3 2 2 1 2 1 1 0 5 th 2 1 1 0 1 0 16 th 1 0 24 th 25 th call 1 0 6 th 7 th 8 th 10 th 11 th 14 th 15 th 20 th 21 st Δυαδικό δένδρο Πλήρες μέχρι το επίπεδο ë/2û Þ > 2 ë/2û κόμβοι Þ Τ(n) > 2 ë/2û Γιατί? Υπολογίζει τις ίδιες τιμές πολλές φορές! Η ΕΦΑΡΜΟΓΗ ΤΗΣ ΑΝΑΔΡΟΜΗΣ ΔΕΝ ΕΙΝΑΙ ΠΑΝΤΑ ΧΡΗΣΙΜΗ 23
Fibonacci numbers συνάρτηση fib2() Είσοδος: Μη-αρνητικός ακέραιος Έξοδος: F Χρήση πίνακα f[0..] f[0]=0, f[1]:=1 For i=2 to : f[i]= f[i-1] + f[i-2] return f[] OΡΘΟΤΗΤΑ: προφανής ΠΟΛΥΠΛΟΚΟΤΗΤΑ: O(), πρόσθεση σε ένα βήμα ΜΗΚΟΣ ΕΙΣΟΔΟΥ=n= # bits = log => =2 n ΜΝΗΜΗ: Ν θέσεις, Ο() Άρα πολυπλοκότητα Ο(2 n ), ΕΚΘΕΤΙΚΗ στο Γίνεται με σταθερό αριθμό (3) θέσεων μνήμης? ΜΗΚΟΣ ΕΙΣΟΔΟΥ n 24
1. Ισχύει ότι και εύκολα προκύπτει ότι (αποδείξτε τα!) Άρα Πολυπλοκότητα : O(log Ν), πολλαπλασιασμοί άρρητων αριθμών. 2. Ισχύει ότι Πολυπλοκότητα : O(log Ν), πολλαπλασιασμοί ΜΟΝΟ ακεραίων ú û ú ê ë ê + = 2 1 5 ), ( F f exp2 25 Fibonacci numbers 2 5 1 ˆ and 2 5 1 where, 5 ˆ 5 - = + = - = f f f f F ú û ú ê ë ê + = ø ö ç ç è æ = 2 1 5 ή 5 n F round F f f 2 1 2 1 2 1 1 2 - + = - + + - = F F F )F F (F F
Primality συνάρτηση prime() Είσοδος: Μη-αρνητικός ακέραιος Έξοδος: ΝΑΙ/ΟΧΙ αν ο είναι/δεν είναι πρώτος for i=2 to é ù : if Ν mod i= 0: return OXI return AI OΡΘΟΤΗΤΑ: προφανής ΠΟΛΥΠΛΟΚΟΤΗΤΑ: If =2k: 1 βήμα If =3k: 2 βήματα If is prime: é ù βήµατα??? Διαφορετική πολυπλοκότητα για διαφορετικές εισόδους ίδιου μήκους! 26
Primality συνάρτηση prime() Είσοδος: Μη-αρνητικός ακέραιος Έξοδος: ΝΑΙ/ΟΧΙ αν ο είναι/δεν είναι πρώτος for i=2 to é ù : if (Ν mod i)= 0: return OXI return AI ΠΟΛΥΠΛΟΚΟΤΗΤΑ: ΣΤΗ ΧΕΙΡΟΤΕΡΗ O(Ν 1/2 ), έλεγχος if σε ένα βήμα n= # bits = log => =2 n ΠΕΡΙΠΤΩΣΗ Άρα πολυπλοκότητα Ο(2 n/2 ) Εκθετική στο MHΚΟΣ ΕΙΣΟΔΟΥ = n Γίνεται καλύτερα? ΝΑΙ, Ο(log 6 Ν), ΑKS primality test, 2002 27
Πολυπλοκότητα Υπάρχουν πολλοί είσοδοι με το ίδιο μήκος εισόδου, έστω n Πόσα βήματα χρειάζεται ο αλγόριθμος για μία τέτοια είσοδο? Καλύτερη περίπτωση (Best-case complexity) Ο ελάχιστος αριθμός βημάτων για τις εισόδους με μήκος n Καθόλου χρήσιμη Χειρότερη περίπτωση (Worst-case complexity) Ο μέγιστος αριθμός βημάτων για τις εισόδους με μήκος n Άνω όριο στην πολυπλοκότητα του προβλήματος Αυτή θα χρησιμοποιούμε στο μάθημα Μέση περίπτωση (Average case complexity) Ο μέσος αριθμός βημάτων για τις εισόδους με μήκος n Εξαρτάται από την κατανομή πιθανότητας των εισόδων Πολύ χρήσιμη στην πράξη 28
Example: MAX συνάρτηση max(a[1..n]) Είσοδος: Πίνακας αριθµών Α[1..n] Έξοδος: H θέση του µέγιστου στοιχείου του Α max= A[1], position=1 for i=2 to n: if A[i]>max: max=a[i], position=i return position ΠΟΛΥΠΛΟΚΟΤΗΤΑ Αριθμός βημάτων Καλύτερη περίπτωση=χειρότερη περίπτωση=μέση περίπτωση= Ο(n) ΜΗΚΟΣ ΕΙΣΟΔΟΥ? log A[1]+log A[2]+ + log A[n] nm, όπου Μ=32/64 bits (μήκος λέξης) Άρα ΜΗΚΟΣ ΕΙΣΟΔΟΥ= Ο(n)! To n εδώ είναι ΠΛΗΘΟΣ ΔΕΔΟΜΕΝΩΝ ΌΧΙ ΤΙΜΗ ΔΕΔΟΜΕΝΟΥ 29
Example: MAX, # assignments συνάρτηση max(a[1..n]) Είσοδος: Πίνακας αριθµών Α[1..n] Έξοδος: H θέση του µέγιστου στοιχείου του Α max= A[1], position=1 for i=2 to n: if A[i]>max: max=a[i], position=i return position ΠΟΛΥΠΛΟΚΟΤΗΤΑ T(n) = # of assignments (*) (*) Καλύτερη περίπτωση: Χειρότερη περίπτωση: T(n) = 1 : O(1) T(n) = n : O(n) Μέση περίπτωση:? 30
Example: MAX, # assignments συνάρτηση max(a[1..n]) Είσοδος: Πίνακας αριθµών Α[1..n] Έξοδος: H θέση του µέγιστου στοιχείου του Α max= A[1], position=1 for i=2 to n: if A[i]>max: max=a[i], position=i (*) return position Μέση περίπτωση (Average case) n! πιθανές διατάξεις των n αριθμών: ισοπίθανες T i = 1,0 : assignment in the i th iteration Pr [assignment in the i th iteration] = Pr [ A[j] < A[i], "j<i ] = 1/i Pr [no assignment in the i th iteration] = Pr [ $ j<i : A[j] > A[i] ] = (i-1)/i n Expected value rule æ ö çe( x) = å p k x k : è k= 1 ø 1 i -1 1 E[ T i ] = 1 + 0 = i i i 31
Example: MAX, # assignments συνάρτηση max(a[1..n]) Είσοδος: Πίνακας αριθµών Α[1..n] Έξοδος: H θέση του µέγιστου στοιχείου του Α max= A[1], position=1 for i=2 to n: if A[i]>max: max=a[i], position=i return position Μέση περίπτωση (Average case) n! πιθανές διατάξεις των n αριθμών: ισοπίθανες T i = 1,0 : assignment in the i th iteration T(n) : total # of assignments E [ T( n) ] é Eê ë n i= 1 T ( n) n n ù 1 Ti ú = E[ Ti ] = = H n = û i= 1 i= 1 i = å å å = n å i= 1 T i (*) 1 E( T i ) = i O(log n) Γραμμικότητα Αναμενόμενης Τιμής (Linearity of Expectation) 32
Λογάριθμοι k = log b n Þ b k = n, log b n, log 2 n = log n, log e n = lnn log b n = log log a a n b : log 2 n = log log 10 10 n 2 = 3.322 log 10 n Þ log b n = O(log n) 33
Λογάριθμοι log : Η δύναμη που πρέπει να υψωθεί το 2 για να δώσει το Ν Πόσες φορές πρέπει να υποδιπλασιαστεί το Ν για να δώσει 1? é log ù Πλήθος των bit στη δυαδική μορφή του Ν? é log( +1) ù Bάθος ενός πλήρους δυαδικού δένδρου με Ν κόμβους? 1 1 1 1 O(log ) 2 3 H = + + +! + = ë log û 34
Αλγόριθμοι Τρείς κρίσιμες ερωτήσεις για κάθε αλγόριθμο για ένα πρόβλημα: ΕΙΝΑΙ ΣΩΣΤΟΣ? - ΟΡΘΟΤΗΤΑ Δίνει τη σωστή απάντηση για κάθε είσοδο? Τερματίζει? ΠΟΣΟ ΧΡΟΝΟ/ΧΩΡΟ χρειάζεται? - ΠΟΛΥΠΛΟΚΟΤΗΤΑ Χρόνος ~ # βημάτων, Χώρος ~ # θέσεων μνήμης Συνάρτηση T(n) του μήκους της εισόδου n ( # bits) Ρυθμός αύξησης της T(n) όταν αυξάνεται το n (n ) Ασυμπτωτική συμπεριφορά της T(n) otations O, Ω, Θ, ο, ω,» ΜΠΟΡΟΥΜΕ ΝΑ ΚΑΝΟΥΜΕ ΚΑΛΥΤΕΡΑ? 35
Μάθημα Εισαγωγή - Ασυμπτωτικοί συμβολισμοί Τεχνικές σχεδίασης αλγορίθμων Διαίρει και Βασίλευε (Divide and Conquer) Άπληστοι αλγόριθμοι (Greedy algorithms) Δυναμικός Προγραμματισμός (Dynamic Programming) Εφαρμογή: Αλγόριθμοι γράφων Δύσκολα προβλήματα και ΝΡ-πληρότητα Στόχος: Να μάθετε να σκέπτεστε αλγοριθμικά (πρόβλημα-αλγόριθμος-ορθότητα-πολυπλοκότητα) Με πολλά παραδείγματα (μάθημα, φροντιστήριο, ασκήσεις) Προσωπική εξάσκηση Δεν υπάρχει διαχωρισμός θεωρίας ασκήσεων ΔΕΝ ΒΟΗΘΑ ΚΑΘΟΛΟΥ Η ΑΠΟΣΤΗΘΙΣΗ 36
Φροντιστήρια Ασκήσεις - Βοηθοί Δύο Τμήματα φροντιστηρίου Γιώργος Μπίρμπας (Υ.Δ.), Τετάρτη 1-3, Α24 Λίβια Χατζηελευθερίου (Υ.Δ.), Τετάρτη 5-7, Α23 Άλλοι βοηθοί Γιώργος Αμανατίδης (Υ.Δ.)? (Μεταπτυχιακός φοιτητής)? (Μεταπτυχιακός φοιτητής) 37
Βιβλία [DPV] S. Dasgupta, C.H. Papadimitriou, U.V. Vazirani : Algorithms http://www.cs.berkeley.edu/~vazirani/algorithms/ [CLRS] T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein: Introduction to Algorithms [KT] J. Kleinberg, E.Tardos: Algorithm Design και WWW 38
Βαθμολογία Πρόοδοι 3 πρόοδοι: την ~5 η, 9 η και 11 η εβδομάδα του μαθήματος Διάρκεια 90 Προαιρετικές 12% +12%+12% του τελικού βαθμού (μόνο βελτίωση) Ασκήσεις? 3 +1 σειρές ασκήσεων Προαιρετικές 5% +5%+5% του τελικού βαθμού (μόνο βελτίωση) Τελική εξέταση Βαθμός τουλάχιστον 35/100 39
Οι αλγόριθμοι είναι δημιουργικό μάθημα! Καλό εξάμηνο! 40