ΕΠΛ 1 Δομές Δεδομένων και Αλγόριθμοι Σεπτέμβριος 009 Κατ οίκον Εργασία 1 Σκελετοί Λύσεων Άσκηση 1 Αρχικά θα πρέπει να υπολογίσουμε τον αριθμό των πράξεων που μπορεί να εκτελέσει ο υπολογιστής σε μια ώρα, έστω x, και στη συνέχεια, για κάθε μία περίπτωση, να βρούμε τον ακέραιο για το οποίο o αριθμός των βασικών πράξεων που εκτελεί κάθε ένας από τους αλγόριθμους δεν υπερβαίνει τον x. x = 60(λεπτά)*60(δευτερόλεπτα)* (πράξεις) = 6 1 (α) 6 1 = = (6 1 ) = 6* 6 (β) 6 1 = = (6 1 ) 1/ = 019,7 = 019 (γ) 6 1 = 0 = (6 ) = 6 5 (δ) lg = 6 1 lg = 5 1lg 5 + 1lg = H εξίσωση αυτή μπορεί να λυθεί με προσεγγιστικές μεθόδους. Παρατηρούμε ότι, αν θέσουμε = k, τότε η εξίσωση μπορεί να γραφτεί ως k k = 5 + 1lg k lg k =,86 k + lg k =,86 Επομένως, ψάχνουμε να εντοπίσουμε k τέτοιο ώστε k + lg k =.86. Με τη βοήθεια ενός απλού προγράμματος που δίνει τιμές στο k μέχρι να προσεγγίσει τον πιο πάνω στόχο, παίρνουμε ότι για k = 9,56, τότε lg k = 5.0 και k + lg k =.86. Επομένως, συμπεραίνουμε ότι x 9,56. (ε) 6 1 = log (6 1 ) = log = log (6 1 log ) = = 5,0 = 5 log 1 (ζ) 1 6 1 log(6 ) log log 1 (log(6 )) log = log(log(6 )) = log 5,0 = 5 1 Άσκηση Πιο κάτω παρουσιάζεται η σωστή σειρά των συναρτήσεων από τη μικρότερη τάξη προς τη μεγαλύτερη. f () = + f () = f 1 () = f () = 0 1
ΕΠΛ 1 Δομές Δεδομένων και Αλγόριθμοι Σεπτέμβριος 009 + Ο( ) Πρέπει να δείξουμε ότι υπάρχουν σταθερές c και 0 τέτοιες ώστε + c για κάθε 0 Έστω ότι c = και 0 =. + για κάθε ( και για κάθε ) + Ω( ) Έστω ότι ισχύει, δηλαδή + Ω( ). Τότε c, 0 τ.ω. + c για κάθε 0, 1 c για κάθε 0. 1 Καθώς το τείνει στο άπειρο, το τείνει στο μηδέν. Επομένως δεν είναι δυνατόν να υπάρχει θετική σταθερά c που να ικανοποιεί την πιο πάνω σχέση. Αυτό μας δίνει αντίφαση στην αρχική μας υπόθεση και συμπεραίνουμε ότι + Ω( ) Ο( ) Πρέπει να δείξουμε ότι υπάρχουν σταθερές c και 0 τέτοιες ώστε c για κάθε 0 Θα αποδείξουμε ότι το ζητούμενο ισχύει για c = 1 και 0 = 1. Έστω Π(), 1, η πρόταση Π() c Θα αποδείξουμε ότι η πρόταση ισχύει για κάθε 1 με τη μέθοδο της επαγωγής: Βάση της επαγωγής Για =1 έχουμε 1 < 1, και η Π(1) έπεται. Υπόθεση της επαγωγής Έστω ότι η Π() ισχύει για = k, δηλαδή k k. Βήμα της επαγωγής (k+1) = k + k + 1 Θα αποδείξουμε την πρόταση Π(k+1). k για κάθε k 1 k k k+1 που συμπληρώνει την απόδειξη. Υπόθεση επαγωγής Ω( ) Έστω ότι ισχύει, δηλαδή Ω( ). Τότε
ΕΠΛ 1 Δομές Δεδομένων και Αλγόριθμοι Σεπτέμβριος 009 c, 0 τ.ω. c για κάθε 0, Τότε έχουμε c για κάθε 0 = c -1 για κάθε 0 c( -1) για κάθε max( 0,1), από την πρόταση Π(-1) πιο πάνω Επομένως, αν Ω( ) τότε υπάρχουν c και 0 τέτοια ώστε c..( -1) για κάθε max( 0,1), δηλαδή, υπάρχουν c και 0 τέτοια ώστε c ή c ( 1) 0 1 Προφανώς όμως δεν υπάρχει σταθερά c > 0 που να ικανοποιεί την πιο πάνω ανισότητα καθώς το μεγαλώνει απεριόριστα. (Ο λόγος τείνει στο 0 καθώς το 0 1 τείνει στο.) Αυτό μας οδηγεί σε αντίφαση και επομένως η υπόθεση μας ότι Ω( ) είναι λανθασμένη. Ο(0 ) Πρέπει να δείξουμε ότι υπάρχουν σταθερές c και 0 τέτοιες ώστε c0 για κάθε 0 δηλαδή c για κάθε 0 Έστω ότι c = 1 και 0 = 1. για κάθε 1 (1 για κάθε 1) Ω(0 ) Έστω ότι ισχύει, δηλαδή Ω(0 ). Τότε c, 0 τ.ω. c0 για κάθε 0, Τότε έχουμε c0 για κάθε 0 = c για κάθε 0 Επομένως αν Ω(0 ) τότε υπάρχουν c και 0 τέτοια ώστε c. για κάθε 0, δηλαδή υπάρχουν c και 0 τέτοια ώστε c c Προφανώς όμως δεν υπάρχει σταθερά c>0 τέτοια ώστε καθώς το μεγαλώνει απεριόριστα αφού ο λόγος τείνει στο 0 καθώς το τείνει στο. Αυτό μας οδηγεί σε αντίφαση και επομένως Ω(0 ).
ΕΠΛ 1 Δομές Δεδομένων και Αλγόριθμοι Σεπτέμβριος 009 Άσκηση (i) Αφού f()o(g()), τότε υπάρχουν c και 0 τέτοια ώστε f() c.g(), για κάθε 0 Παίρνοντας λογάριθμους και στα δύο σκέλη της ανισότητας έχουμε ότι log f() log (c.g()) = log c + log g() για κάθε 0 Θέτοντας c = log c + 1 έχουμε ότι log c + log g() c log g() για κάθε 0 εφόσον η συνάρτηση log g() > 1. Αυτό υποθέτουμε ότι ισχύει αφού οι συναρτήσεις μας αναφέρονται σε χρόνους εκτέλεσης (αριθμό βασικών πράξεων που εκτελούνται). (ii) Η πρόταση δεν είναι αληθής όπως φαίνεται στο πιο κάτω αντιπαράδειγμα. Για f ()=, f() = g()=, g() = και ενώ O(), Ο( ). (iii) Η πρόταση είναι ορθή. Αφού f ()O(g()), τότε υπάρχουν c και 0 τέτοια ώστε f () cg(), για κάθε 0 f() (cg()) = c g() Θέτουμε c = c και έχουμε ότι f () c g(), για κάθε 0 Επομένως το ζητούμενο έπεται. Άσκηση Α. Έστω Τ() ο χρόνος εκτέλεσης της διαδικασίας σε δεδομένο μεγέθους. Τότε, T() i i0 j0 1 i0 i 1 i0 ( 1) ( )( ) ( 1)( ) O( i0 i ) Β. Για να βρούμε τον χρόνο εκτέλεσης της διεργασίας, παρατηρούμε ότι ο χρόνος εκτέλεσης του τρίτου βρόχου εξαρτάται από την τιμή j, η οποία καθορίζεται από τον δεύτερο βρόχο. Ο πιο κάτω πίνακας δείχνει τον χρόνο εκτέλεσης του εσωτερικού βρόχου, T (j), σαν συνάρτηση του j:
ΕΠΛ 1 Δομές Δεδομένων και Αλγόριθμοι Σεπτέμβριος 009 j 0 1-1 T (j) 1 Ο χρόνος εκτέλεσης των δύο εσωτερικών βρόχων, T,, είναι ίσος με το άθροισμα των χρόνων εκτέλεσης, T (j), δηλαδή ( 1) T, = 1 + + + + = ( ) Παρατηρούμε ότι ο εξωτερικός βρόγχος είναι ανεξάρτητος από τους εσωτερικούς, άρα ο συνολικός χρόνος εκτέλεσης του προγράμματος, T total, είναι ίσος με το γινόμενο του αριθμού των επαναλήψεων του εξωτερικού βρόγχου επί τον χρόνο εκτέλεσης των εσωτερικών βρόγχων T,. Υποθέτουμε χωρίς βλάβη της γενικότητας ότι το είναι πολλαπλάσιο του. Στην περίπτωση αυτή ο αριθμός των επαναλήψεων του εξωτερικού βρόγχου είναι log και ο ζητούμενος χρόνος εκτέλεσης log ( log ). T total Γ. 1. waste(it ){. it sum=0;. for (i = 1; i<= ; i++) {. if (i mod == 0) { 5. for (j = 1; j <= i; j++) 6. sum++; 7. for (j = ; j >= i; j--) 8. sum++; 9. }. } 11. if ( > 1) 1. for ( i = 1; i <= ; i++ ) 1. waste (/); 1. } Για να μπορέσουμε να υπολογίσουμε το Τ(), πρέπει πρώτα να υπολογίσουμε τους χρόνους εκτέλεσης των βρόχων στις γραμμές 5-6, 7-8 κα -. Γράφουμε Τ(εσ 1 ), Τ(εσ ) και Τ(εξ) για τους χρόνους αυτούς, αντίστοιχα. Τ(εσ 1 ) = i Τ(εσ 1 ) = i + 1 Τ(εσ 1 ) + Τ(εσ ) = i + i + 1 = + 1 Θ() Παρατηρούμε ότι ο εξωτερικός βρόχος εκτελεί / επαναλήψεις του κορμού του, επομένως T ( ) 5
ΕΠΛ 1 Δομές Δεδομένων και Αλγόριθμοι Σεπτέμβριος 009 Έστω Τ() ο χρόνος εκτέλεσης της wait(). Τότε η τιμή του Τ() δίνεται από την πιο κάτω αναδρομική εξίσωση T ( 1) 1 T ( ) T ( / ) [T ( / ) ] T ( / ) T ( / ) ( / ) T( / ) T( / ) Διακρίνουμε την πιο κάτω γενική μορφή για την εξίσωση. i T ( ) T ( / ) i. Θέτουμε k = lg και παίρνουμε ότι. k T ( ) T ( / ) k k i lg T (1) lg 1 lg ( lg( )) Άσκηση 5 it av-case(it A[], it ){ r = 0; for (i = 0; i < ; i++) if (A[i] == -1) break; else r++; retur r; } Με κόκκινο χρώμα φαίνονται οι βασικές πράξεις του προγράμματος (δηλαδή ), ενώ με μπλε χρώμα φαίνονται οι πράξεις που εκτελούνται σε κάθε επανάληψη του βρόγχου. Σε περίπτωση που εντοπιστεί το στοιχείο -1 στον πίνακα, εκτελούνται ακόμη τρεις εντολές, ενώ κάθε ανεπιτυχής επανάληψη εκτελεί 6 εντολές (οι εντολές που εμφανίζονται με μπλε χρώμα). Διακρίνουμε τις πιο κάτω περιπτώσεις. Aν A[0] = -1 θα εκτελεστούν 6 πράξεις Aν A[1] = -1 θα εκτελεστούν 1 πράξεις Aν A[] = -1 θα εκτελεστούν 18 πράξεις Aν A[-1] = -1 θα εκτελεστούν 6 πράξεις Αν 1 Α θα εκτελεστούν 6 + 6 πράξεις 6
ΕΠΛ 1 Δομές Δεδομένων και Αλγόριθμοι Σεπτέμβριος 009 Συνδυάζοντας τα πιο πάνω αποτελέσματα με τις πιθανότητες που τους αντιστοιχούν έχουμε ότι, στη μέση περίπτωση, ο αριθμός βασικών πράξεων που εκτελούνται από τον αλγόριθμο είναι 1 1 1 (6 6) (6 1 18... 6) 1 1..6(1... ) ( 1) 6 6 9 9 7