Algorithms - Exercise 1

408 views

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
408
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Algorithms - Exercise 1

  1. 1. Αλγόριθµοι & Πολυπλοκότητα 1ο Σύνολο ΑσκήσεωνΓιαννούσης Κωνσταντίνος (ΑΜ 1115201000225) Τµήµα Πληροφορικής & ΤηλεπικοινωνιώνΕθνικό και Καποδιστριακό Πανεπιστήµιο Αθηνών copyright © 2011 by Constantine Yannoussis
  2. 2. 1Ποια είναι η ελάχιστη τιµή του n για την οποία ένας αλγόριθµος µε χρόνοεκτέλεσης 100n2 εκτελείται γρηγορότερα από έναν αλγόριθµο µε χρόνο εκτέ-λεσης 2n στην ίδια µηχανή ; Αυτό που Ϲητάµε ουσιαστικά είναι για ποια ελάχιστη τιµή του n ισχύει ηανισότητα 100n2 < 2n . Για να µπορέσουµε να ϐρούµε την ελάχιστη τιµή του n δουλεύουµε παίρ-νοντας την ισότητα 100n2 = 2n . Θέλουµε δηλαδή αρχικά να ϐρούµε για ποιατιµή οι δύο χρόνοι εκτέλεσης είναι ίσοι. Θεωρούµε λοιπόν τη συνάρτηση f (n) = 100n2 − 2n . Από την λύση τηςεξίσωσης f (n) = 0 ϐρίσκουµε τις ϱίζες δηλαδή τις τιµές όπου οι δυο χρόνοιείναι ίσοι. Κατόπιν ϑα ελέγξουµε τις πλησιέστερες ακέραιες τιµές στις ϱίζεςγια να ϐρούµε αυτές που να ικανοποιούν τη Ϲητούµενη ανίσωση. ΄Ετσι, µετά από υπολογισµούς καταλήγουµε σε τρεις ϱίζες της εξίσωσης100n2 − 2n : n1 0.103658 n2 −0.096704 n3 14.3247 ΄Οπως ϕαίνεται, µεταξύ των ϱιζών n1 και n2 υπάρχει µοναδικός ακέραιοςτο 0 ο οποίος όµως δεν ανήκει στην f (n). Επίσης, για αρνητικές τιµές τουn γίνεται άµεσα αντιληπτό πως δεν ικανοποιείται η Ϲητούµενη ανίσωση. ΄Ε-τσι καταφεύγουµε στην τρίτη ϱίζα, την n3 , και ελέγχουµε τις ακέραιες τιµέςεκατέρωθεν της ϱίζας αυτής, δηλαδή, τις τιµές n = 14 και n = 15: • Για n = 14 έχουµε : 100 · 142 = 19600 214 = 16384 ∆ηλαδή, 100n2 > 2n . • Για n = 15 έχουµε : 100 · 152 = 22500 215 = 32768 ∆ηλαδή, ισχύει η Ϲητούµενη ανίσωση 100n2 < 2n . Αν συνεχίζαµε τον έλεγχο και για πιο µεγάλες τιµές του n ϑα παρατηρού-σαµε ότι ϑα εξακολουθούσε να ισχύει η ανίσωση. Συνεπώς, στο πρόβληµά µας, η µικρότερη ακέραια τιµή του n για τηνοποία ισχύει ότι ο χρόνος εκτέλεσης 100n2 εκτελείται γρηγορότερα από τοχρόνο εκτέλεσης 2n στην ίδια µηχανή, είναι η n = 15. 1
  3. 3. 2Για κάθε συνάρτηση f (n) και χρόνο t στον παρακάτω πίνακα, ϐρείτε το µέ-γιστο µέγεθος n του στιγµιοτύπου ενός προβλήµατος που µπορεί να λυθεί σεχρόνο t, υποθέτοντας ότι ο αλγόριθµος που λύνει το πρόβληµα απαιτεί f (n)microseconds. f (n)t 1 δευτερόλεπτο 1 λεπτό 1 ώρα 6 7 9 log n 210 26·10 23.6·10 n 106 6 · 107 3.6 · 109 nlogn 62746.1 2.80142 · 106 √ 6.0482 · 107 n2 103 60 · 103 6 · 104 2n log 106 log(6 · 107 ) log(3.6 · 109 )3΄Εστω f, f1 , f2 , g, g1 , g2 , h ϑετικές συναρτήσεις. Αποφασίστε αν οι παρακάτωπροτάσεις είναι αληθείς ή ψευδείς. ∆ικαιολογήστε τις απαντήσεις σας. 1. f (n) = Ω(g(n)) ⇒ g(n) = O(f (n)) Από τον ορισµό του Ω(g(n)) ισχύει ότι f (n) = Ω(g(n)) αν υπάρχουν ϑετικές σταθερές c και k τέτοιες ώστε |f (n)| ≥ c|g(n)| για κάθε n > k . Οπότε αφού c > 0 τότε ϑα ισχύει και 1 |f (n)| ≥ |g(n)| για κάθε n > k . c Συνεπώς, αν ϑέσουµε c = 1 τότε ϑα ισχύει |g(n)| ≤ c |f (n)| για κάθε c n > k. ∆ηλαδή, σύµφωνα µε τον ορισµό του Big − O notation πρόταση f (n) = Ω(g(n)) ⇒ g(n) = O(f (n)) είναι αληθής. 2. n! = Θ(n log n) ΄Εστω ότι ισχύει n! = Θ(n log n). Εποµένως, n! = O(n log n), ΄Εστω συνάρτηση g(n) = 2n . Αποδεικνύεται ότι g(n) = O(n!) ( 2n = 2 · 2 · . . . 2 ≤ 2 · 3 · . . . n = n!) n times οπότε κατ΄ επέκταση ϑα ισχύει και 2n = O(n log n). Κάτι τέτοιο όµως είναι άτοπο, εποµένως η αρχική πρόταση δεν ισχύει. 3. f (n) = ω(g(n)) ⇒ f (n) = Ω(g(n)) Από τον ορισµό του ω(g(n)) ισχύει ότι f (n) = ω(g(n)) αν υπάρχουν ϑετικές σταθερές c και k τέτοιες ώστε |f (n)| > c|g(n)| για κάθε n > k . Αφού λοιπόν έχουµε από τα δεδοµένα ότι αυτό ισχύει, δηλαδή ότι |f (n)| > c|g(n)| ϑα ισχύει και ότι για c , k ϑετικές σταθερές έχουµε |f (n)| ≥ c |g(n)| για κάθε n > k . Θα έχουµε δηλαδή ότι ισχύει f (n) = Ω(g(n)). 2
  4. 4. 4. Αν f (n) = O(g(n)) και f (n) = Ω(h(n)) ⇒ g(n) = Θ(h(n)) Από τον ορισµό του Big-O notation έχουµε ότι f (n) = O(g(n)) ισχύει όταν υπάρχουν ϑετικές σταθερές c και k τέτοιες ώστε |f (n)| ≤ c|g(n)| για κάθε n > k . Επίσης από τον ορισµό του Big-Ω notation έχουµε ότι f (n) = Ω(h(n)) ισχύει όταν υπάρχουν ϑετικές σταθερές c και k τέτοιες ώστε |f (n)| ≥ c |h(n)| για κάθε n > k . Για να ισχύει λοιπόν το g(n) = Θ(h(n)), ϑα πρέπει να δείξουµε ότι ισχύει g(n) = O(h(n)) και ταυτόχρονα g(n) = Ω(h(n)). Από τα δεδοµένα έχουµε ότι f (n) = O(g(n)), δηλαδή ότι και g(n) = Ω(f (n)) (ϐλέπε απόδειξη 1 ίδιας άσκησης). Επίσης από τα δεδοµένα έχουµε f (n) = Ω(h(n)). ΄Ετσι ϑα υπάρχουν c και k ϑετικά τέτοια ώστε να ισχύει και |g(n)| ≥ c|f (n)| ≥ c |h(n)| ⇒ |g(n)| ≥ c |h(n)|, δηλαδή, g(n) = Ω(h(n)). ΄Οµως ϕαίνεται ότι το αντίθετο δεν ισχύει, δηλαδή, δεν ισχύει ότι g(n) = O(h(n)). Θα προσπαθήσουµε να δείξουµε ότι δεν ισχύει µε ένα αντιπα- ϱάδειγµα. ΄Εστω, οι συναρτήσεις h(n) = log n, f (n) = n και g(n) = n log n. Εύκολα αποδεικνύουµε ότι οι συναρτήσεις είναι της µορφής που Ϲητάµε, δηλαδή ισχύει f (n) = Ω(h(n)) και f (n) = O(g(n)) που είναι και η αρχική συνθήκη και συνεπώς ισχύει και το συµπέρασµα ότι g(n) = Ω(h(n)) που δείξαµε πιο πάνω. ΄Εστω ότι ισχύει η συνθήκη ότι g(n) = O(h(n)), ότι δηλαδή, n log n = O(log n). Υπάρχουν λοιπόν ϑετικά l και m τέτοια ώστε |n log n| ≤ l| log n| για κάθε n > m. ΄Οταν n ≤ l η σχέση αυτή ϕαίνεται να ι- σχύει, αφού µιλάµε για ϑετικές ποσότητες. ΄Οταν όµως το n αυξάνει ενώ το l είναι µια σταθερή ποσότητα και κάποια στιγµή ϑα είναι n > l, οπότε η ανισότητα |n log n| ≤ l| log n| δεν ϑα ισχύει. ΄Ετσι µπορούµε να πούµε ότι τελικά η ανισότητα |n log n| ≤ l| log n| δεν ισχύει για κάθε n > k , και εποµένως δεν ισχύει η αρχική συνθήκη. Συνεπώς, η πρόταση δεν είναι αληθής.5. 4n2 + 5n − 9 = Ω(10n2 ) Από τη ϑεωρία γνωρίζουµε ότι µια πολυωνυµική συνάρτηση έχει τάξη (Θ) τον όρο µε το µεγαλύτερο εκθέτη. Συνεπώς, η τάξη της f (n) = 4n2 + 5n − 9 = Θ(n2 ). Αυτό σηµαίνει επίσης ότι, f (n) = Ω(n2 ). Κατά τον ίδιο τρόπο g(n) = 10n2 = Θ(n2 ) και εποµένως g(n) = Ω(n2 ). Οπότε η πρόταση ισχύει. 3
  5. 5. 6. log(n!) = Θ(n log n) Στο πρώτο ϐήµα της απόδειξης, ϑα δείξουµε ότι ισχύει log(n!) = O(n log n). n! = 1 · 2 . . . n − 1 · n ≤ n · n . . . n ⇒ n! ≤ nn Εποµένως log n! ≤ log nn ⇒ log n! ≤ n log n ΄Ετσι υπάρχουν ϑετικές ποσότητες c, k τέτοιες ώστε | log n!| ≤ c|n log n|, για κάθε n ≥ k , δηλαδή, ισχύει ότι log(n!) = O(n log n). Αφού αποδείξαµε το πρώτο µέρος, αποµένει να δείξουµε ότι ισχύει και log(n!) = Ω(n log n). ΄Ετσι, n n n n n nn2 n! ≥ · ( + 1) · ( + 2) · . . . ( + ) ≥ ⇒ 2 2 2 2 2 2 nn2 n n n! ≥ ⇒ log n! ≥ log ⇒ 2 2 2 n 1 1 n! ≥ (log n − log 2) = n log n − n 2 2 2 Εποµένως υπάρχουν ϑετικές ποσότητες c , k τέτοιες ώστε | log n!| ≥ c|n log n|, για κάθε n ≥ k , δηλαδή, ισχύει ότι log(n!) = Ω(n log n). Συνεπώς η πρόταση είναι αληθής.7. f (n) + g(n) = Θ(min(g(n), f (n))) Γνωρίζουµε ότι ισχύει το f (n) = Θ(f (n)) και g(n) = Θ(g(n)). Επίσης ισχύει ότι f (n) + g(n) = Ω(min(g(n), f (n))). Συνεπώς για να ισχύει η πρόταση ϑα πρέπει να ισχύει ότι f (n) + g(n) = O(min(g(n), f (n))). ΄Εστω ότι f (n) + g(n) = O(min(g(n), f (n))) ισχύει. Οπότε έστω οι συναρτήσεις f (n) = n και g(n) = 2n . Συνεπώς min(f (n), g(n)) = f (n) = n. ΄Αρα από την αρχική υπόθεση ϑα είναι n + 2n = O(n). Κάτι τέτοιο δεν ισχύει οπότε και η πρόταση f (n)+g(n) = O(min(g(n), f (n))) δεν ισχύει. Συνεπώς, και η αρχική πρόταση δεν ισχύει. √ √8. n + 2 n = Ω(n n) Από το ϑεώρηµα ισχύει ότι f (n) + g(n) = Ω(min(g(n), f (n))). Επίσης, √ √ αν f (n) = n και g(n) = 2 n, τότε, min(f (n), g(n)) = 2 n = g(n), για κάθε n > 4. √ Οπότε αρκεί να δείξουµε ότι η g(n) = Ω(n n). ΄Εστω ότι ισχύει g(n) = √ Ω(n n). ∆ηλαδή υπάρχουν ϑετικές ποσότητες c, k τέτοιες ώστε |g(n)| ≥ √ c|n n|, για κάθε n > k . ΄Εχουµε δηλαδή, √ √ √ |g(n)| ≥ c|n n| ⇒ |2 n| ≥ c|n n| ⇒ 4
  6. 6. √ c √ √ √ | n| ≥ |n n| ⇒ | n| ≥ c |n n| 2 Κάτι τέτοιο είναι άτοπο για ϑετικές ποσότητες οπότε ισχύει η πρόταση √ g(n) = Ω(n n) και συνεπώς ισχύει η αρχική πρόταση. 9. Αν f (n) = O(g(n)) και g(n) = Ω(f (n)) ⇒ f (n) = Θ(g(n)) Για να ισχύει η πρόταση αυτή ϑα έπρεπε να ισχύει f (n) = O(g(n)) και g(n) = O(f (n)). ΄Οµως επειδή δεν γνωρίζουµε αν g(n) = O(f (n)), αλλά µόνο ότι g(n) = Ω(f (n)) τότε η πρόταση δεν ισχύει. Αν η πρόταση µας έλεγε ότι ισχύει f (n) = O(g(n)) και g(n) = Θ(f (n)) τότε η πρόταση ϑα ήταν αληθής.4Χωρίστε τη λίστα των συναρτήσεων σε κλάσεις, τέτοιες ώστε οι f (n) και g(n)να ανήκουν στην ίδια κλάση αν και µόνο αν f (n) = Θ(g(n)). Στη συνέχειαεπιλέξτε έναν εκπρόσωπο από κάθε κλάση και κατατάξτε τους κατά αύξουσασειρά πολυπλοκότητας n n2 −n n • = ... = 2 οπότε = Θ(n2 ) 2 2 • n log n = Θ(n log n) n 1 • k=1 k = log n + c = Θ(log n) • 8n2 = Θ(n2 ) √ 1 • log log n = log(log n)1/2 = 2 log log n = Θ(log log n) • n! = Θ(n!) • log log n = Θ(log log n) • nlog n = Θ(nlog n ) • log n! = Θ(n log n) 2 • 4log n = 22 log n = 2log n = n2 = Θ(n2 ) n n • k=0 = 2n = Θ(2n ) k 2 • 2log n = 2log n log n = nlog n = Θ(nlog n ) • 10100 = Θ(10100 ) • 2n = Θ(2n ) 5
  7. 7. • log n = Θ(log n) √ 1/2 √ √ • ( 2)log n = 21/2 log n = 2log n = n1/2 = n = Θ( n) • (n − 1)! = Θ((n − 1)!) • log nn = n log n = Θ(n log n) • 5800 = Θ(5800 ) √ √ • 5 n = Θ( n) Οπότε κατηγοριοποιώντας έχουµε : n • = 8n2 = 4log n = Θ(n2 ) 2 • n log n = log n! = log nn = Θ(n log n) √ • log log n = log log n = Θ(log log n) 2 • nlog n = 2log n = Θ(nlog n ) √ √ √ • ( 2)log n = 5 n = Θ( n) n n • k=0 = 2n = Θ(2n ) k • 5800 = 10100 = Θ(1) • (n − 1)! = Θ((n − 1)!) • n! = Θ(n!) n 1 • log n = k=1 k = Θ(log n) Αν επιλέξουµε έναν αντιπρόσωπο από κάθε κλάση µπορούµε να ταξινοµή-σουµε τις κλάσεις ως εξής : √ 10100 , log log n, log n, 5 n, n log n, 8n2 , nlog n , 2n , (n − 1)!, n!5Για κάθε Ϲεύγος εκφράσεων (A, B) του παρακάτω πίνακα αποφασίστε αν τοΑ είναι Ο, ο, Ω, ω ή Θ του Β. Υποθέστε ότι οι k ≥ 1, > 0 και c > 1είναι σταθερές. Απαντήστε σηµειώνοντας ένα `ναι΄ ή ένα `όχι΄ σε κάθε ϑέση τουπίνακα. 6
  8. 8. Α Β Ο ο Ω ω Θ a. logk n n ναι ναι b. nk cn ναι ναι c. 2n 2n/2 ναι ναι d. nlog c clog n ναι ναι ναι AΠαίρνουµε το όριο limn→∞ B . ΄Ετσι έχουµε,a. logk n ∞ k logk−1 n · 1 n lim = ∞ lim = n→∞ n n→∞ n −1 k logk−1 n k! lim = . . . = lim k n→∞ n n→∞ n Οπότε, k! 1 lim = =0 n→∞ k n ∞ Εποµένως, logk n = o(n ) ⇒ logk n = O(n ).b. nk ∞ knk−1 ∞ lim = ∞ lim n =∞ n→∞ cn n→∞ c · ln c k! 1 . . . = lim = =0 n→∞ cn · lnk c ∞ Εποµένως, nk = o(cn ) ⇒ nk = O(cn ).c. 2n 2n/2+n/2 2n/2 2n/2 lim = lim = lim = n→∞ 2n/2 n→∞ 2n/2 n→∞ 2n/2 lim 2n/2 = ∞ n→∞ Εποµένως, 2n = ω(2n/2 ) ⇒ 2n = Ω(2n/2 ).d. nlog c lim n→∞ clog n ΄Οµως γνωρίζουµε ότι nlog c = clog n , συνεπώς nlog c lim =1 n→∞ clog n Εποµένως, nlog c = Θ(clog n ). 7
  9. 9. 6 Ποια είναι η πολυπλοκότητα των παρακάτω τµηµάτων προγράµµατος ;Αλγόριθµος 1 n n n n 2 n2 4 2 n2 4 Θ(1) = Θ(1) 1 i=1 j=1 k=1 i=1 j=1 k=1 οπότε, n 2 n n4 Θ(1) · · n · = Θ(1) 4 2 8 Εποµένως ο αλγόριθµος είναι τάξης Θ(n4 ).Αλγόριθµος 2 n−1 2i j n−1 2i j ( ( Θ(1))) = Θ(1) ( ( 1)) i=1 j=1 k=1 i=1 j=1 k=1 ΄Ετσι υπολογίζουµε : j (1+1)j k=1 1 = 2 =j 2i (1+ni)ni 2 2 j=1 j = 2 = ni+n i 2 2 n−1 ni+n2 i2 i=1 2 = i=1 ( ni + (ni) ) = n−1 2 2 n−1 ni n−1 (ni)2 i=1 ( 2 + i=1 2 = n n−1 n2 n−1 2 2 i=1 i + 2 i=1 i = n (1+(n−1))(n−1) 2 2 2 + n (n−1)((n−1)+1)(2(n−1)+1) 2 6 = n (n2 −n) n2 n(n−1)(2n−1) 2 2 + 2 6 = n3 −n n3 (n−1)(2n−1) 4 + 12 Οπότε τελικά, ο αλγόριθµος προκύπτει ότι είναι τάξης Θ(n5 ). 7 Να υπολογίσετε τον χρόνο εκτέλεσης µέσης περίπτωσης του αλγορίθµου 3, δε- δοµένου ότι γνωρίζουµε πως το στοιχείο που ψάχνουµε (το k ) ϐρίσκεται στην τελευταία ϑέση µε πιθανότητα 1/4, στην προτελευταία ϑέση µε πιθανότητα 1/4, ενώ η πιθανότητα να ϐρίσκεται σε οποιαδήποτε από τις υπόλοιπες n − 2 1 ϑέσεις είναι ίση µε 4(n−2) , n ≥ 3. Αν ϑεωρήσουµε ως Dn το σύνολο των διαφορετικών εισόδων στο πρόβληµα και d ∈ D µια είσοδό του τότε : 8
  10. 10. • Πολυπλοκότητα στην ϐέλτιστη περίπτωση (Best Case Scenario): Cbcs (n) = min{κόστος(d), d ∈ Dn } Αν το k είναι το πρώτο στοιχείο της ακολουθίας, τότε ϑα κάνει 2 συγκρί- σεις (από τον έλεγχο της WHILE) και µια καταχώρηση (i = 0). Αν το k είναι το δεύτερο στοιχείο της ακολουθίας, τότε ϑα κάνει 4 συγκρίσεις και 2 καταχωρήσεις και γενικά αν είναι το i−οστό στοιχείο ϑα κάνει 2i συγκρίσεις και i καταχωρήσεις. • Πολυπλοκότητα στην χείριστη περίπτωση(Worst Case Scenario): Cwcs (n) = max{κόστος(d), d ∈ Dn } Στη χειρότερη περίπτωση που το k δεν ανήκει στην ακολουθία, τότε ο αλγόριθµος ϑα εκτελέσει 2n + 2 συγκρίσεις (στην τελευταία επανάληψη υποθέτουµε ότι ϑα κάνει και τις δύο συγκρίσεις) και n+1 καταχωρήσεις. Η πιθανότητα να µην ϐρίσκεται το k στην ακολουθία είναι 1 2 n−2 p = 1 − p ⇒ p = 1 − ((n − 2) + )= 4(n − 2) 4 4(n − 2) • Πολυπλοκότητα κατά µέσο όρο : Cµo (n) = d∈Dn p(d)κόστος(d) Η κατά µέσο όρο πολυπλοκότητα, είναι πόσες πράξεις κάνει (ή πόση µνήµη δεσµεύει) ο αλγόριθµος κατά µέσο όρο. ΄Ετσι µετράµε τις πράξεις (κόστος(d)) που κάνει ο αλγόριθµος για κάθε δυνατή είσοδο d ∈ Dn που δίνεται µε πιθανότητα p(d). ΄Ετσι έχουµε πολυπλοκότητα κατά µέσο όρο (για συγκρίσεις): 1 1 Cµo (n) = 2+ 4 + ... 4(n − 2) 4(n − 2) 1 1 n−2 + 2(n − 1) + 2n + 2(n + 1) 4 4 4(n − 2)΄Ετσι, n−2 1 6n − 1 Cµo (n) = 2i + 4(n − 2) 4 i=0 9

×