ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τομέας Ηλεκτρονικής και Υπολογιστών Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Καθηγητής: Περικλής Α. Μήτκας Δομές Δεδομένων 5 ο εξάμηνο Αλγόριθμοι και Πολυπλοκότητα Φώτης Ε. Ψωμόπουλος, Περικλής Α. Μήτκας. Εισαγωγή Κατά την ανάλυση ενός αλγορίθμου, ένα από τα πιο σημαντικά βήματα, πέρα από την ίδια τη λειτουργικότητα, είναι ο προσδιορισμός του χρόνου εκτέλεσής του καθώς και του χώρου που θα καταλαμβάνει. Οι δύο αυτοί παράγοντες επηρεάζουν την επιλογή ή όχι ενός αλγορίθμου για μια συγκεκριμένη εφαρμογή. Για παράδειγμα, μια εφαρμογή που θα τρέχει σε κινητό τηλέφωνο πρέπει να καταλαμβάνει κατά την εκτέλεσή της το λιγότερο δυνατό χώρο. Από την άλλη, μια εφαρμογή παρακολούθησης ασθενών σε νοσοκομείο πρέπει, για ευνόητους λόγους, να εκτελείται όσο το δυνατόν γρηγορότερα. Για την ποσοτικοποίηση των δυο αυτών παραγόντων εισάγονται οι έννοιες της χρονικής και χωρικής πολυπλοκότητας. Η χρονική πολυπλοκότητα προσδιορίζει το πλήθος των βημάτων που απαιτούνται για την εκτέλεση του αλγορίθμου, οπότε σηματοδοτεί τον συνολικό χρόνο εκτέλεσης. Η χωρική πολυπλοκότητα από την άλλη πλευρά προσδιορίζει το πλήθος των μεταβλητών που απαιτεί η εκτέλεση ενός αλγορίθμου, οπότε σηματοδοτεί τις απαιτήσεις του σε μνήμη. Η πολυπλοκότητα συνήθως εκφράζεται ως συνάρτηση μιας ή περισσοτέρων μεταβλητών του αλγορίθμου. Στον Πίνακα παρουσιάζονται μερικές κατηγορίες πολυπλοκότητας, με τις αντίστοιχες καμπύλες. Πίνακας : Κατηγορίες πολυπλοκότητας.. Ακριβής Ανάλυση Αλγορίθμου Στη συνέχεια θα μελετηθεί η χρονική πολυπλοκότητα του αλγορίθμου Ταξινόμησης Εισαγωγής (Iertio Sort). Ο τρόπος με τον οποίος δουλεύει ο αλγόριθμος είναι ο ακόλουθος:
Συγκρίνουμε το τρέχον στοιχείο a[i] με τα προηγούμενα στοιχεία a[i-], a[i-], Μόλις βρεθεί κάποιο στοιχείο a[k] μικρότερο του, a[i], μετακινούμε τα στοιχεία από a[k+] μέχρι a[i-] προς την επόμενη θέση (δηλαδή την κατεύθυνση στην οποία το i αυξάνει) και τοποθετούμε το τρέχον στοιχείο στη θέση k+. Ο αλγόριθμος τερματίζει όταν σαρώσουμε όλα τα στοιχεία του πίνακα. Ο ψευδοκώδικας της Ταξινόμησης Εισαγωγής παρουσιάζεται στο Πλαίσιο. Algorithm: IertioSort Iput : Array A Output : Sorted Array A (acedig) begi for j := to legth of A do { key := A[j]; /* put A[j] ito A[ j-] */ i := j ; while (i > 0 AND A[i] > key) do { A[i+] := A[i]; i := i + ; A[i+] := key ed Πλαίσιο : Ψευδοκώδικας αλγορίθμου IertioSort Στον Πίνακα βρίσκονται οι εντολές που απαρτίζουν τον αλγόριθμο, μαζί με το χρόνο εκτέλεσης (c i ) της κάθε μίας, εάν αυτή εκτελούνταν μόνο μία φορά. Lie IertioSort(A) #Exec. # It. for j:= to legth of A do c key := A[j] c - 3 /* put A[j] ito A[ j-] */ c3 = 0 / 4 i := j - c4-5 while (i > 0 AND A[i] > key) do c5 t j 6 A[i+] := A[i] c6 7 i := i + c7 8 A[i+] := key c8 - Πίνακας : Μελέτη του αλγορίθμου Iertio Sort. Για να μελετήσουμε την πολυπλοκότητα του παραπάνω αλγορίθμου, θα θεωρήσουμε ότι το πλήθος των στοιχείων του πίνακα Α είναι. Επομένως, η εντολή for εκτελείται συνολικά (-) + = φορές: (-) φορές καθώς το for ξεκινά από τη δεύτερη θέση του πίνακα Α, και μια επιπλέον όταν το j πάρει την τιμή legth +, οπότε και τερματίζεται ο βρόχος. Τα βήματα, 4 και 8, καθώς βρίσκονται μέσα στο βρόχο, θα εκτελεστούν - φορές (δηλαδή μία λιγότερη από τις επαναλήψεις της κεφαλίδας του βρόχου). Το πλήθος εκτελέσεων των βημάτων 5, 6 και 7 είναι λίγο πιο δύσκολο να υπολογισθεί, καθώς
δεν είναι πάντα σταθερό το πλήθος των στοιχείων A[j] τα οποία πρέπει να μετατοπισθούν προς τα δεξιά. Έστω t j το πλήθος των στοιχείων που πρέπει να μετατοπισθούν δεξιά για να εισαχθεί το στοιχείο A[j], αυξημένο κατά.τότε, το πλήθος επαναλήψεων του while (εντολή 5) θα είναι t + t 3 + + t. Με όμοιο τρόπο, οι εντολές 6 και 7 που ανήκουν στο βρόχο του while θα εκτελεσθούν η κάθε μία (t -) + (t 3 -) + + (t -) φορές. Εάν τώρα προσθέσουμε όλους τους χρόνους μαζί, ο συνολικός χρόνος εκτέλεσης του αλγορίθμου θα είναι: c + c ( ) + c ( ) + c t + c (t ) + c (t ) + c ( ) 4 5 j 6 j 7 j 8 j= j= j= Ο ακριβής προσδιορισμός του t j εξαρτάται από την εκάστοτε είσοδο, δηλαδή τον πίνακα Α. Bet Cae: Στην καλύτερη περίπτωση ο πίνακας είναι ήδη ταξινομημένος, οπότε ισχύει t j =, και η πολυπλοκότητα είναι η ακόλουθη: όπου C και D σταθερές. Wort Cae: c + (c + c4 + c5 + c 8) ( ) = C + D Η χειρότερη περίπτωση είναι όταν ο πίνακας Α είναι ταξινομημένος κατά φθίνουσα σειρά. Σε αυτή την περίπτωση ισχύει t j = j, και επομένως η εντολή 5 (κεφαλίδα του while) θα εκτελεσθεί: j= ( + ) j= ενώ οι εντολές 6 και 7 θα εκτελεσθούν συνολικά: j= (j ) = ( ) Οπότε η πολυπλοκότητα του αλγορίθμου στη χειρότερη περίπτωση είναι: + ( ) ( ) c + (c + c4 + c 8) ( ) + c5 + (c6 + c 7) = A + C + D όπου A, C και D σταθερές. 3
Άρα τελικά, εάν θεωρήσουμε ότι ο χρόνοι εκτέλεσης της κάθε εντολής είναι, μπορούμε να κάνουμε την γραφική παράσταση της πολυπλοκότητας του αλγορίθμου IertioSort, όπως φαίνεται στο Διάγραμμα. 700 600 Complexity of IertioSort Bet Cae Wort Cae Average 500 Number of tep 400 300 00 00 0 0 4 6 8 0 4 6 8 0 (umber of elemet i A) Διάγραμμα : Πολυπλοκότητα του Αλγορίθμου IertioSort. 3. Δεύτερο παράδειγμα υπολογισμού πολυπλοκότητας Έστω ο παρακάτω αλγόριθμος: Begi S := 0 for i := to do { for j := to i do { for k := to j*j do { S++ ed Πλαίσιο : Ψευδοκώδικας αλγορίθμου τριπλού loop 4
Εάν θεωρήσουμε ότι η εκτέλεση της εντολής S++ απαιτεί α χρόνο, τότε η συνάρτηση αναλυτικής πολυπλοκότητας f() του αλγορίθμου ορίζεται από το εξής άθροισμα: i j f() = α j= k= [ ] Στη συνέχεια η συνάρτηση αυτή αναλύεται σε απλούστερους όρους (ξεκινώντας πάντα από το εσωτερικό άθροισμα) ως εξής: i j i f() = [ α] f() = ( α j ) j= k= j= 3 i i i f() = α + + 3 6 α 3 α α f() = i + i + i 3 6 4 3 3 α α α f() = 3 + + 4 4 + + + + + 3 6 6 α 4 α 3 5 α α f() = + + + 3 6 Επομένως η τάξη πολυπλοκότητας του αλγορίθμου είναι O( 4 ). 5
4. Ταυτότητες Αθροισμάτων Ακολουθεί μια λίστα με χρήσιμες ταυτότητες αθροισμάτων: t ( ) Cf() = C f() = = C = ( + ) C t t t f() ± g() = [ f() ± g() ] = = = t t+ p f() = f( p) = = + p j t t f() + f() = f() = = j+ = x = ( m+ ) x m x = x t = H, όπου H ο αρμονικός αριθμός τάξης. i ( m + ) ( + m) i = m (+ ) 0 3 (+ ) ( + ) i = = + + 6 3 6 4 3 3 (+ ) i = = i = + + 4 4 5 4 3 4 (+ ) ( + ) (3 + 3 ) i = = + + 30 5 3 30 p+ p p ( + ) Bk p p k+ i = + (+ ), όπου Bk ο k αριθμός Beroulli 0 p+ k= p k+ k + m i x x x = m x + i x x = 0 x i x i x = ( x ( (x ) ) + ) ( x) 0 6
c c+ i =Θ( ) =Θ(log ) i i c =Θ(c ) c c log(i) =Θ( log() ) c d d c log(i) i =Θ( + log() ) 5. Ρυθμοί Αθροισμάτων c d i d c log(i) i b =Θ( log() b ) Γενικά ισχύει ότι: f () O( g() ) f () g() k f() Ω( g() ) f() g() k f() Θ( g() ) g() k f() g() k 7