ΑΛΓΟΡΙΘΜΟΙ http://eclass.aueb.gr/courses/inf161/ Άνοιξη 2016 - I. ΜΗΛΗΣ ΠΑΡΑΔΕΙΓΜΑΤΑ ΑΛΓΟΡΙΘΜΩΝ ΚΑΙ ΠΟΛΥΠΛΟΚΟΤΗΤΑΣ ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 1
Example: GCD συνάρτηση gcd(a,b) Είσοδος: Ακέραιοι α b>0 Έξοδος: ΜΚΔ των a,b while a <> b do if a > b: a=a b else: b=b a return a OΡΘΟΤΗΤΑ: if a>b then gcd(a,b) = gcd(a-b, b) Απόδειξη: Έστω g=gcd(a,b), και a=gx, b=gy. gcd(25,11) 25 11 14 11 3 11 3 8 3 5 3 2 1 2 1 1 Τότε οι x,y δεν έχουν κοινό παράγοντα (διαφορετικά ο g δεν θα ήταν ΜΚΔ). GCD(a-b,b) = GCD(gx-gy, gy) = GCD( g(x-y), gy ) = g διαφορετικά οι x,y θα είχαν κοινό παράγοντα, άτοπο Τερματισμός? ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 2
Example: GCD συνάρτηση gcd(a,b) Είσοδος: Ακέραιοι α b>0 Έξοδος: ΜΚΔ των a,b while a <> b do if a > b: a=a b else: b=b a return a ΠΟΛΥΠΛΟΚΟΤΗΤΑ Καλύτερη περίπτωση: a=b: O(1) Χειρότερη περίπτωση: a >1, b=1: O(a) gcd(100,1) 100 1 99 1 98 1 2 1 1 1 100 Μήκος εισόδου (# bits): n = log a + log b 2 log a = O(log a) O(a)=O(2 n ) H συνάρτηση gcd(a,b) ΔΕΝ ΠΟΛΥΩΝΥΜΙΚΟΣ (στο n) αλγόριθμος ΥΠΑΡΧΕΙ πολυωνυμικός αλγόριθμος για τον ΜΚΔ? ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 3
Example: GCD - O(log Ν) συνάρτηση Euclid(a,b) Είσοδος: Ακέραιοι α b>0 Έξοδος: ΜΚΔ των a,b if b=0: return a return Euclid(b, a mod b) gcd(25,11) 25 11 11 3 3 2 2 1 1 0 gcd(100,1) 100 1 1 0 OΡΘΟΤΗΤΑ: if a>b then gcd(a,b)= gcd(a mod b, b) k φορές Απόδειξη: a a= k b + a mod b, k : a mod b = a b b - -b b Θυμηθείτε ότι if a>b then gcd(a,b)= gcd(a-b, b) και εφαρμόστε το επαναληπτικά. Τερματισμός? ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 4
Example: GCD - O(log Ν) συνάρτηση Euclid(a,b) Είσοδος: Ακέραιοι α b>0 Έξοδος: ΜΚΔ των a,b if b=0: return a return Euclid(b, a mod b) ΠΟΛΥΠΛΟΚΟΤΗΤΑ : if a b then a mod b < a/2 Απόδειξη if b a/2 then a mod b<b< a/2 if b >a/2 then a mod b=a-b < a/2 ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 5
Example: GCD - O(log Ν) συνάρτηση Euclid(a,b) Είσοδος: Ακέραιοι α b 0 Έξοδος: ΜΚΔ των a,b if b=0: return a return Euclid(b, a mod b) gcd(25,11) 25 11 11 3 3 2 2 1 1 0 ΠΟΛΥΠΛΟΚΟΤΗΤΑ : if a b then a mod b < a/2 a b Κάθε δύο βήματα η τιμή και των b a mod b δύο παραμέτρων τουλάχιστον a mod b b mod (a mod b) υποδιπλασιάζεται (a/2) (b/2) Άρα πολυπλοκότητα 2 loga = O(log a) = O(n) Μήκος εισόδου (# bits) n = O(log a) Δοκιμάστε Euclid(F k+1,f k ) ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 6
Example: Merge two sorted arrays - O(n) διαδικασία merge (A[1..p], B[1..q]) Είσοδος: Ταξινομημένοι πίνακες αριθμών Α, Β Έξοδος: Ταξινομημένος πίνακας C με όλα τα στοιχεία των Α,Β A[p+1]=, B[q+1]= i=1, j=1, n=p+q for k=1 to n: if A[i] B[j]: C[k]=A[i], i=i+1 else: C[k]=B[j], j=j+1 A: 2 4 5 7 B: 1 2 3 6 A: 2 4 5 7 B: 1 2 3 6 C=1 2 2 3 4 5 6 7 ΠΟΛΥΠΛΟΚΟΤΗΤΑ Χρόνος: Ο(n) Δεν γίνεται καλύτερα, πρέπει τουλάχιστον να διαβάσουμε/δούμε όλα τα στοιχεία των πινάκων (n=p+q) Χώρος: 2n=Ο(n), AΛΛΑ γίνεται με χώρο = n? ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 7
Example: Selection Sort - O(n 2 ) Διαδικασία SelectionSort (A[1..n]) Είσοδος: Πίνακας αριθμών Α[1..n] Έξοδος: Ο πίνακας Α ταξινομημένος for i=n,n-1, 3,2: find the position p of max element in A[1..i] swap(a[p], A[i]) ΠΟΛΥΠΛΟΚΟΤΗΤΑ: Θ(n 2 ) for i = n, n-1, n-2,, 3, 2 βήματα : n + n-1 + n-2 + + 3 + 2 Συνολικά: n i 2 i n i 1 (χειρότερη = καλύτερη = μέση περίπτωση) i n i βήματα: συνάρτηση max(a[1..n]) ( 2 n 1) 2 ( n ) ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 8
Insertion Sort - O(n 2 ) Διαδικασία InsertionSort (A[1..n]) Είσοδος: Πίνακας αριθμών Α[1..n] Έξοδος: Ο πίνακας Α ταξινομημένος for i=2 to n: j = i while (A[j]<A[j-1] and j>1): swap (A[j], A[j-1]) j = j-1 Παράδειγμα: 5 12 7 20 6 3 5 12 7 20 6 3 5 7 12 20 6 3 5 7 12 20 6 3 5 6 7 12 20 3 3 5 6 7 12 20 ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 9
Insertion Sort - O(n 2 ) Διαδικασία InsertionSort (A[1..n]) Είσοδος: Πίνακας αριθμών Α[1..n] Έξοδος: Ο πίνακας Α ταξινομημένος for i=2 to n: j = i while (A[j]<A[j-1] and j>1): swap (A[j], A[j-1]) j = j-1 ΠΟΛΥΠΛΟΚΟΤΗΤΑ: Αριθμός επαναλήψεων Εξαρτάται από την είσοδο ( πόσο ταξινομημένη είναι) ΚΑΛΥΤΕΡΗ ΠΕΡΙΠΤΩΣΗ (BEST CASE) - Ο πίνακας είναι ήδη ταξινομημένος - 1 επανάληψη while για κάθε επανάληψη for - συνολικά n-1 επαναλήψεις (i=2 to n) - Ο(n) ΚΑΝΕΝΑ ΕΝΔΙΑΦΕΡΟΝ ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 10
Insertion Sort - O(n 2 ) Διαδικασία InsertionSort (A[1..n]) Είσοδος: Πίνακας αριθμών Α[1..n] Έξοδος: Ο πίνακας Α ταξινομημένος for i=2 to n: j = i while (A[j]<A[j-1] and j>1): swap (A[j], A[j-1]) j = j-1 ΠΟΛΥΠΛΟΚΟΤΗΤΑ: Αριθμός επαναλήψεων Εξαρτάται από την είσοδο ( πόσο ταξινομημένη είναι) ΧΕΙΡΟΤΕΡΗ ΠΕΡΙΠΤΩΣΗ (WORST CASE) - Ο πίνακας είναι αντίστροφα ταξινομημένος - για κάθε επανάληψη for (i=2 to n) i επαναλήψεις while (j=i,i-1, 2,1) n n n( n 1) 2 - συνολικά i i ( n ) 2 i 2 ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL i 1 ΑΥΤΗ ΜΑΣ ΕΝΔΙΑΦΕΡΕΙ Σ ΑΥΤΟ ΤΟ ΜΑΘΗΜΑ 11
Insertion Sort - O(n 2 ) Διαδικασία InsertionSort (A[1..n]) Είσοδος: Πίνακας αριθμών Α[1..n] Έξοδος: Ο πίνακας Α ταξινομημένος for i=2 to n: j = i while (A[j]<A[j-1] and j>1): swap (A[j], A[j-1]) j = j-1 ΠΟΛΥΠΛΟΚΟΤΗΤΑ: Αριθμός επαναλήψεων Εξαρτάται από την είσοδο ( πόσο ταξινομημένη είναι) ΜΕΣΗ ΠΕΡΙΠΤΩΣΗ (ΑVERAGE CASE) Κατανομή πιθανότητας των πιθανών εισόδων Αναμενόμενη (Expected) πολυπλοκότητα Χρήση πιθανοτήτων ΠΟΛΥ ΕΝΔΙΑΦΕΡΟΥΣΑ Εδώ και πάλι Ο(n 2 ) ΣΤΗΝ ΠΡΑΞΗ ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 12
Ταξινόμηση (Sorting) SelectionSort InsertionSort Πολυπλοκότητα: Ο(n 2 ) Μήκος εισόδου: Μ=μέγιστο στοιχείο του πίνακα Α μήκος εισόδου n O(log M) log M =σταθερό, π.χ. log M =32 μήκος εισόδου = O(n) Μπορούμε να κάνουμε ταξινόμηση γρηγορότερα? ΝΑΙ: Ο(n logn) Ακόμη γρηγορότερα? ΟΧΙ! ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 13
Example: Matrix Multiplication - O(n 3 ) ΕΙΣΟΔΟΣ: X και Y: n x n πίνακες ΕΞΟΔΟΣ: Z=X Y ij k 1 ΠΟΛΥΠΛΟΚΟΤΗΤΑ: O(n 3 ) n Z X ik Y kj ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 14
Example: Matrix Multiplication - O(n 3 ) διαδικασία Mult (X[1..n,1..n], Y[1..n,1..n]) Είσοδος: Πίνακες αριθμών X, Y Έξοδος: Το γινόμενο Z = X Y for i=1 to n: for j=1 to n: Z[i,j]=0 for k=1 to n: Z[i,j]= Z[i,j]+X[i,k] Y[k,j] ΠΟΛΥΠΛΟΚΟΤΗΤΑ: O(n 3 ) Πολλαπλασιασμός ενός πίνακα n x m επί έναν πίνακα m x q : Πολυπλοκότητα O(nmq) Γίνεται καλύτερα? ΝΑΙ, επόμενο μάθημα ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 15
Example: Maximum sub-array ΕΙΣΟΔΟΣ: Πίνακας αριθμών Α[1..n] ΕΞΟΔΟΣ: Υπο-πίνακας Α[p..q] με το μέγιστο άθροισμα στοιχείων Θέλουμε να βρούμε δείκτες τέτοιους ώστε το V ( p, q) δηλαδή, V ( p, q) V ( p', q'), Παράδειγμα: Ιστορία κερδών q i p p, q 0 p q n A( i) να είναι μέγιστο 1 p' q' n Year 1 2 3 4 5 6 7 8 9 Profit -3 2 1-4 5 2-1 3-1 Να βρεθεί η περίοδος ετών με το μεγαλύτερο κέρδος: V(5,8)=9 ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 16
Example: Maximum sub-array - O(n 3 ) ΕΙΣΟΔΟΣ: Πίνακας αριθμών Α[1..n] ΕΞΟΔΟΣ: Υπο-πίνακας Α[p..q] με το μέγιστο άθροισμα στοιχείων Brute Force Υπολόγισε την τιμή V(i,j) για κάθε 1 i j n Επέστρεψε τη μέγιστη τιμή Vmax και τους δείκτες p,q Vmax=A(1), p=1, q=1 for i=1 to n: for j=i to n: V=0 for k=i to j: do V=V+A(k) if V>Vmax: Vmax= V, p=i, q=j return Vmax, p, q ΠΟΛΥΠΛΟΚΟΤΗΤΑ O(n 3 ) ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 17
Example: Maximum sub-array - O(n 2 ) ΕΙΣΟΔΟΣ: Πίνακας αριθμών Α[1..n] ΕΞΟΔΟΣ: Υπο-πίνακας Α[p..q] με το μέγιστο άθροισμα στοιχείων Re-use of data i j j+1 V ( i, j) V ( i) V ( i 1)... V ( j 1) V ( V ( i, j 1) Vmax=A(1), p=1, q=1 for i=1 to n: V=0 for j=i to n: V=V+A[j] if V>Vmax: Vmax= V, p=i, q=j return Vmax, p, q j) V ( i, j 1) A( j) ΠΟΛΥΠΛΟΚΟΤΗΤΑ: O(n 2 ) ΓΙΝΕΤΑΙ ΚΑΛΥΤΕΡΑ? ΝΑΙ! Ο(nlogn) και ακόμη Ο(n)! ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 18
Example: k-subset Sum - O(n k ) ΕΙΣΟΔΟΣ: Σύνολο S θετικών ακεραίων, ακέραιος Μ ΕΞΟΔΟΣ: Υπάρχει υποσύνολο ΑS, με k στοιχεία, A =k, και άθροισμα στοιχείων =M? k: σταθερά Brute force for κάθε υποσύνολο Α S, Α =k: V=0 for κάθε στοιχείο x A: V=V+x if V=M then return YES return NO Πόσα υποσύνολα Α S, Α =k, έχει ένα σύνολο με n στοιχεία? n k ΠΟΛΥΠΛΟΚΟΤΗΤΑ: Σταθερός χρόνος O(1) Α =k = σταθερά = O(n k ) k: σταθερά ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 19
Example: Subset Sum - O(2 n ) ΕΙΣΟΔΟΣ: Σύνολο S θετικών ακεραίων, ακέραιος Μ ΕΞΟΔΟΣ: Υπάρχει υποσύνολο ΑS με άθροισμα στοιχείων =M? Brute force for κάθε υποσύνολο Α S: V=0 for κάθε στοιχείο x A: V=V+x Δ if V=M then return YES return NO ΠΟΛΥΠΛΟΚΟΤΗΤΑ: O(n2 n ) Πόσα υποσύνολα έχει ένα σύνολο με n στοιχεία? Δυναμοσύνολο: 2 n A =O(n) Χρόνος Ο( n) Γίνεται καλύτερα? ΝΑΙ Ο(nM) ΑΛΓΟΡΙΘΜΟΙ - ΑΝΟΙΞΗ 2016 - Ι. ΜΗΛΗΣ - 03 - EXAMPLES ALG & COMPL 20