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. 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. Αν 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. 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. √ 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. • 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. Α Β Ο ο Ω ω Θ
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. 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. • Πολυπλοκότητα στην ϐέλτιστη περίπτωση (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