You are on page 1of 256

Aλγόριθµοι και Πολυπλοκότητα

Σηµείωση
Το ΕΑΠ είναι υπεύθυνο για την επιµέλεια έκδοσης και την ανάπτυξη των κειµένων σύµφωνα µε τη Μεθο-
δολογία της εξ Αποστάσεως Εκπαίδευσης. Για την επιστηµονική αρτιότητα και πληρότητα των συγγραµ-
µάτων την αποκλειστική ευθύνη φέρουν οι συγγραφείς, κριτικοί αναγνώστες και ακαδηµαϊκοί υπεύθυνοι
που ανέλαβαν το έργο αυτό.
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
Σχολή Θετικών Επιστηµών και Τεχνολογίας

Πρόγραµµα Σπουδών
ΠΛHPOΦOPIKH

Θεµατική Ενότητα
ΘΕMΕΛΙΩΣΕΙΣ ΕΠΙΣΤΗΜΗΣ Η/Υ

Τόµος A'

Aλγόριθµοι και Πολυπλοκότητα


∆ΗΜΗΤΡΙΟΣ ΦΩΤΑΚΗΣ ΠΑΥΛΟΣ ΣΠΥΡΑΚΗΣ
∆ρ Mηχανικός H/Y & Πληροφορικής Kαθηγητής Tµήµατος Mηχ. H/Y & Πληροφορικής
Πανεπιστηµίου Πατρών

ΠATPA 2001
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
Σχολή Θετικών Επιστηµών και Τεχνολογίας

Πρόγραµµα Σπουδών
ΠΛHPOΦOPIKH
Θεµατική Ενότητα
ΘΕΜΕΛΙΩΣΕΙΣ ΕΠΙΣΤΗΜΗΣ Η/Υ
Τόµος A'
Aλγόριθµοι και Πολυπλοκότητα

Συγγραφή

∆HMHTPIOΣ ΦΩTAKHΣ ΠAYΛOΣ ΣΠYPAKHΣ


∆ρ Mηχανικός H/Y & Πληροφορικής Kαθηγητής Tµήµατος Mηχ. H/Y & Πληροφορικής
Πανεπιστηµίου Πατρών

Κριτική Ανάγνωση
∆ΗΜΗΤΡΙΟΣ ΚΑΒΒΑ∆ΙΑΣ
Eπίκουρος Kαθηγητής Tµήµατος Mαθηµατικών
Πανεπιστηµίου Πατρών

Ακαδηµαϊκός Υπεύθυνος για την επιστηµονική επιµέλεια του τόµου


ΠΑΝΑΓΙΩΤΗΣ ΠΙΝΤΕΛΑΣ
Kαθηγητής Tµήµατος Mαθηµατικών Πανεπιστηµίου Πατρών

Επιµέλεια στη µέθοδο της εκπαίδευσης από απόσταση


HΛIAΣ ΣTAYPOΠOYΛOΣ
Γλωσσική Επιµέλεια
IΩANNHΣ ΘEOΦIΛAΣ
Τεχνική Επιµέλεια
TYPORAMA
Καλλιτεχνική Επιµέλεια, Σελιδοποίηση
TYPORAMA
Συντονισµός ανάπτυξης εκπαιδευτικού υλικού και γενική επιµέλεια των εκδόσεων
ΟΜΑ∆Α ΕΚΤΕΛΕΣΗΣ ΕΡΓΟΥ ΕΑΠ / 2001

ISBN: 960–538–353–5
Kωδικός Έκδοσης: ΠΛH 30/1

Copyright 2001 για την Ελλάδα και όλο τον κόσµο


ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
Οδός Παπαφλέσσα & Υψηλάντη, 26222 Πάτρα – Τηλ: (0610) 314094, 314206 Φαξ: (0610) 317244
Σύµφωνα µε το Ν. 2121/1993, απαγορεύεται η συνολική ή αποσπασµατική αναδηµοσίευση του βιβλίου αυτού
ή η αναπαραγωγή του µε οποιοδήποτε µέσο χωρίς την άδεια του εκδότη.
¶ÂÚȯfiÌÂÓ·

K∂º∞§∞π√ 1
EÈÛ·ÁˆÁÈΤ˜ ¤ÓÓÔȘ

Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά,


Eισαγωγικές παρατηρήσεις .................................................................................................................................... 15
1.1 Tι είναι αλγόριθµος; ................................................................................................................................... 17

1.2 Aναπαράσταση αλγορίθµων ............................................................................................................... 19

1.3 Προβλήµατα και στιγµιότυπα ............................................................................................................ 21

1.4 Aποτελεσµατικότητα αλγορίθµων ................................................................................................ 22


1.4.1 Aσυµπτωτική εκτίµηση .......................................................................................................... 22
1.4.2 Aνάλυση αλγορίθµων ............................................................................................................... 24
1.4.3 Aνάλυση χειρότερης και µέσης περίπτωσης ........................................................ 26

1.5 Aνάγκη για αποδοτικούς αλγόριθµους ...................................................................................... 27

Σύνοψη ................................................................................................................................................................................... 29

Bιβλιογραφία ..................................................................................................................................................................... 30

K∂º∞§∞π√ 2
M·ıËÌ·ÙÈÎfi ˘fi‚·ıÚÔ

Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά,


Eισαγωγικές παρατηρήσεις .................................................................................................................................... 33
2.1 Aσυµπτωτικός συµβολισµός .............................................................................................................. 35
2.1.1 O συµβολισµός Θ ......................................................................................................................... 35
2.1.2 O συµβολισµός O ......................................................................................................................... 37
2.1.3 O συµβολισµός Ω ......................................................................................................................... 39
2.1.4 O συµβολισµός ο .......................................................................................................................... 41
2.1.5 O συµβολισµός ω ......................................................................................................................... 41
2.1.6 Aσυµπτωτικός συµβολισµός σε µαθηµατικές εκφράσεις ......................... 42
2.2 Aθροίσµατα ....................................................................................................................................................... 43
6 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

2.2.1 Mαθηµατική επαγωγή .............................................................................................................. 44


2.2.2 Yπολογισµός φραγµάτων ...................................................................................................... 45
2.3 Aναδροµικές εξισώσεις ........................................................................................................................... 46
2.3.1 Παράδειγµα αναδροµικού αλγορίθµου ..................................................................... 47
2.3.2 Mέθοδος επανάληψης .............................................................................................................. 50
2.3.3 Mέθοδος αντικατάστασης ..................................................................................................... 52
2.3.4 Θεώρηµα κυριαρχίας ................................................................................................................ 54

Σύνοψη ................................................................................................................................................................................... 56
Bιβλιογραφία ..................................................................................................................................................................... 57

K∂º∞§∞π√ 3
¢È·›ÚÂÈ Î·È B·Û›Ï¢Â

Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά,


Eισαγωγικές παρατηρήσεις .................................................................................................................................... 59
3.1 Quicksort ............................................................................................................................................................. 61
3.1.1 Xρήση τυχαιότητας και ανάλυση µέσης τιµής ................................................... 64
3.1.2 Eλάχιστος χρόνος εκτέλεσης αλγορίθµων διάταξης ..................................... 67
3.2 Tο πρόβληµα της επιλογής .................................................................................................................. 69
3.2.1 Nτετερµινιστική επιλογή σε γραµµικό χρόνο ..................................................... 71
3.3 Πολλαπλασιασµός αριθµών και πινάκων ................................................................................ 76
3.3.1 Πολλαπλασιασµός διδιάστατων πινάκων ............................................................... 77
3.4 Πολυώνυµα και FFT .................................................................................................................................. 79
3.4.1 ∆ιακριτός µετασχηµατισµός Fourier (DFT) και FFT ................................... 82

Σύνοψη ................................................................................................................................................................................... 87
Bιβλιογραφία ..................................................................................................................................................................... 88

K∂º∞§∞π√ 4
¢˘Ó·ÌÈÎfi˜ ÚÔÁÚ·ÌÌ·ÙÈÛÌfi˜

Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά,


Eισαγωγικές παρατηρήσεις .................................................................................................................................... 89
¶EPEXOMENA 7

4.1 Πολλαπλασιασµός ακολουθίας πινάκων ................................................................................. 91


4.2 Xαρακτηριστικά του δυναµικού προγραµµατισµού ...................................................... 96

4.2 Mεγαλύτερη κοινή υπακολουθία .................................................................................................... 98

Σύνοψη ................................................................................................................................................................................ 103

Bιβλιογραφία .................................................................................................................................................................. 104

K∂º∞§∞π√ 5
ÕÏËÛÙÔÈ ·ÏÁfiÚÈıÌÔÈ

Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά,


Eισαγωγικές παρατηρήσεις ................................................................................................................................ 105
5.1 Eπιλογή ανταγωνιστικών δραστηριοτήτων ........................................................................ 107
5.1.1 Aπόδειξη ορθότητας ............................................................................................................... 109
5.2 Xαρακτηριστικά της µεθόδου της απληστίας ................................................................... 112
5.2.1 Iδιότητα της άπληστης επιλογής .................................................................................. 112
5.2.2 Iδιότητα βέλτιστων επιµέρους δοµών ..................................................................... 113
5.2.3 Mέθοδος απληστίας και δυναµικός προγραµµατισµός ............................ 113
5.3 Συµπίεση δεδοµένων – Kώδικας Huffman ......................................................................... 116
5.3.1 O κώδικας Huffman ................................................................................................................ 119

Σύνοψη ................................................................................................................................................................................ 124

Bιβλιογραφία .................................................................................................................................................................. 125

K∂º∞§∞π√ 6
AÏÁfiÚÈıÌÔÈ ÂÍÂÚ‡ÓËÛ˘ ÁÚ·ÊËÌ¿ÙˆÓ

Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά,


Eισαγωγικές παρατηρήσεις ................................................................................................................................ 127
6.1 Oρισµοί και αναπαράσταση γραφηµάτων ........................................................................... 129
6.1.1 Αναπαράσταση γραφηµάτων ............................................................................................ 133
6.2 Ψάξιµο πρώτα σε πλάτος .................................................................................................................... 135
6.3 Ψάξιµο σε βάθος ........................................................................................................................................ 138
8 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

Σύνοψη ................................................................................................................................................................................ 144

Bιβλιογραφία .................................................................................................................................................................. 144

K∂º∞§∞π√ 7
EÈÛ·ÁˆÁ‹ ÛÙËÓ ˘ÔÏÔÁÈÛÙÈ΋ ÔÏ˘ÏÔÎfiÙËÙ·

Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά,


Eισαγωγικές παρατηρήσεις ................................................................................................................................ 145
7.1 Aλγόριθµοι και προβλήµατα ........................................................................................................... 146
7.1.1 Eυεπίλυτα και δυσεπίλυτα προβλήµατα ................................................................ 149
7.2 Nτετερµινιστικές µηχανές Turing ............................................................................................... 151
7.2.1 Λειτουργικά χαρακτηριστικά των µηχανών Turing .................................... 153
7.2.2 Kαθολικές µηχανές Turing ............................................................................................... 155
7.2.3 Γλώσσες που αποφασίζονται από µηχανές Turing ...................................... 157
7.3 Xρονική πολυπλοκότητα και η κλάση P ............................................................................... 158
7.3.1 Iεραρχία κλάσεων χρονικής πολυπλοκότητας ................................................. 159
7.3.2 H κλάση P ....................................................................................................................................... 162
7.4 Aναγωγή και πληρότητα ..................................................................................................................... 165

Σύνοψη ................................................................................................................................................................................ 168

Bιβλιογραφία .................................................................................................................................................................. 169

K∂º∞§∞π√ 8
MË ÓÙÂÙÂÚÌÈÓÈÛÌfi˜ Î·È NP–ÏËÚfiÙËÙ·

Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά,


Eισαγωγικές παρατηρήσεις ................................................................................................................................ 171
8.1 Mη ντετερινιστικές µηχανές Turing .......................................................................................... 173
8.1.1 Γλώσσες αποδεκτές και αποφασίσιµες από NDTM ................................... 173
8.1.2 H κλάση NTIME ...................................................................................................................... 175
8.2 H κλάση NP ................................................................................................................................................... 177
8.3 NP–πληρότητα ............................................................................................................................................ 179
¶EPEXOMENA 9

8.3.1 NP – πλήρη προβλήµατα ...................................................................................................... 182

Σύνοψη ................................................................................................................................................................................ 189

Bιβλιογραφία .................................................................................................................................................................. 190

Aπαντήσεις Aσκήσεων Aυτοαξιολόγησης ......................................................................................... 191

Απαντήσεις ∆ραστηριοτήτων ....................................................................................................................... 217

Γλωσσάρι .......................................................................................................................................................................... 243


¶ÚfiÏÔÁÔ˜
Αυτό το βιβλίο αποτελεί µία σύντοµη εισαγωγή στη Θεωρία Αλγορίθµων και στη
Θεωρία Υπολογιστικής Πολυπλοκότητας. Και τα δύο αυτά πεδία της Επιστήµης των
Υπολογιστών έχουν να επιδείξουν µερικά πολύ σηµαντικά επιτεύγµατα και γνωρί-
ζουν µεγάλη άνθηση τα τελευταία χρόνια.
Για να λυθεί ένα οποιοδήποτε πρακτικό πρόβληµα από έναν Ηλεκτρονικό Υπολογι-
στή πρέπει πρώτα να αποδελτιωθούν τα χαρακτηριστικά του προβλήµατος και, µε
βάση αυτά, να διατυπωθεί το αντίστοιχο υπολογιστικό πρόβληµα, δηλαδή ένα πρό-
τυπο µαθηµατικό πρόβληµα που συγκεντρώνει όλα τα χαρακτηριστικά του αρχικού.
Με βάση το µαθηµατικό/υπολογιστικό πρόβληµα, πρέπει να σχεδιαστεί ένας αλγό-
ριθµος και να αναλυθεί η συµπεριφορά του για συνθήκες παρόµοιες µε αυτές που
εµφανίζονται στην πράξη. Αν η απόδοση του αλγόριθµου είναι ικανοποιητική, µπο-
ρούµε να προχωρήσουµε στην υλοποίηση και την εφαρµογή του. ∆ιαφορετικά, πρέ-
πει να σχεδιάσουµε έναν τροποποιηµένο αλγόριθµο, ο οποίος θα επιτυγχάνει ικανο-
ποιητική απόδοση.
Η Θεωρία Αλγορίθµων είναι η περιοχή της Επιστήµης των Υπολογιστών που πραγ-
µατεύεται το σχεδιασµό αποδοτικών αλγορίθµων για την επίλυση υπολογιστικών
προβληµάτων. Κάθε αλγόριθµος πρέπει να αναλύεται µαθηµατικά, ώστε να τεκµη-
ριώνεται η ορθότητά του και να µετριέται ποσοτικά η απόδοσή του σε σχέση µε διά-
φορα είδη υπολογιστικών πόρων, όπως είναι ο χρόνος και η µνήµη. Με αυτό τον
τρόπο, οποιοσδήποτε χρειαστεί να εφαρµόσει τον αλγόριθµο θα είναι σίγουρος για
την ορθότητα των αποτελεσµάτων του και θα γνωρίζει ακριβώς την ποσότητα των
υπολογιστικών πόρων που απαιτεί η εφαρµογή του αλγόριθµου σε συγκεκριµένες
συνθήκες. Επιπλέον, τα αποτελέσµατα της ανάλυσης διαφορετικών αλγόριθµων για
το ίδιο ή παρόµοια προβλήµατα επιτρέπουν τη σύγκριση µεταξύ τους και την επι-
λογή του καταλληλότερου για συγκεκριµένες πρακτικές εφαρµογές.
Η Θεωρία Αλγορίθµων εφοδιάζει τους σχεδιαστές συστηµάτων λογισµικού µε ένα µεγά-
λο αριθµό αλγόριθµων για την αποδοτική επίλυση των πιο συνηθισµένων προβληµά-
των, όπως αυτά της διάταξης, της αναζήτησης, της επιλογής στοιχείων, κλπ. Επιπλέον,
εφοδιάζει τους σχεδιαστές αλγόριθµων µε ένα σύνολο τεχνικών και µεθόδων για το σχε-
διασµό και την ανάλυση αποδοτικών αλγόριθµων για προβλήµατα που εµφανίζονται
στην πράξη και δεν έχουν αντιµετωπιστεί ικανοποιητικά. Σε αυτό το βιβλίο προσπα-
θήσαµε να παρουσιάσουµε τόσο µερικά παραδείγµατα αποδοτικών αλγόριθµων για την
επίλυση µερικών θεµελιωδών υπολογιστικών προβληµάτων, όσο και µερικές από τις
πιο δηµοφιλείς και επιτυχηµένες µεθόδους σχεδιασµού και ανάλυσης αλγόριθµων.
12 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

Παρά τις σηµαντικές προόδους της Θεωρίας Αλγορίθµων και τις επίµονες και µακρο-
χρόνιες προσπάθειες πλήθους ικανών επιστηµόνων, υπάρχουν πολλά σηµαντικά προ-
βλήµατα για τα οποία δεν έχουµε κατορθώσει να σχεδιάσουµε αποδοτικούς αλγό-
ριθµους. Η Θεωρία Υπολογιστικής Πολυπλοκότητας αναπτύχθηκε για να µελετήσει
τους λόγους για τους οποίους κάποια υπολογιστικά προβλήµατα είναι δύσκολο ή
αδύνατο να λυθούν από έναν Υπολογιστή.
Η Θεωρία Υπολογιστικής Πολυπλοκότητας εστιάζει στη µελέτη διαφορετικών υπο-
λογιστικών µοντέλων και στην επίδραση που αυτά έχουν στη δυνατότητα και στην
ποσότητα υπολογιστικών πόρων που χρειάζονται για την επίλυση ενός προβλήµα-
τος. Για κάθε υπολογιστικό µοντέλο, η Θεωρία Υπολογιστικής Πολυπλοκότητας
µελετά αν ένα υπολογιστικό πρόβληµα µπορεί να επιλυθεί ή όχι. Αν το πρόβληµα
µπορεί να επιλυθεί, η Θεωρία Πολυπλοκότητας µελετά την ελάχιστη ποσότητα υπο-
λογιστικών πόρων που απαιτούνται για την επίλυση του προβλήµατος στο συγκε-
κριµένο µοντέλο. Με βάση τις απαντήσεις στα παραπάνω ερωτήµατα, τα υπολογι-
στικά προβλήµατα εντάσσονται σε κλάσεις πολυπλοκότητας, οι οποίες αποτελού-
νται από προβλήµατα που εµφανίζουν παρόµοια συµπεριφορά ως προς την επιλυσι-
µότητά τους σε κάποιο συγκεκριµένο υπολογιστικό µοντέλο.
Η Θεωρία Υπολογιστικής Πολυπλοκότητας µας εφοδιάζει µε ένα σηµαντικό αριθ-
µό κλάσεων πολυπλοκότητας, στις οποίες έχουν ενταχθεί πολλά συνηθισµένα υπο-
λογιστικά προβλήµατα. Επιπλέον, µας εφοδιάζει µε τεχνικές και µεθόδους για την
ένταξη και νέων υπολογιστικών προβληµάτων σε αυτές τις κλάσεις πολυπλοκότη-
τας. Έχοντας εντάξει ένα πρόβληµα σε µία κλάση πολυπλοκότητας, γνωρίζουµε κατά
πόσον υπάρχει αποδοτικός αλγόριθµος για την επίλυση αυτού του προβλήµατος.
Εποµένως, µία από τις αλγοριθµικές εφαρµογές της Υπολογιστικής Πολυπλοκότη-
τας είναι ότι συχνά µας επιτρέπει να αποφύγουµε τη µάταια αναζήτηση αποδοτικών
αλγόριθµων για προβλήµατα για τα οποία εικάζεται ή έχει αποδειχθεί ότι τέτοιοι
αλγόριθµοι δεν υπάρχουν.
Οι παραπάνω εισαγωγικές παρατηρήσεις θέτουν σε γενικές γραµµές το πλαίσιο που
κινείται αυτό το βιβλίο. Η ύλη που καλύπτεται στο βιβλίο έχει χωρισθεί σε οκτώ
κεφάλαια, τα δύο πρώτα από τα οποία µπορούν να χαρακτηρισθούν εισαγωγικά, τα
τέσσερα επόµενα καλύπτουν αλγοριθµικά θέµατα, και τα δύο τελευταία ζητήµατα
από τη Θεωρία Πολυπλοκότητας. Το βιβλίο έχει γραφεί ώστε η µελέτη του να προ-
ϋποθέτει µόνο µια στοιχειώδη εξοικείωση µε κάποιες θεµελιώδεις µαθηµατικές έννοι-
ες και τεχνικές από την πλευρά του αναγνώστη. Όλες οι έννοιες της Θεωρίας Αλγο-
ρίθµων και της Θεωρίας Υπολογιστικής Πολυπλοκότητας ορίζονται την πρώτη φορά
που χρησιµοποιούνται, ενώ σε ειδικό κεφάλαιο, περιγράφονται αναλυτικά οι βασι-
¶ƒ√§√°√™ 13

κές µαθηµατικές τεχνικές που χρησιµοποιούνται στην ανάλυση αλγόριθµων.


Από τα εισαγωγικά κεφάλαια, το Κεφάλαιο 1 εισάγει τον αναγνώστη στην έννοια
του αλγόριθµου και εξηγεί τις έννοιες του σχεδιασµού, της ανάλυσης και της απο-
τελεσµατικότητας ενός αλγόριθµου, ενώ προσδιορίζει και έναν τρόπο αναπαράστα-
σης των αλγόριθµων που θα παρουσιαστούν στη συνέχεια του βιβλίου. Το Κεφά-
λαιο 2 παρουσιάζει τα βασικά µαθηµατικά εργαλεία που χρησιµοποιούνται για το
σχεδιασµό και την ανάλυση των αλγορίθµων.
Τα Κεφάλαια 3, 4 και 5 εστιάζουν σε τρεις βασικές, γενικές µεθόδους σχεδιασµού
αλγορίθµων: τη µέθοδο του «∆ιαίρει και Βασίλευε», τη µέθοδο του ∆υναµικού Προ-
γραµµατισµού και τη µέθοδο της Απληστίας. Για κάθε µέθοδο, αναλύονται τα βασι-
κά χαρακτηριστικά της µεθόδου και των προβληµάτων που µπορούν να επιλυθούν
αποτελεσµατικά µε αυτή, και παρουσιάζονται παραδείγµατα αλγόριθµων που ακο-
λουθούν αυτή τη µέθοδο και επιλύουν σηµαντικά πρακτικά προβλήµατα. Το Κεφά-
λαιο 6 εισάγει τον αναγνώστη στη µαθηµατική οντότητα του γραφήµατος, η οποία
παίζει κεντρικό ρόλο στη µοντελοποίηση πολλών σηµαντικών πρακτικών προβλη-
µάτων, και παρουσιάζει δύο θεµελιώδεις αλγοριθµικές τεχνικές, αυτές του Ψαξίµα-
τος Πρώτα σε Πλάτος και του Ψαξίµατος Πρώτα σε Βάθος, για την εξερεύνηση και
τον έλεγχο γραφηµάτων για συγκεκριµένες ιδιότητες.
Τα Κεφάλαια 7 και 8 αποτελούν µία εισαγωγή στη Θεωρία Υπολογιστικής Πολυ-
πλοκότητας. Στο Κεφάλαιο 7 ορίζεται η έννοια του προβλήµατος απόφασης και η
αντιστοιχία αυτών των προβληµάτων µε τις τυπικές γλώσσες, το υπολογιστικό
µοντέλο των Ντετερµινιστικών Μηχανών Turing, οι πιο σηµαντικές κλάσεις πολυ-
πλοκότητας περιορισµένου ντετερµινιστικού χρόνου και οι κεντρικές έννοιες της
αναγωγής µεταξύ υπολογιστικών προβληµάτων και της πληρότητας ενός προβλή-
µατος για µία κλάση πολυπλοκότητας. Στο Κεφάλαιο 8 παρουσιάζεται η έννοια
του µη ντετερµινισµού, ορίζεται το υπολογιστικό µοντέλο των Μη Ντετερµινιστι-
κών Μηχανών Turing και γίνεται µία σύντοµη εισαγωγή στη Θεωρία της NP – πλη-
ρότητας, ένα από τα πιο σηµαντικά επιτεύγµατα της Θεωρίας Υπολογιστικής
Πολυπλοκότητας.
Κλείνοντας αυτό το σύντοµο εισαγωγικό σηµείωµα, θα θέλαµε να εκφράσουµε τις
ευχαριστίες µας σε όλους τους συνεργάτες και συναδέλφους µας που βοήθησαν στην
ολοκλήρωση αυτού του βιβλίου. Ιδιαίτερα θα θέλαµε να ευχαριστήσουµε τον Καθη-
γητή κ. Παναγιώτη Πυντέλα, που υπήρξε ο Ακαδηµαϊκός Υπεύθυνος για την επι-
στηµονική επιµέλεια αυτού του βιβλίου, τον Επίκουρο Καθηγητή κ. ∆ηµήτρη Καβ-
βαδία, ο οποίος µε την προσεκτική του ανάγνωση και τα σχόλιά του συνεισέφερε
14 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

σηµαντικά στην ουσιαστική βελτίωση της ποιότητας αυτού του τόµου, και τον Ανα-
πληρωτή Καθηγητή κ. Θανάση Χατζηλάκο, ο οποίος βοήθησε σηµαντικά στο να
εκδοθεί αυτό το βιβλίο στην παρούσα του µορφή.
Παύλος Σπυράκης
∆ηµήτρης Φωτάκης
Πάτρα, Ιούνιος 2001
EÈÛ·ÁˆÁÈΤ˜ ¤ÓÓÔȘ

™ÎÔfi˜
∫ ∂

Σκοπός αυτού του κεφαλαίου είναι να οριστούν οι βασικές έννοιες του αλγόριθµου,
του προβλήµατος και του στιγµιότυπου, της ανάλυσης των αλγορίθµων, της αρχής
του αναλλοίωτου και της ασυµπτωτικής εκτίµησης, οι οποίες θα χρησιµοποιηθούν
στη συνέχεια του βιβλίου.
1
º ∞ § ∞ π √

¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·

Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση:

• Να περιγράφει απλούς αλγορίθµους σε ψευδοκώδικα και να εξηγεί τη λειτουργία


απλών αλγορίθµων που έχουν περιγραφεί σε ψευδοκώδικα.

• Να επιλέγει τον καταλληλότερο αλγόριθµο για µια συγκεκριµένη κατηγορία στιγ-


µιότυπων.

• Να δίνει µια ασυµπτωτική εκτίµηση χρόνου εκτέλεσης για απλούς αλγορίθµους.

ŒÓÓÔȘ ÎÏÂȉȿ
• αλγόριθµος τική εκτίµηση
• πρόβληµα, στιγµιότυπο και µέγεθος • ανάλυση αλγορίθµων
στιγµιότυπου • ανάλυση χειρότερης και µέσης περί-
• αρχή του αναλλοίωτου και ασυµπτω- πτωσης

∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Ένας αποδοτικός αλγόριθµος πρέπει να κάνει ακριβώς αυτό που έχει σχεδιαστεί να κάνει,
µε το µικρότερο δυνατό κόστος. Αν και υπάρχουν µια σειρά από τεχνικές και µεθοδολο-
γίες που βοηθούν στο σχεδιασµό αλγορίθµων για διάφορες κατηγορίες προβληµάτων, ο
σχεδιασµός ενός αποδοτικού αλγορίθµου είναι συχνά µια πολύ δύσκολη υπόθεση.
Μετά το σχεδιασµό του αλγορίθµου, που συνήθως ολοκληρώνεται µε την περιγραφή
του σε ψευδοκώδικα, ο σχεδιαστής πρέπει να ελέγξει την ορθότητα του αλγορίθµου,
δηλαδή το αν ο αλγόριθµος πραγµατικά κάνει τη δουλειά για την οποία έχει σχεδιαστεί.
16 KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™

Η επιβεβαίωση της ορθότητας ανοίγει το δρόµο για την ανάλυση του αλγορίθµου,
δηλαδή για τον προσδιορισµό των υπολογιστικών πόρων που απαιτεί η εκτέλεση του
αλγορίθµου. Μεταξύ άλλων, η ανάλυση αφορά στο χρόνο εκτέλεσης του αλγορίθµου.
Επειδή µεγαλύτερα στιγµιότυπα ενός προβλήµατος είναι πάντα δυσκολότερο να
λυθούν, οι πόροι που καταναλώνει ο αλγόριθµος προσδιορίζονται σαν αύξουσα
συνάρτηση του µεγέθους του στιγµιότυπου εισόδου. Η ανάλυση ενός αλγορίθµου
συχνά απαιτεί τη χρήση µαθηµατικών τεχνικών για την επίλυση αναδροµικών εξι-
σώσεων, την εύρεση κλειστών τύπων αθροισµάτων, κλπ. Τα αποτελέσµατα της ανά-
λυσης τεκµηριώνουν την αποδοτικότητα του αλγορίθµου.
Ένα τελευταίο στάδιο είναι ο προσδιορισµός κάτω φραγµάτων στην αποδοτικότητα
των αλγορίθµων για ένα συγκεκριµένο πρόβληµα. Ο προσδιορισµός ενός κάτω φράγ-
µατος επιτρέπει στο σχεδιαστή να γνωρίζει το βαθµό στον οποίο µπορεί να βελτιω-
θεί η αποδοτικότητα των αλγορίθµων για το προς επίλυση πρόβληµα.
Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες:
1.1. Τι είναι αλγόριθµος;
1.2. Αναπαράσταση αλγόριθµων
1.3. Προβλήµατα και στιγµιότυπα
1.4. Αποτελεσµατικότητα αλγόριθµων
1.5. Ανάγκη για αποδοτικούς αλγόριθµους
1.1 ∆π ∂π¡∞π ∞§°√ƒπ£ª√™; 17

1.1 ∆È ∂›Ó·È ·ÏÁfiÚÈıÌÔ˜;

Το Λεξικό της Οξφόρδης (Concise Oxford Dictionary) ορίζει ως αλγόριθµο µια δια-
δικασία ή ένα σύνολο κανόνων µε σκοπό τον υπολογισµό (ιδιαίτερα το µηχανιστι-
κό υπολογισµό). Η εκτέλεση ενός αλγορίθµου δεν θα πρέπει, εποµένως, να απαιτεί
τη χρήση της διαίσθησης ή της δηµιουργικότητας, µολονότι τα όρια µεταξύ αλγο-
ρίθµων και ανθρώπινων σχεδίων προς εκτέλεση είναι όλο και περισσότερο δυσδιά-
κριτα, π.χ. η χρήση τυχαιότητας στους αλγορίθµους.
Κάθε αλγόριθµος δέχεται ένα σύνολο δεδοµένων εισόδου (input), τα οποία µετα-
σχηµατίζει σε ένα σύνολο δεδοµένων εξόδου (output). Εποµένως, ένας αλγόριθµος
µπορεί να θεωρηθεί και σαν ένα εργαλείο για την επίλυση ενός υπολογιστικού προ-
βλήµατος, όπου ο ορισµός του προβλήµατος καθορίζει την επιθυµητή σχέση µετα-
ξύ των δεδοµένων εισόδου και εξόδου.
Στο βιβλίο αυτό µε τον όρο αλγόριθµος θα εννοούµε µια «συνταγή» ή ένα καθορισµέ-
νο σύνολο κανόνων ή οδηγιών για την επίλυση ενός υπολογιστικού προβλήµατος. Κατά
νου θα έχουµε ότι το έργο αυτό θα εκτελεσθεί µέσω µίας εξελιγµένης υπολογιστικής
µηχανής (ενός Υπολογιστή – Computer). Όπως συµβαίνει µε κάθε συνηθισµένη «συντα-
γή», ένας αλγόριθµος πρέπει να έχει πεπερασµένη περιγραφή και να οδηγεί στην επί-
λυση του προβλήµατος ύστερα από την εκτέλεση πεπερασµένου αριθµού βηµάτων.
Όχι νωρίτερα από το 1930, διάφοροι µαθηµατικοί ορισµοί της έννοιας µιας «πεπε-
ρασµένης υπολογιστικής διαδικασίας» δόθηκαν από τους Church, Godel, Herbrand,
Kleene, Post, Turing, και άλλους. Οι ορισµοί αυτοί είχαν ως βάση µεθόδους που επι-
φανειακά εµφανίζονταν πολύ διαφορετικές µεταξύ τους (π.χ. τυπικά συστήµατα επε-
ξεργασίας συµβόλων, ιδανικά µοντέλα υπολογιστικών µηχανών). Όµως, όλοι οι ορι-
σµοί αυτοί καταλήγουν στο να είναι ισοδύναµοι, µε την έννοια ότι όλες οι «µορφές»
αλγορίθµων υπολογίζουν την ίδια κατηγορία συναρτήσεων, η οποία είναι ακριβώς η
κατηγορία των µερικώς αναδροµικών συναρτήσεων (partial recursive functions).
Μέχρι τώρα, και παρά τις προόδους της τεχνολογίας, το σύνολο της εµπειρίας µας
καταδεικνύει ότι η κλάση των συναρτήσεων αυτών είναι ακριβώς ότι µπορεί να υπο-
λογισθεί συστηµατικά (από υπολογιστές, προγράµµατα, ή πεπερασµένες διαδικασίες).
Οι µέθοδοι πολλαπλασιασµού και διαίρεσης (πολυψηφίων) αριθµών που µαθαίνου-
µε στο σχολείο είναι αλγόριθµοι, αφού αποτελούν µία «συνταγή» για τον µετασχη-
µατισµό ενός ζεύγους αριθµών στο γινόµενό τους και στο πηλίκο τους αντίστοιχα.
Ο πλέον γνωστός ιστορικά αλγόριθµος είναι ο αλγόριθµος του Ευκλείδη για τον υπο-
λογισµό του Μέγιστου Κοινού ∆ιαιρέτη δύο ακεραίων.
Οι αλγόριθµοι είναι λοιπόν οι συνταγές µε βάση τις οποίες οι υπολογιστές απαντούν
18 KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™

σε προβλήµατα. Η επιλογή ενός αλγορίθµου για κάποιο πρόβληµα εξαρτάται από


πολλούς παράγοντες: το µέγεθος του στιγµιότυπου (δηλ. της συγκεκριµένης µορ-
φής) του προβλήµατος, τον τρόπο αναπαράστασης του προβλήµατος, την ταχύτητα
και το µέγεθος της µνήµης, καθώς και τη διαθεσιµότητα άλλων υπολογιστικών
πόρων (αριθµό επεξεργαστών, δίκτυο κλπ.).

¶·Ú¿‰ÂÈÁÌ·1.1

∞ÏÁfiÚÈıÌÔ˜ ÔÏÏ·Ï·ÛÈ·ÛÌÔ‡
Έστω ότι πρέπει να πολλαπλασιάσουµε δύο θετικούς ακεραίους µε χρήση µόνο στυλό
και χαρτιού. Το ∆ηµοτικό Σχολείο µάς διδάσκει να πολλαπλασιάσουµε τον ένα από τους
αριθµούς (τον «µεγαλύτερο» σε µήκος, τον πολλαπλασιαστέο) διαδοχικά µε κάθε ψηφίο
του πολλαπλασιαστή από δεξιά προς τα αριστερά. Έπειτα, γράφουµε το κάθε ενδιάµεσο
αποτέλεσµα κάτω από το προηγούµενο, κάθε φορά µετατοπίζοντας µια θέση αριστερά.
Τέλος, προσθέτουµε κατά στήλη (µε κρατούµενα) για να βρούµε το σωστό αποτέλεσµα.
Αυτός είναι ο «κλασσικός» αλγόριθµος πολλαπλασιασµού. Υπάρχουν και άλλοι τρό-
ποι, π.χ. ο πολλαπλασιασµός a la russe: Γράψτε τον πολλαπλασιαστέο και τον πολ-
λαπλασιαστή δίπλα – δίπλα. ∆ηµιουργήστε δύο στήλες (µία για κάθε αριθµό), επα-
ναλαµβάνοντας τον εξής κανόνα, έως ότου ο αριθµός κάτω από τον πολλαπλασια-
στέο γίνει 1: Γράψτε στη στήλη κάτω από τον πολλαπλασιαστέο το ακέραιο πηλίκο
του τελευταίου αριθµού δια 2 (αγνοώντας το υπόλοιπο), και γράψτε στη στήλη κάτω
από τον πολλαπλασιαστή το διπλάσιο του τελευταίου αριθµού (προσθέτοντάς τον
στον εαυτό του). Στο τέλος, όταν δηλαδή ο αριθµός κάτω από τον πολλαπλασιαστέο
γίνει 1, σβήστε κάθε γραµµή στην οποία ο αριθµός στη στήλη του πολλαπλασια-
στέου είναι ζυγός και έπειτα, προσθέστε τους αριθµούς που παραµένουν στη στήλη
του πολλαπλασιαστή. Ο Πίνακας 1.1 απεικονίζει τη διαδικασία πολλαπλασιασµού
a la russe για τον υπολογισµό του 19 ¥ 45 = 855.

¶›Ó·Î·˜ 1.1
Παράδειγµα πολλαπλασιασµού a la russe.
45 19
22 38 (σβήνω)
11 76
5 152
2 304 (σβήνω)
1 608
855
1 . 2 ∞ ¡ ∞ ¶ ∞ ƒ∞ ™ ∆∞ ™ ∏ ∞ § ° √ ƒ π £ ª ø ¡ 19

Αυτός ο αλγόριθµος είναι κατά βάση ό,τι χρησιµοποιείται σήµερα στο hardware πολ-
λών υπολογιστών. ∆εν χρειάζεται την «προπαίδεια», αλλά χρειάζεται µόνο πρόσθε-
ση και διαίρεση δια 2.

1.2 ∞Ó··Ú¿ÛÙ·ÛË ·ÏÁÔÚ›ı̈Ó

Η αναπαράσταση ενός αλγορίθµου φυσικά και µπορεί να γίνει σε κάποια ανθρώπι-


νη γλώσσα. Όµως, για να αποφύγουµε ασάφειες στις οδηγίες, στο εξής θα γράφου-
µε τους αλγορίθµους δίνοντας ένα (αντίστοιχο) «πρόγραµµα» για αυτούς σε µια
συγκεκριµένη υπολογιστική (ψευδο –)γλώσσα. Για όσους αναγνώστες γνωρίζουν
Pascal οι εντολές του προγράµµατός µας θα µοιάζουν µε τις εντολές της Pascal,
παραλείποντας λεπτοµέρειες. Στον ψευδοκώδικά µας, τυχόν σχόλια (σε αγκύλες {
}) θεωρούνται ανεκτέλεστα από τον υπολογιστή. Κάθε ψευδοπρόγραµµα είναι µια
διαδικασία (procedure).
Π.χ. procedure russe(A, B).
Οι διαδικασίες έχουν ένα (αυθαίρετο) όνοµα και στην παρένθεση είναι τα δεδοµένα
(οι είσοδοι) του προβλήµατος. Οι εντολές γράφονται ακολουθιακά (η µία µετά την
άλλη), µε σύµβολο διαχωρισµού το «;». Το ρεπερτόριο εντολών µας θα είναι στοι-
χειώδες:
1. Η ανάθεση τιµής, π.χ. x ¨ 4; (η µεταβλητή x λαµβάνει την τιµή 4).
2. Η επιστροφή αποτελέσµατος, π.χ. return product; (επιστρέφεται η τιµή της µετα-
βλητής product). Η εντολή επιστροφής αποτελέσµατος σηµατοδοτεί και το τέλος
της εκτέλεσης µιας διαδικασίας.
3. Απλές εντολές µαθηµατικών και λογικών πράξεων.
4. Η εντολή if <συνθήκη> then <δράση 1> [else <δράση 2>], όπου <συνθήκη> είναι
µια λογική έκφραση, αληθής ή ψευδής. Εάν είναι αληθής, τότε η εντολή <δράση
1> εκτελείται. Στην περίπτωση που η <συνθήκη> είναι ψευδής, και υπάρχει το
else – τµήµα της εντολής, εκτελείται η εντολή <δράση 2>. Παραδοσιακά, αυτή η
κατασκευή λέγεται εκτέλεση εντολής υπό συνθήκη.
5. Η ακολουθία εντολών
begin
<ÂÓÙÔÏ‹ 1>;
º
<ÂÓÙÔÏ‹ κ>;
end
20 KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™

που σηµαίνει ότι η οµάδα εντολών <εντολή 1> έως <εντολή κ> εκτελούνται η µία
κατόπιν της άλλης. Πολλές φορές, για να αποφευχθεί η πληθώρα των begin – end
κατασκευών, αυτά θα παραλείπονται. Σε αυτή την περίπτωση, η κοινή στοίχιση
των εντολών προς τα µέσα θα δηλώνει ότι πρόκειται για ακολουθία εντολών, οι
οποίες εκτελούνται η µία κατόπιν της άλλης.
6. Η εντολή επανάληψης while <συνθήκη> do <εντολή>; Όσο η <συνθήκη> είναι
αληθής, η <εντολή> (που µπορεί να είναι και ακολουθία εντολών) εκτελείται επα-
ναληπτικά. Παραδοσιακά, αυτό λέγεται loop ή βρόγχος εντολών.
7. Η εντολή επανάληψης for i ¨ <τιµή 1> to <τιµή 2> do <εντολή>; Η <εντολή>,
που µπορεί να είναι ακολουθία εντολών, θα εκτελεστεί (<τιµή 2> – <τιµή 1> + 1)
φορές, µία για κάθε τιµή της µεταβλητής i µεταξύ <τιµή 1> και <τιµή 2>. Κάθε
φορά, µετά την εκτέλεση της <εντολής>, η τιµή της µεταβλητής i αυξάνεται κατά
1, και η <εντολή> σταµατά να εκτελείται όταν το i γίνει µεγαλύτερο από <τιµή 2>.
Φυσικά, επιτρέπεται σε µία διαδικασία να «καλεί» (να επικαλείται την εκτέλεση)
άλλες καλώς ορισµένες διαδικασίες, ή ακόµα και τον εαυτό της. Για παράδειγµα,
ακολουθεί ο αλγόριθµος του πολλαπλασιασµού a la russe σε ψευδοκώδικα. Στην
παρακάτω διαδικασία χρησιµοποιείται ο τελεστής div (a div b), ο οποίος υπολογί-
ζει το πηλίκο της ακέραιης διαίρεσης του a δια b.
procedure russe(A, B)
arrays X, Y { ¢ËÏÒÛÂȘ }
Ã[1] ¨ Α; À[1] ¨ Β;
i ¨ 1;
{ ¢ËÌÈÔ˘ÚÁÒ ÙȘ ÛًϘ }
while X[i] > 1 do
X[i + 1] ¨ X[i] div 2;
Y[i + 1] ¨ Y[i] + Y[i];
i ¨ i + 1;
product ¨ 0
while i > 0 do
if X[i] ÂÚÈÙÙfi˜ then
product ¨ product + Y[i];
i ¨ i + 1;
return product;
1 . 3 ¶ ƒ √ µ § ∏ ª ∞∆∞ ∫ ∞ π ™ ∆ π ° ª π √ ∆ À ¶ ∞ 21

¢Ú·ÛÙËÚÈfiÙËÙ· 1.1

Είναι δυνατόν ο ίδιος αλγόριθµος να κωδικοποιηθεί µε περισσότερους του ενός


τρόπους. Περιγράψτε µία συνοπτικότερη, απλούστερη και ταχύτερη στην εκτέλε-
ση κωδικοποίηση για τον αλγόριθµο πολλαπλασιασµού a la russe.

¢Ú·ÛÙËÚÈfiÙËÙ· 1.2

Έστω φ ένας πίνακας n φυσικών αριθµών και x ένας φυσικός αριθµός για τον οποίο
θέλουµε να διαπιστώσουµε αν υπάρχει στον πίνακα Α. Γράψτε ψευδοκώδικα για
τον αλγόριθµο γραµµικής αναζήτησης (linear search), που εντοπίζει τη θέση του x
στον πίνακα Α ελέγχοντας όλα τα στοιχεία του µε τη σειρά. Στην περίπτωση που
το x υπάρχει στον πίνακα Α, ο αλγόριθµος επιστρέφει τη θέση του x. ∆ιαφορετικά,
ο αλγόριθµος επιστρέφει 0.

1.3 ¶ÚÔ‚Ï‹Ì·Ù· Î·È ÛÙÈÁÌÈfiÙ˘·

Ο αλγόριθµος πολλαπλασιασµού a la russe είναι µια γενική µέθοδος για το πρόβλη-


µα του πολλαπλασιασµού δύο φυσικών αριθµών. Στον Πίνακα 1.1 θεωρήσαµε το
στιγµιότυπο (instance) 45 ¥ 19 του προβλήµατος του πολλαπλασιασµού δύο φυσι-
κών αριθµών και είδαµε πως λειτουργεί ο αλγόριθµος για το συγκεκριµένο στιγµιό-
τυπο. Όπως για το πρόβληµα του πολλαπλασιασµού, για τα περισσότερα προβλή-
µατα µε τα οποία θα ασχοληθούµε υπάρχουν άπειρα στιγµιότυπα.
Ένα άλλο παράδειγµα προβλήµατος, µε το οποίο θα ασχοληθούµε στη συνέχεια, είναι
αυτό της διάταξης n φυσικών αριθµών σε αύξουσα σειρά. Σε αυτό το πρόβληµα, δεδο-
µένης µιας n – άδας φυσικών αριθµών, ψάχνουµε µια αναδιάταξη των αριθµών αυτών,
ώστε κάθε αριθµός να µην είναι µεγαλύτερος από τον επόµενό του. Μια οποιαδήποτε
συγκεκριµένη n – άδα φυσικών αριθµών αποτελεί ένα στιγµιότυπο του προβλήµατος.
Με αυτή την έννοια, ένα πρόβληµα περιγράφει έναν επιθυµητό µετασχηµατισµό των
δεδοµένων εισόδου στα δεδοµένα εξόδου, τα οποία πρέπει να ικανοποιούν τους
περιορισµούς που θέτει το πρόβληµα. Πιο συγκεκριµένα, ο ορισµός ενός προβλή-
µατος πρέπει να περιγράφει τη µορφή των δεδοµένων εισόδου και εξόδου και τη
σχέση µεταξύ τους. Για παράδειγµα, στον πολλαπλασιασµό, ο ορισµός υπαγορεύει
ότι τα δεδοµένα εισόδου είναι ένα ζεύγος φυσικών αριθµών, τα δεδοµένα εξόδου
είναι ένας φυσικός αριθµός και ότι η έξοδος πρέπει να είναι το γινόµενο του ζεύγους
των αριθµών εισόδου. Επίσης, στο πρόβληµα της διάταξης n αριθµών, η είσοδος
22 KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™

είναι µία n – άδα αριθµών, η έξοδος είναι επίσης µία n – άδα αριθµών και, επιπλέ-
ον, η έξοδος πρέπει να είναι µία αναδιάταξη των αριθµών εισόδου σε αύξουσα σειρά.
Έχοντας ορίσει τη µορφή των δεδοµένων εισόδου, κάθε έγκυρο σύνολο δεδοµένων
εισόδου αποτελεί ένα στιγµιότυπο του προβλήµατος. Έτσι, κάθε ζεύγος φυσικών
αριθµών είναι ένα στιγµιότυπο του προβλήµατος του πολλαπλασιασµού και κάθε n
– άδα αριθµών είναι ένα στιγµιότυπο για το πρόβληµα της διάταξης n αριθµών.
Τα προβλήµατα που ενδιαφέρουν τη Θεωρία Αλγορίθµων έχουν άπειρο αριθµό στιγ-
µιότυπων. Ένας αλγόριθµος πρέπει να λειτουργεί σωστά, δηλαδή να δίνει σωστές
απαντήσεις, για όλα τα στιγµιότυπα του προβλήµατος το οποίο λύνει. Για να δείξει
κάποιος ότι ένας αλγόριθµος είναι λανθασµένος, αρκεί να βρει ένα στιγµιότυπο του
προβλήµατος για το οποίο ο αλγόριθµος δίνει λάθος αποτέλεσµα. Από την άλλη
πλευρά, συνήθως, είναι δυσκολότερο να δείξει κάποιος ότι ένας αλγόριθµος είναι
σωστός, αφού απαιτείται µαθηµατική απόδειξη ότι ο αλγόριθµος δίνει σωστό απο-
τέλεσµα για όλα τα στιγµιότυπα του προβλήµατος.

1.4 ∞ÔÙÂÏÂÛÌ·ÙÈÎfiÙËÙ· ·ÏÁÔÚ›ı̈Ó

1.4.1 ∞Û˘ÌÙˆÙÈ΋ ÂÎÙ›ÌËÛË

Έστω ότι για ένα πρόβληµα υπάρχουν περισσότεροι από ένας αλγόριθµοι που το
λύνουν. Ποιον θα επιλέξουµε; Ποιος είναι ο καλύτερος; Η εµπειρική απάντηση είναι
να τους προγραµµατίσουµε όλους σε κάποια γλώσσα προγραµµατισµού, να τους δοκι-
µάσουµε και να επιλέξουµε. Η θεωρητική απάντηση (την οποία αυτό το βιβλίο υπη-
ρετεί) έγκειται στο να προσδιορίσουµε µε µαθηµατικό τρόπο την ποσότητα των απα-
ραίτητων πόρων για την εκτέλεση του αλγορίθµου (π.χ. µνήµη, χρόνος εκτέλεσης,
αριθµός επεξεργαστών, κλπ.) ως συνάρτηση του µεγέθους του στιγµιότυπου εισόδου.
Το µέγεθος ενός στιγµιότυπου ενός προβλήµατος αντιστοιχεί τυπικά στον αριθµό
των δυαδικών ψηφίων (bits) που απαιτούνται για να αναπαρασταθεί το στιγµιότυπο
στη µνήµη του υπολογιστή. Στην πραγµατικότητα, για να διευκολυνθούµε στον
προσδιορισµό των πόρων που απαιτούνται για την εκτέλεση ενός αλγορίθµου, χρη-
σιµοποιούµε σαν µέγεθος ενός στιγµιότυπου µία ποσότητα που αποτελεί µέτρο των
συνιστωσών του.
Για παράδειγµα, στο πρόβληµα της διάταξης φυσικών αριθµών, συνήθως, θεωρού-
µε ότι η αναπαράσταση ενός φυσικού αριθµού έχει µοναδιαίο µέγεθος (π.χ. µια θέση
µνήµης). Έτσι, το µέγεθος ενός στιγµιότυπου που περιλαµβάνει n αριθµούς είναι n,
ακόµα και αν η αναπαράσταση ενός ακεραίου µπορεί να χρειάζεται περισσότερα του
ενός bit. Από την άλλη πλευρά, το µέγεθος των αριθµητικών προβληµάτων καθορί-
1 . 4 ∞ ¶ √ ∆ ∂ § ∂ ™ ª ∞∆ π ∫ √ ∆ ∏ ∆∞ ∞ § ° √ ƒ π £ ª ø ¡ 23

ζεται συνήθως µε βάση τον αριθµό των bits που απαιτούνται για την αναπαράστα-
ση των δεδοµένων εισόδου. Έτσι, το µέγεθος ενός στιγµιότυπου για το πρόβληµα
του πολλαπλασιασµού δύο αριθµών, των οποίων η αναπαράσταση απαιτεί n και m
bits αντίστοιχα, είναι n + m.
Το πλεονέκτηµα της θεωρητικής µεθόδου είναι ακριβώς αυτή η µη εµµονή σε λεπτο-
µέρειες που εξαρτώνται από τεχνικά χαρακτηριστικά. Αυτό που έχει σηµασία είναι
το µέγεθος που, όταν αυξηθεί, δυσκολεύει κατά πολύ το πρόβληµα. Για παράδειγ-
µα, είναι πολύ εύκολο να διατάξουµε 5 αριθµούς, αλλά δεν είναι καθόλου εύκολο
να κάνουµε το ίδιο για 1000 αριθµούς. Επίσης, φαίνεται εύκολο να πολλαπλασιά-
σουµε δύο µονοψήφιους αριθµούς, ενώ είναι πολύ δυσκολότερο να πολλαπλασιά-
σουµε δύο εκατονταψήφιους αριθµούς.
Έχοντας καταλήξει σε ένα µέτρο του µεγέθους των στιγµιότυπων ενός προβλήµα-
τος, ανακύπτει το ερώτηµα σε ποια µονάδα θα ανάγουµε το θέµα της µέτρησης της
αποτελεσµατικότητας ενός αλγορίθµου, π.χ. όσον αφορά στο χρόνο υπολογισµού
tA(n) για έναν αλγόριθµο Α που λύνει το πρόβληµα όταν το στιγµιότυπο του έχει
µέγεθος n.
Η αρχή του αναλλοίωτου (principle of invariance) είναι µια απάντηση. Η αρχή αυτή
λεει ότι δύο διαφορετικές υλοποιήσεις του ίδιου αλγορίθµου δεν θα διαφέρουν σε
αποτελεσµατικότητα παρά µόνο κατά µια σταθερή αναλογία, που εξαρτάται από την
τεχνολογία του λογισµικού και του υπολογιστή. Έτσι, για τη θεωρητική εκτίµηση
αλγορίθµων, καλό είναι να εκφράζουµε τη µέτρηση της αποτελεσµατικότητας αγνο-
ώντας πολλαπλασιαστικές σταθερές.

Ορισµός 1.1: Ένας αλγόριθµος απαιτεί χρόνο της τάξεως t(n) για να εκτελεσθεί,
όπου n είναι το µέγεθος του στιγµιότυπου του προβλήµατος προς
επίλυση, εάν υπάρχει θετική σταθερά c, και κάποια υλοποίηση του
αλγορίθµου, ικανή να λύσει κάθε στιγµιότυπο του προβλήµατος
µεγέθους n σε χρόνο όχι περισσότερο από c ◊ t(n) βήµατα.

Με χρήση της αρχής του αναλλοίωτου, κάθε άλλη υλοποίηση του ίδιου αλγορίθµου
θα έχει την ίδια ιδιότητα (µε πιθανή αλλαγή της σταθεράς c). Αυτή η σηµαντική
έννοια, γνωστή ως ασυµπτωτική εκτίµηση, καταδεικνύει την εξάρτηση της επιδόσε-
ως του αλγορίθµου από µεγάλα µεγέθη εισόδου.
Μερικές τάξεις µεγεθών είναι τόσο συνήθεις ώστε να έχουν συγκεκριµένο όνοµα.
Όταν το t(n) είναι n λέµε ότι ο αλγόριθµος είναι γραµµικός (linear) στο µέγεθος της
24 KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™

εισόδου. Όταν το t(n) είναι n2, n3, nκ (για κάποιο συγκεκριµένο κ), ή dn (για κάποιο
συγκεκριµένο d) τότε, αντίστοιχα, λέµε ότι ο αλγόριθµος είναι τετραγωνικός
(quadratic), κυβικός (cubic), πολυωνυµικός (polynomial), ή εκθετικός (exponential)
ως προς το χρόνο εκτέλεσης.
Η (κρυµµένη) πολλαπλασιαστική σταθερά στον ασυµπτωτικό ορισµό της τάξεως
µεγέθους είναι πηγή παρεξηγήσεων. Έστω αλγόριθµοι Α, Β για το ίδιο πρόβληµα,
µε χρόνους της τάξεως των n2 και n3 αντίστοιχα, και σταθερές (σε κάποια υλοποίη-
ση) 1000 και 1. Μόνο για εισόδους µε µέγεθος µεγαλύτερο του 1000 (n > 1000), ο
Α είναι καλύτερος του Β. Παρά ταύτα, ο Α είναι ασυµπτωτικά καλύτερος από τον Β.

¢Ú·ÛÙËÚÈfiÙËÙ· 1.3

Ποιά είναι η µικρότερη τιµή του n, ώστε ένας αλγόριθµος µε χρόνο εκτέλεσης
100n2 να ολοκληρώνεται γρηγορότερα από έναν αλγόριθµο µε χρόνο εκτέλεσης
2n, όταν αυτοί εκτελούνται στον ίδιο υπολογιστή;

Στον Ορισµό 1.1, η έννοια του χρόνου εκτέλεσης µπορεί να αντικατασταθεί από
οποιοδήποτε µέγεθος πόρου του υπολογιστικού περιβάλλοντος (π.χ. µνήµη, αριθµό
επεξεργαστών, µηνύµατα δικτύου, κλπ.) ως προς το οποίο υπολογίζουµε την ασυ-
µπτωτική συµπεριφορά του αλγορίθµου.

1.4.2 ∞Ó¿Ï˘ÛË ·ÏÁÔÚ›ı̈Ó

Η ανάλυση ενός αλγορίθµου είναι η εκτίµηση του πλήθους των πόρων που απαιτού-
νται για την εκτέλεση του αλγορίθµου. Για να αναλύσουµε έναν αλγόριθµο πρέπει να
θεωρήσουµε ένα µοντέλο υπολογιστή στον οποίο θα εκτελεστεί ο αλγόριθµος. Για το
σκοπό αυτού του βιβλίου, θεωρούµε ότι κάθε αλγόριθµος θα υλοποιηθεί σαν πρό-
γραµµα σε µία Υπολογιστική Μηχανή Άµεσης Προσπέλασης Μνήµης (Random
Access Machine, RAM) µε έναν επεξεργαστή. Σε αυτό το µοντέλο οι εντολές εκτε-
λούνται ακολουθιακά, ενώ η προσπέλαση κάθε θέσης µνήµης έχει µοναδιαίο κόστος.
Η πιο συνηθισµένη κατηγορία ανάλυσης ενός αλγορίθµου αφορά το χρόνο εκτέλε-
σης. Ο χρόνος εκτέλεσης ενός αλγορίθµου συνήθως υπολογίζεται σαν συνάρτηση
του αριθµού των στοιχειωδών βηµάτων που εκτελούνται. Το είδος των στοιχειωδών
βηµάτων τα οποία προσµετρώνται στο χρόνο εκτέλεσης του αλγορίθµου ποικίλουν
ανάλογα µε το πρόβληµα. Για παράδειγµα, στο πρόβληµα της διάταξης φυσικών
αριθµών, σαν στοιχειώδη βήµατα µπορούν να θεωρηθούν οι συγκρίσεις µεταξύ
1 . 4 ∞ ¶ √ ∆ ∂ § ∂ ™ ª ∞∆ π ∫ √ ∆ ∏ ∆∞ ∞ § ° √ ƒ π £ ª ø ¡ 25

φυσικών αριθµών ή/και οι αντιµεταθέσεις που θα χρειαστούν µέχρι να επιτευχθεί η


αύξουσα σειρά. Από την άλλη πλευρά, στο πρόβληµα του πολλαπλασιασµού φυσι-
κών αριθµών, σαν στοιχειώδη βήµατα µπορούν να θεωρηθούν οι προσθέσεις δυα-
δικών ή δεκαδικών ψηφίων που απαιτούνται για τον υπολογισµό του γινοµένου.
Έστω ότι το προς επίλυση πρόβληµα είναι να διατάξουµε σε αύξουσα σειρά n φυσι-
κούς αριθµούς. Έστω ο αλγόριθµος διάταξης µε ένθεση (insertion sort), ο οποίος δια-
τάσσει τον πίνακα Α διατηρώντας, για κάθε 2 £ j £ n, διατεταγµένο τον υποπίνακα
A[1,…, j–1]. Σε κάθε επανάληψη το στοιχείο A[j] τοποθετείται ώστε ο υποπίνακας
A[1, …, j] να παραµείνει διατεταγµένος.
procedure insertion_sort(A[1...n])
(1) for j ¨ 2 to n do
(2) key ¨ A[j]; i ¨ j – 1;
(3) while i > 0 and A[i] > key do
(4) A[i + 1] ¨ A[i];
(5) i ¨ i – 1;
(6) A[i + 1] ¨ key;
Το βήµα (1) εκτελείται n φορές (την τελευταία φορά είναι j = n + 1), ενώ τα βήµα-
τα (2) και (6) εκτελούνται n – 1 φορές. Έστω tj ο αριθµός των εκτελέσεων του βήµα-
n

τος (3) κατά την επανάληψη j. Προφανώς, το βήµα (3) εκτελείται Ât


j =2
j φορές και

τα βήµατα (4) και (5) εκτελούνται Â (t


j =2
j - 1) φορές. Επειδή το βήµα (3) εκτελείται

τουλάχιστον µία φορά, είναι tj ≥ 1. Επειδή το while – loop τερµατίζει όταν i £ 0 και,
αρχικά, το i έχει τιµή j –1, το tj είναι πάντα µικρότερο ή ίσο του j.

¢Ú·ÛÙËÚÈfiÙËÙ· 1.4

Περιγράψτε τη λειτουργία του αλγορίθµου για τον πίνακα A = [5, 2, 4, 6, 1, 3].


Ποιο είναι το tj για κάθε επανάληψη; Επαναλάβετε για τους πίνακες B = [1, 2, 3,
4, 5, 6], και Γ = [6, 5, 4, 3, 2, 1];

Σύµφωνα µε την αρχή του αναλλοίωτου, µπορούµε να θεωρήσουµε ότι το κόστος


κάθε βήµατος είναι ίσο µε µια σταθερά που εξαρτάται από την υλοποίηση. Εποµέ-
νως, για να έχουµε µια ασυµπτωτική εκτίµηση του χρόνου εκτέλεσης του αλγορίθ-
26 KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™

µου αρκεί να υπολογίσουµε την ποσότητα Ât


j =2
j , η οποία αποτελεί και µέτρο των

συγκρίσεων µεταξύ φυσικών αριθµών που εκτελεί ο αλγόριθµος insertion sort.

Ο µικρότερος χρόνος εκτέλεσης για τον αλγόριθµο insertion sort επιτυγχάνεται όταν
οι αριθµοί του πίνακα εισόδου είναι ήδη διατεταγµένοι σε αύξουσα σειρά. Τότε, για
n

κάθε 2 £ j £ n, tj = 1. Εποµένως, σε αυτή την περίπτωση Ât


j =2
j = n - 1 , και ο χρόνος

εκτέλεσης του αλγορίθµου insertion sort είναι γραµµικός στο µέγεθος της εισόδου.

Ο µεγαλύτερος χρόνος εκτέλεσης για τον αλγόριθµο insertion sort επιτυγχάνεται


όταν ο πίνακας εισόδου είναι διατεταγµένος σε γνήσια φθίνουσα σειρά. Τότε, σε
κάθε επανάληψη j, το στοιχείο Α[j + 1] πρέπει να µπει στη θέση Α[1], και το βήµα
n n
n(n + 1)
(3) θα εκτελεστεί j φορές (tj = j). Σε αυτή την περίπτωση Ât = Â j =
j =2
j
j =2
2
-1 .

Εποµένως, στη χειρότερη περίπτωση ο χρόνος εκτέλεσης του αλγορίθµου insertion


sort είναι τετραγωνικός στο µέγεθος της εισόδου.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 1.1

Θεωρείστε έναν αλγόριθµο που διατάσσει έναν πίνακα n φυσικών αριθµών Α βρί-
σκοντας (για κάθε i = 1, …, n) το µικρότερο στοιχείο του υποπίνακα A[i,…,n], και
τοποθετώντας το στη θέση A[i]. Αυτή η µέθοδος είναι γνωστή σαν διάταξη µε επι-
λογή (selection sort). Περιγράψτε αυτόν τον αλγόριθµο σε ψευδοκώδικα. Ποια είναι
τα στιγµιότυπα καλύτερης και χειρότερης περίπτωσης για αυτόν τον αλγόριθµο;
∆ώστε µια ασυµπτωτική εκτίµηση του χρόνου εκτέλεσης του αλγορίθµου για την
καλύτερη και τη χειρότερη περίπτωση.

1.4.3 ∞Ó¿Ï˘ÛË ¯ÂÈÚfiÙÂÚ˘ Î·È Ì¤Û˘ ÂÚ›ÙˆÛ˘

Στην προηγούµενη ενότητα είδαµε ότι, για κάποια στιγµιότυπα, ο αλγόριθµος


insertion sort απαιτεί χρόνο εκτέλεσης γραµµικό στο µέγεθος της εισόδου, ενώ για
κάποια άλλα στιγµιότυπα, ο ίδιος αλγόριθµος απαιτεί χρόνο τετραγωνικό στο µέγε-
θος της εισόδου.
Με τέτοιες αποκλίσεις στο χρόνο εκτέλεσης, που εξαρτώνται από τη δοµή και όχι µόνο
από το µέγεθος, της εισόδου, η απλούστερη επιλογή είναι να θεωρήσουµε µόνο τα στιγ-
1.5 ∞¡∞°∫∏ °π∞ ∞¶√¢√∆π∫√À™ ∞§°√ƒπ£ª√À™ 27

µιότυπα (για κάθε δεδοµένο µέγεθος εισόδου) στα οποία ο αλγόριθµος καταναλίσκει
τον περισσότερο χρόνο. Αυτή είναι η εκτίµηση της απόδοσης ενός αλγορίθµου για την
χειρότερη περίπτωση (worst case analysis). Η ανάλυση χειρότερης περίπτωσης δίνει
ένα εγγυηµένο άνω φράγµα (ασυµπτωτικά) για την απόδοση του αλγορίθµου.
Είναι προφανής η αξία της ανάλυσης χειρότερης περίπτωσης (ο,τιδήποτε και να συµ-
βεί σε µια ορθή εκτέλεση του αλγορίθµου, ο χρόνος απόκρισης θα είναι το πολύ τόσο
άσχηµος). Ωστόσο, οι αλγόριθµοι πολλές φορές χρησιµοποιούνται κατ’ επανάληψη,
και για πολλές διαφορετικές εισόδους. Υπάρχουν n! τρόποι να διατάξουµε αρχικά
τον πίνακα εισόδου για τον αλγόριθµο insertion sort. Εάν γνωρίζαµε και την πιθα-
νότητα του κάθε τρόπου, καθώς και τον χρόνο εκτέλεσης σε κάθε αρχική διάταξη
(που θα ποικίλει ανάµεσα σε n και n2), τότε θα είµαστε σε θέση να υπολογίσουµε τη
µέση τιµή του χρόνου διάταξης ενός πίνακα µε τον αλγόριθµο insertion sort, ως προς
τη δεδοµένη κατανοµή της εισόδου.
∆υστυχώς, η εκ των προτέρων γνώση της κατανοµής των εισόδων είναι συνήθως µη
ρεαλιστική υπόθεση. Στο βιβλίο αυτό, θα µας αφορά κυρίως η ανάλυση χειρότερης
περίπτωσης, εκτός αν ρητά διατυπωθεί το ζήτηµα κατά άλλον τρόπο.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 1.2

Έστω ο αλγόριθµος γραµµικής αναζήτησης της ∆ραστηριότητας 1.2. Υποθέστε ότι


ο ζητούµενος αριθµός x υπάρχει στον πίνακα Α. ∆ώστε µια ασυµπτωτική εκτίµη-
ση του χρόνου εκτέλεσης του αλγορίθµου στην καλύτερη και στη χειρότερη περί-
πτωση. Έστω ότι ο αριθµός x έχει την ίδια πιθανότητα να βρίσκεται σε κάθε θέση
του πίνακα Α. ∆ώστε µια ασυµπτωτική εκτίµηση του χρόνου εκτέλεσης του αλγο-
ρίθµου στη µέση περίπτωση. Τι γίνεται στην περίπτωση που ο αριθµός x δεν ανή-
κει στον πίνακα Α;

1.5 ∞Ó¿ÁÎË ÁÈ· ·Ô‰ÔÙÈÎÔ‡˜ ·ÏÁfiÚÈıÌÔ˘˜

Καθώς η ταχύτητα των υπολογιστών αυξάνει µε ταχύτατους ρυθµούς, κάποιος θα


µπορούσε να ισχυριστεί ότι µοιάζει άσκοπη η συνεχής αναζήτηση για αποδοτικότε-
ρους αλγορίθµους. Στην περίπτωση που η αποδοτικότητα ενός αλγορίθµου δεν µας
ικανοποιεί, θα µπορούσαµε να περιµένουµε την επόµενη, ταχύτερη γενιά υπολογι-
στών, αντί να επενδύσουµε χρόνο και χρήµατα στην αναζήτηση ενός αποδοτικότε-
ρου αλγορίθµου.
28 KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™

Στην πραγµατικότητα υπάρχουν πολλά παραδείγµατα που αποδεικνύουν ότι η απο-


δοτικότητα διαφορετικών αλγορίθµων που επιλύουν το ίδιο πρόβληµα µπορεί να δια-
φέρει πολύ περισσότερο από την ταχύτητα ενός προσωπικού υπολογιστή και ενός
υπερ – υπολογιστή. Για παράδειγµα, ας θεωρήσουµε δύο αλγόριθµους Α και Β για
κάποιο πρόβληµα µε χρόνους εκτέλεσης της τάξης 2n και n3, αντίστοιχα. Επιπλέον,
ας θεωρήσουµε ότι, για κάποιον δεδοµένο υπολογιστή, ο αλγόριθµος Α χρειάζεται
10– 4 ¥ 2n δευτερόλεπτα, ενώ ο αλγόριθµος Β χρειάζεται 10– 2 ¥ n3 δευτερόλεπτα για
την επίλυση στιγµιότυπων µεγέθους n του προβλήµατος.
Ο αλγόριθµος Α µπορεί να επιλύσει ένα στιγµιότυπο µεγέθους 10 σε ένα δέκατο του
δευτερολέπτου και ένα στιγµιότυπο µεγέθους 20 σε σχεδόν δύο λεπτά. Όµως, δεν
του αρκεί µία ηµέρα για την επίλυση ενός στιγµιότυπου µεγέθους 30 και χρειάζεται
σχεδόν ένα έτος για την επίλυση ενός στιγµιότυπου µεγέθους 38.
Στην προσπάθεια να λύσουµε µεγαλύτερα στιγµιότυπα µε τον αλγόριθµο Α, αγορά-
ζουµε έναν καινούργιο υπολογιστή 100 φορές ταχύτερο από τον προηγούµενο. Στον
καινούργιο υπολογιστή ο αλγόριθµος Α χρειάζεται 10 –6 ¥ 2n δευτερόλεπτα για την
επίλυση στιγµιότυπων µεγέθους n. Η βελτίωση είναι πολύ µικρή, πάλι δεν φτάνει
ένα έτος για την επίλυση ενός στιγµιότυπου µεγέθους 45. Γενικά, αν στον παλιό υπο-
λογιστή ο Α έλυνε ένα στιγµιότυπο µεγέθους n σε ένα δεδοµένο χρονικό διάστηµα,
στον καινούργιο υπολογιστή λύνει, στην καλύτερη περίπτωση, ένα στιγµιότυπο µεγέ-
θους n + 7 στο ίδιο διάστηµα.
Αν, αντίθετα, υιοθετήσουµε τον αλγόριθµο Β, µπορούµε, ακόµα και µε τον παλιό
υπολογιστή, να λύσουµε ένα στιγµιότυπο µεγέθους 200 σε µία ηµέρα, ενώ σε ένα
έτος µπορούµε να λύσουµε στιγµιότυπα των οποίων το µέγεθος πλησιάζει το 1500.
Επιπλέον, ο αλγόριθµος Β αξιοποιεί καλύτερα τον καινούργιο, ταχύτερο υπολογι-
στή, αφού σε αυτόν µπορεί να λύσει στιγµιότυπα µεγέθους 4n στο διάστηµα που,
στον παλιό υπολογιστή, έλυνε στιγµιότυπα µεγέθους n. Από την άλλη πλευρά, πρέ-
πει να σηµειώσουµε ότι, εξαιτίας της µεγαλύτερης πολλαπλασιαστικής σταθεράς, ο
αλγόριθµος Β είναι γρηγορότερος από τον Α µόνο για στιγµιότυπα µε µέγεθος µεγα-
λύτερο ή ίσο του 20.
Το παράδειγµα αυτό δείχνει ότι οι αλγόριθµοι, όπως και το υλικό των υπολογιστών,
συνιστούν τεχνολογία. Η συνολική απόδοση ενός συστήµατος εξαρτάται από την
επιλογή αποδοτικών αλγορίθµων, τουλάχιστον στο βαθµό που εξαρτάται από την
επιλογή γρήγορου υπολογιστικού υλικού.
™YNOæH 29

¢Ú·ÛÙËÚÈfiÙËÙ· 1.5

Θεωρήστε ότι µια υλοποίηση του αλγορίθµου insertion sort χρειάζεται να εκτελέ-
σει 2n2 εντολές για να διατάξει έναν πίνακα n στοιχείων, και ότι µία υλοποίηση
ενός άλλου αλγορίθµου διάταξης Β χρειάζεται να εκτελέσει 50n log n εντολές για
την ίδια εργασία. Αν ο insertion sort τρέχει σε έναν υπολογιστή µε δυνατότητα εκτέ-
λεσης 108 εντολών το δευτερόλεπτο και ο Β σε έναν υπολογιστή µε δυνατότητα
εκτέλεσης 106 εντολών το δευτερόλεπτο, πόσο χρόνο χρειάζονται για να διατάξουν
103, 104, 105, 106 και 107 στοιχεία, αντίστοιχα.

™‡ÓÔ„Ë
Σε αυτό το κεφάλαιο ορίστηκε η έννοια του αλγορίθµου σαν µεθοδολογία επίλυσης
προβληµάτων, παρουσιάστηκε η µορφή του ψευδοκώδικα που θα χρησιµοποιηθεί για
την περιγραφή των αλγορίθµων, περιγράφηκαν µερικοί στοιχειώδεις αλγόριθµοι (π.χ.
πολλαπλασιασµός a la russe, insertion sort, linear search), τεκµηριώθηκε η ανα-
γκαιότητα για ποσοτικό προσδιορισµό των πόρων που απαιτεί η εκτέλεση ενός αλγο-
ρίθµου, παρουσιάστηκε η έννοια της ασυµπτωτικής ανάλυσης των αλγορίθµων, ορί-
στηκε η ανάλυση µέσης και χειρότερης περίπτωσης, και προσδιορίστηκε ο χρόνος
εκτέλεσης µερικών στοιχειωδών αλγορίθµων.
30 KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™

µÈ‚ÏÈÔÁÚ·Ê›·

Τα περισσότερα βιβλία για Θεωρία Αλγόριθµων καλύπτουν σε ικανοποιητικό βαθµό


σηµαντικά υπερσύνολο της ύλης που παρουσιάζεται σε αυτό το βιβλίο. Μια εξαιρε-
τική σε έκταση και βάθος παρουσίαση της Θεωρίας Αλγόριθµων γίνεται στο βιβλίο:
[1] T.H. Cormen, C.E. Leiserson και R. L. Rivest. Introduction to Algorithms. MIT
Press, 1990. Καλύπτει όλο το εύρος της Θεωρίας Αλγόριθµων µε επιλεγµένα
παραδείγµατα, έχει πολύ κατανοητές αναλύσεις / παρουσιάσεις, ακόµα και για
δύσκολα ζητήµατα, και εξαιρετική συλλογή ασκήσεων. Θεωρείται σηµείο ανα-
φοράς στην παρουσίαση της Θεωρίας Αλγόριθµων και διδάσκεται σε όλα τα
µεγάλα Πανεπιστήµια των Ηνωµένων Πολιτειών (Stanford, MIT, Berkeley, κλπ.).
Άλλα εξαιρετικά αναγνώσµατα που καλύπτουν υπερσύνολο της ύλης που παρου-
σιάζεται σε αυτό το βιβλίο είναι:
[2] A.V. Aho, J.E. Hopcroft και J.D. Ullman. Data Structures and Algorithms.
Addison – Wesley, 1988. Κλασικό βιβλίο που καλύπτει ικανοποιητικά τα περισ-
σότερα θέµατα.
[3] S. Baase. Computer Algorithms: Introduction to Design and Analysis, 2nd Edition.
Adisson – Wesley, 1988. Καλύπτει πολλά θέµατα επικεντρώνοντας στην ουσία
αντί των τεχνικών λεπτοµερειών.
[4] G. Brassard και P. Bratley. Algorithmics: Theory and Practice. Prentice – Hall,
1988. Πολύ καλό βιβλίο µε εξαιρετικά παραδείγµατα και ασκήσεις. Επικεντρώ-
νει στην παρουσίαση των µεθόδων αντί της επίλυσης συγκεκριµένων προβλη-
µάτων.
[5] K. Mehlhorn. Data Structures and Algorithms. Springer – Verlag, 1984. Αποτε-
λείται από τρεις τόµους, οι δύο πρώτοι από τους οποίους αντιστοιχούν στην ύλη
που παρουσιάζεται σε αυτό το βιβλίο. Σε βάθος παρουσίαση πολλών σηµαντι-
κών αλγοριθµικών ζητηµάτων. Πολύ καλή παρουσίαση των δοµών δεδοµένων
που απαιτούνται για την αποδοτική υλοποίηση των αλγόριθµων.
[6] Robert Sedgewick. Algorithms, 2nd Edition. Addison – Wesley, 1988. Καλύπτει
πληθώρα θεµάτων, επικεντρώνοντας στην κατανοητή παρουσίαση αντί των τεχνι-
κών λεπτοµερειών. Έχει πολλά και καλά παραδείγµατα, σχήµατα και προγραµ-
µατιστικό κώδικα που υλοποιεί µερικούς αλγόριθµους σε σύγχρονες γλώσσες
προγραµµατισµού (π.χ. C, C + + ).
Όσον αφορά στην Ελληνική βιβλιογραφία, προτείνουµε τα παρακάτω βιβλία:
B I B § I O ° PA º I A 31

[7] Φ. Αφράτη και Γ. Παπαγεωργίου. Αλγόριθµοι: Μέθοδοι Σχεδίασης και Ανάλυση


Πολυπλοκότητας. Εκδόσεις Συµµετρία.
[8] Θ. Παπαθεοδώρου. Αλγόριθµοι: Εισαγωγικά Θέµατα και Παραδείγµατα. Εκδό-
σεις Πανεπιστηµίου Πατρών, 1999.
ª·ıËÌ·ÙÈÎfi ˘fi‚·ıÚÔ

™ÎÔfi˜
∫ ∂

2
º

Σκοπός αυτού του κεφαλαίου είναι ο ορισµός του συµβολισµού που χρησιµοποιείται
για την ασυµπτωτική εκτίµηση, και η παρουσίαση µερικών µεθόδων για τον υπολο-
γισµό αθροισµάτων και την επίλυση αναδροµικών εξισώσεων, τα οποία είναι µαθη-
µατικά προβλήµατα που συχνά ανακύπτουν κατά την ανάλυση των αλγορίθµων.
∞ § ∞ π √

¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·
Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση:
• Να ορίσει και να χρησιµοποιήσει τον ασυµπτωτικό συµβολισµό.
• Να συγκρίνει την τάξη µεγέθους δύο συναρτήσεων µε χρήση του ασυµπτωτικού
συµβολισµού.
• Να προσδιορίσει την τάξη µεγέθους αθροισµάτων ενδιάµεσου βαθµού δυσκολίας.
• Να υπολογίσει ακριβείς ασυµπτωτικές εκτιµήσεις για τη λύση απλών αναδροµικών
εξισώσεων.

ŒÓÓÔȘ ÎÏÂȉȿ
• ασυµπτωτικός συµβολισµός (Θ, Ο, Ω, • αναδροµική εξίσωση
ο, ω – συµβολισµοί)
• µέθοδοι επίλυσης αναδροµικών εξι-
• µέθοδοι υπολογισµού αθροισµάτων
σώσεων (επανάληψη, δέντρο της
(µαθηµατική επαγωγή, υπολογισµός
φραγµάτων) αναδροµής, αντικατάσταση, Θεώρη-
• αναδροµικός αλγόριθµος µα της Κυριαρχίας)

∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Η ανάλυση των αλγορίθµων διευκολύνεται και, συχνά, βασίζεται στη χρήση µαθη-
µατικών εργαλείων. Μερικά από αυτά τα εργαλεία είναι απλά και γνωστά, όπως για
παράδειγµα, ο υπολογισµός του κλειστού τύπου απλών αθροισµάτων, ενώ άλλα µπο-
ρεί να µοιάζουν καινούργια και δυσκολότερα, όπως για παράδειγµα, ο ασυµπτωτι-
κός συµβολισµός και η επίλυση αναδροµικών εξισώσεων.
Η κατανόηση και η εξοικείωση µε το συµβολισµό και τις µαθηµατικές τεχνικές που
34 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √

χρησιµοποιούνται στην ανάλυση των αλγορίθµων επιτρέπει να επικεντρώνουµε στην


ουσία του σχεδιασµού του αλγορίθµου και να εντοπίζουµε τα χαρακτηριστικά εκείνα
που κάνουν τον αλγόριθµο αποδοτικό. ∆ιαφορετικά, η προσπάθεια της αποκωδικο-
ποίησης των µαθηµατικών λεπτοµερειών και συµβόλων αποσπά την προσοχή µας
από τις ουσιώδεις αλγοριθµικές ιδέες, που αποτελούν το κλειδί για την αποδοτική
επίλυση των προβληµάτων.
Σε αυτό το κεφάλαιο εισάγεται ο συµβολισµός και παρουσιάζονται τα µαθηµατικά
εργαλεία που, συνήθως, χρησιµοποιούνται στην ανάλυση των αλγορίθµων. Η κατα-
νόηση των παραδειγµάτων που µελετώνται είναι σηµαντική, αφού αρκετά από αυτά
ανακύπτουν στην ανάλυση αλγορίθµων που θα µελετήσουµε στη συνέχεια.
Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες:
2.1. Ασυµπτωτικός Συµβολισµός
2.2. Αθροίσµατα
2.3. Αναδροµικές Εξισώσεις
2.1 ∞™Àª¶∆ø∆π∫√™ ™Àªµ√§π™ª√™ 35

2.1 ∞Û˘ÌÙˆÙÈÎfi˜ Û˘Ì‚ÔÏÈÛÌfi˜

Στο προηγούµενο κεφάλαιο είδαµε ότι η ασυµπτωτική εκτίµηση του χρόνου εκτέ-
λεσης ενός αλγορίθµου επιτρέπει τη σύγκριση διαφορετικών αλγορίθµων µε κριτή-
ριο την αποτελεσµατικότητά τους, και παρέχει µια απλή κατηγοριοποίηση των αλγο-
ρίθµων. Η ασυµπτωτική εκτίµηση αγνοεί τις σταθερές και εξετάζει µόνο την τάξη
µεγέθους της συνάρτησης που προσδιορίζει το χρόνο εκτέλεσης ενός αλγορίθµου.
Αυτό γιατί, όπως είδαµε και σε σχετικά παραδείγµατα, όταν το µέγεθος της εισόδου
n γίνει αρκετά µεγάλο, τότε οι τιµές µιας συνάρτησης µεγαλύτερης τάξης µεγέθους,
π.χ. n2, είναι σηµαντικά µεγαλύτερες από τις τιµές µιας συνάρτησης µικρότερης
τάξης µεγέθους, π.χ. n log n. Εποµένως, ένας ασυµπτωτικά αποδοτικότερος αλγό-
ριθµος είναι και στην πράξη αποδοτικότερος, για την µεγάλη πλειοψηφία των στιγ-
µιότυπων εισόδου.
Στη συνέχεια, θα περιγράψουµε διάφορους καθιερωµένους τύπους ασυµπτωτικού
συµβολισµού, οι οποίοι χρησιµοποιούνται πολύ συχνά στην ασυµπτωτική εκτίµηση
του χρόνου εκτέλεσης των αλγορίθµων. Ο ασυµπτωτικός συµβολισµός, που χρησι-
µοποιείται για την περιγραφή του χρόνου εκτέλεσης των αλγορίθµων, ορίζεται σε
συναρτήσεις, οι οποίες έχουν πεδίο ορισµού το σύνολο των φυσικών αριθµών IN =
{0, 1, 2, …}. Τέτοιου είδους συµβολισµός είναι κατάλληλος για την περιγραφή µιας
συνάρτησης T(n), η οποία δίνει το χρόνο εκτέλεσης ενός αλγορίθµου, και ορίζεται
µόνο για ακέραια µεγέθη εισόδου. Από την άλλη πλευρά, είναι συχνά βολικό να γίνε-
ται κατάχρηση του συµβολισµού µε διάφορους τρόπους. Το πλέον συνηθισµένο
παράδειγµα είναι η χρήση του ίδιου συµβολισµού για συναρτήσεις µε πεδίο ορισµού
τους πραγµατικούς αριθµούς, ή κάποιο υποσύνολο του N. Παρόλα αυτά, σηµαντι-
κή είναι η κατανόηση της ουσίας του ασυµπτωτικού συµβολισµού, ώστε η κατά-
χρησή του να µην κινδυνεύει να µετατραπεί σε λάθος χρήση.

2.1.1 √ Û˘Ì‚ÔÏÈÛÌfi˜ £

Ο ασυµπτωτικός συµβολισµός Θ χρησιµοποιείται για τον ακριβή προσδιορισµό της


τάξης µεγέθους µίας συνάρτηση f(n). Συγκεκριµένα, για κάθε συνάρτηση g(n), το
σύνολο συναρτήσεων Θ(g(n)) περιλαµβάνει όλες τις συναρτήσεις που έχουν την ίδια
ακριβώς τάξη µεγέθους µε τη g(n). Τυπικά, δεδοµένης µιας συνάρτησης g(n), µε
Θ(g(n)) συµβολίζουµε το σύνολο συναρτήσεων
Θ(g(n)) = {f(n) : υπάρχουν θετικές σταθερές c1, c2, και n0 τέτοιες, ώστε:
0 £ c1g(n) £ f(n) £ c2g(n) για κάθε n ≥ n0} .
Σύµφωνα µε τον παραπάνω ορισµό, η συνάρτηση f(n) ανήκει στην κλάση συναρτή-
36 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √

σεων Θ(g(n)), αν υπάρχουν θετικές σταθερές c1, c2 τέτοιες ώστε η f(n) να περιορί-
ζεται µεταξύ c1g(n) και c2g(n) για αρκετά µεγάλες τιµές του n. Αυτό αναπαρίσταται
γραφικά στο Σχήµα 2.1.(α). Για όλες τις τιµές του n που είναι µεγαλύτερες του n0,
οι τιµές της f(n) βρίσκονται πάνω από το c1g(n) και κάτω από το c2g(n). ∆ιαφορετι-
κά, για κάθε n ≥ n0, η g(n) προσεγγίζει την f(n) κατά ένα σταθερό παράγοντα. Για
αυτό λέµε ότι η g(n) αποτελεί µια ασυµπτωτικά ακριβή εκτίµηση (asymptotically tight
bound) για την f(n).

c2g(n)
c g(n)
f(n) f(n)
c1g(n) f(n)

c g(n)

n0 n n0 n n0 n

f(n)=Θ(g(n)) f(n)=O(g(n)) f(n)=Ω(g(n))


(α) (β) (γ)
™¯‹Ì· 2.1
Γραφική Επίσης, αξίζει να σηµειωθεί ότι ο ορισµός του Θ(g(n)) απαιτεί κάθε µέλος της κλά-
αναπαράσταση σης να είναι ασυµπωτικά µη αρνητικό, δηλαδή η τιµή f(n) πρέπει να είναι µεγαλύ-
του ασυµπτωτικού τερη ή ίση του 0 για αρκετά µεγάλο n. Εποµένως, η ίδια η συνάρτηση g(n) που χρη-
συµβολισµού. σιµοποιείται για τον ορισµό της κλάσης πρέπει να είναι ασυµπτωτικά µη αρνητική,
ειδάλλως, το σύνολο Θ(g(n)) θα είναι κενό.
Αν και ο συµβολισµός Θ(g(n)) δηλώνει κλάση συναρτήσεων, συνήθως θα γράφου-
µε f(n) = Θ(g(n)) για να δηλώσουµε ότι η f(n) είναι µέλος του συνόλου Θ(g(n)), δηλα-
δή f(n) Œ Θ(g(n)). Το ίδιο θα γίνεται και µε τα υπόλοιπα είδη ασυµπτωτικού συµβο-
λισµού που θα ορίσουµε στη συνέχεια. Αυτό είναι ένα πρώτο παράδειγµα κατάχρη-
σης συµβολισµού, το οποίο δεν δηµιουργεί ουσιώδη προβλήµατα.

Σαν ένα πρώτο παράδειγµα, ας θεωρήσουµε ένα οποιαδήποτε πολυώνυµο δευτέρου


βαθµού f(n) = Α n2 + β n + γ, όπου τα α, β, γ είναι σταθερές, και Α > 0. ∆ιαισθητικά,
καθώς το n τείνει στο άπειρο, ο κυρίαρχος όρος α n2 θα καθορίζει τη συµπεριφορά
της συνάρτησης f(n). Εποµένως, f(n) = Θ(n2). Για να δείξουµε το ίδιο, σύµφωνα µε
τον ορισµό, θεωρούµε σταθερές

(
c1 = α/4, c2 = 7α/4, και n0 = 2◊max | b | /a , | g | /a . )
2.1 ∞™Àª¶∆ø∆π∫√™ ™Àªµ√§π™ª√™ 37

Γι΄ αυτή την επιλογή παραµέτρων, είναι, για κάθε


n ≥ n0, 0 £ c1 n2 £ Α n2 + β n + γ £ c2n2.
Χρησιµοποιώντας τον ορισµό, µπορούµε να δείξουµε ότι n3 π Θ(n2). Πράγµατι, αν
υποθέσουµε ότι υπάρχουν σταθερές c2 και n0 τέτοιες ώστε n3 £ c2n2, για όλα τα n ≥
n0, καταλήγουµε στο συµπέρασµα ότι c2 ≥ n, το οποίο δεν µπορεί να ισχύει, αφού το
c2 είναι σταθερά, ενώ το n τείνει στο άπειρο.

Γενικότερα, οι όροι µικρότερης τάξης µεγέθους µιας ασυµπτωτικά µη αρνητικής


συνάρτησης f(n) µπορούν να αγνοηθούν κατά τον προσδιορισµό µιας ασυµπτωτικά
ακριβούς εκτίµησης για την f(n). Καθώς το n τείνει στο άπειρο, οι όροι µικρότερης
τάξης µεγέθους καθίστανται αµελητέοι σε σχέση µε τον κυρίαρχο όρο. Έτσι, θέτο-
ντας τη σταθερά c1 σε τιµή λίγο µεγαλύτερη, και τη σταθερά c2 σε τιµή λίγο µικρό-
τερη από το συντελεστή του κυρίαρχου όρου, οι ανισότητες του ορισµού του συµ-
βολισµού Θ ικανοποιούνται για αρκετά µεγάλες τιµές του n. Εποµένως, ο (σταθε-
ρός) συντελεστής του κυρίαρχου όρου µπορεί να αγνοηθεί, και µένει ο κυρίαρχος
όρος, ο οποίος παρέχει µια ασυµπτωτικά ακριβή εκτίµηση για τη συνάρτηση. Με
αυτό τον τρόπο, µπορεί να αποδειχθεί ότι για κάθε πολυώνυµο βαθµού d, p(n) =

Â
d
a i ni , όπου τα αi είναι σταθερές και αd > 0, είναι p(n) = Θ(nd).
i =0

Επίσης, αφού κάθε σταθερά είναι ένα πολυώνυµο µηδενικού βαθµού, κάθε σταθε-
ρά µπορεί να εκφραστεί σαν Θ(n0), ή απλούστερα σαν Θ(1). Βέβαια, ο συµβολισµός
Θ(1) είναι καταχρηστικός γιατί δεν ξεκαθαρίζει τη µεταβλητή n. Στη συνέχεια, θα
χρησιµοποιούµε συχνά το συµβολισµό Θ(1) για να δηλώσουµε είτε µία σταθερά,
είτε µια συνάρτηση η οποία έχει σταθερή τιµή.

2.1.2 √ Û˘Ì‚ÔÏÈÛÌfi˜ √

Είδαµε ότι ο συµβολισµός Θ παρέχει µία ακριβή εκτίµηση της τάξης µεγέθους µιας
συνάρτησης. Στην περίπτωση που χρειαζόµαστε µόνο ένα ασυµπωτικό άνω φράγµα
στην τάξη µεγέθους µιας συνάρτησης, χρησιµοποιούµε το συµβολισµό Ο. ∆εδοµέ-
νης µιας συνάρτησης g(n), συµβολίζουµε µε Ο(g(n)) το σύνολο των συναρτήσεων
Ο(g(n)) = {f(n): υπάρχουν θετικές σταθερές c και n0 τέτοιες, ώστε:
0 £ f(n) £ cg(n) για κάθε n ≥ n0} .
Η συνάρτηση g(n) πολλαπλασιασµένη µε ένα σταθερό παράγοντα αποτελεί ένα ασυ-
µπτωτικό άνω φράγµα για τη συνάρτηση f(n). Το Σχήµα 2.1.(β) δίνει τη διαίσθηση
πίσω από το συµβολισµό Ο. Για όλα τα n ≥ n0, η συνάρτηση f(n) βρίσκεται κάτω από
38 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √

τη c g(n). Όπως και στην περίπτωση του συµβολισµού Θ, αν και το Ο(g(n)) ορίζει
κλάση συναρτήσεων, γράφουµε f(n) = O(g(n)) για να δηλώσουµε ότι η f(n) είναι
µέλος του συνόλου O(g(n)).
Συγκρίνοντας τους ορισµούς των συµβολισµών Θ και Ο, καταλήγουµε στο συµπέ-
ρασµα ότι κάθε συνάρτηση f(n) που ανήκει στο Θ(g(n)), ανήκει και στο O(g(n)).
∆ηλαδή, Θ(g(n)) Õ O(g(n)). Εποµένως, το γεγονός ότι κάθε τετραγωνική συνάρτη-
ση f(n) = Α n2 + β n + γ, Α > 0, ανήκει στο Θ(n2), σηµαίνει, επίσης, ότι f(n) = O(n2).
Επιπλέον, αν θεωρήσουµε µια οποιαδήποτε γραµµική συνάρτηση f(n) = Α n + β, Α
> 0, θέτοντας τις σταθερές c = Α + |β|, και n0 = 1, έχουµε ότι, για κάθε n ≥ n0, f(n) £
c n2. Εποµένως, κάθε γραµµική συνάρτηση, επίσης, ανήκει στο O(n2).
Ο συµβολισµός Ο, πολλές φορές, χρησιµοποιείται για τη διατύπωση κατά προσέγ-
γιση εκτιµήσεων σχετικά µε το χρόνο εκτέλεσης ενός αλγορίθµου. Για παράδειγµα,
έστω ένας αλγόριθµος ο οποίος περιέχει το ακόλουθο διπλό φωλιασµένο βρόγχο:
for i ¨ 1 to n do
for j ¨ i to n do
<ÂÓÙÔÏ‹>
Αν το κόστος εκτέλεσης της <εντολής> είναι Ο(1), δηλαδή σταθερό, τότε το συνο-
λικό κόστος για την εκτέλεση του βρόγχου είναι Ο(n2), γιατί οι δείκτες i και j παίρ-
νουν τιµές από 1 µέχρι n, και για κάθε τιµή του i, η <εντολή> εκτελείται το πολύ n
φορές (για την ακρίβεια εκτελείται n – i + 1 φορές).
Παρατηρείστε ότι, αφού ο συµβολισµός Ο παρέχει ένα άνω φράγµα, όταν τον χρη-
σιµοποιούµε για να φράξουµε το χρόνο εκτέλεσης χειρότερης περίπτωσης ενός αλγο-
ρίθµου, έχουµε, επίσης, και ένα άνω φράγµα στο χρόνο εκτέλεσης για κάθε δεδοµέ-
νη είσοδο. Για παράδειγµα, το γεγονός ότι ο χρόνος εκτέλεσης χειρότερης περίπτω-
σης της insertion sort είναι O(n2) σηµαίνει ότι ο χρόνος εκτέλεσης της insertion sort
(για κάθε είσοδο) είναι O(n2). Κάτι αντίστοιχο δεν ισχύει για το συµβολισµό Θ. Αν
και ο χρόνος εκτέλεσης χειρότερης περίπτωσης της insertion sort είναι Θ(n2), είδα-
µε ότι υπάρχουν στιγµιότυπα εισόδου για τα οποία ο χρόνος εκτέλεσης της insertion
sort είναι γραµµικός, εποµένως, όχι Θ(n2).
Αν και τεχνικά είναι κατάχρηση, θα χρησιµοποιούµε συχνά την έκφραση «ο χρόνος
εκτέλεσης ενός αλγορίθµου είναι Ο(n2)». Η κατάχρηση έγκειται στο γεγονός ότι, αφού
ο χρόνος εκτέλεσης ενός αλγορίθµου εξαρτάται από τη συγκεκριµένη είσοδο, δεν
µπορεί να εκφραστεί σαν συνάρτηση του n. Η παραπάνω φράση όµως σηµαίνει ότι
ο χρόνος εκτέλεσης στη χειρότερη περίπτωση (ο οποίος φράσσει άνω το χρόνο εκτέ-
λεσης για κάθε στιγµιότυπο εισόδου, και είναι συνάρτηση του n) ανήκει στο O(n2).
2.1 ∞™Àª¶∆ø∆π∫√™ ™Àªµ√§π™ª√™ 39

2.1.3 √ Û˘Ì‚ÔÏÈÛÌfi˜ ø

Όπως ο συµβολισµός Ο παρέχει ένα ασυµπτωτικό άνω φράγµα, έτσι και ο συµβολι-
σµός Ω παρέχει ένα ασυµπτωτικό κάτω φράγµα στην τάξη µεγέθους µιας συνάρτη-
σης. ∆εδοµένης µιας συνάρτησης g(n), συµβολίζουµε µε Ω(g(n)) το σύνολο των
συναρτήσεων
Ω(g(n)) = {f(n): υπάρχουν θετικές σταθερές c και n0 τέτοιες, ώστε:
0 £ cg(n) £ f(n) για κάθε n ≥ n0} .
Το Σχήµα 2.1.(γ) αναπαριστά τη διαίσθηση του συµβολισµού Ω. Χρησιµοποιώντας
τους ορισµούς των ασυµπτωτικών συµβολισµών Θ, Ο και Ω, µπορούµε να αποδεί-
ξουµε το ακόλουθο θεώρηµα.

Θεώρηµα 2.1: Για κάθε ζευγάρι συναρτήσεων f(n) και g(n), f(n) = Θ(g(n)) αν και
µόνο αν f(n) = O(g(n)) και f(n) = Ω(g(n)).

¢Ú·ÛÙËÚÈfiÙËÙ· 2.1

Αποδείξτε το Θεώρηµα 2.1.

Εφαρµόζοντας το Θεώρηµα 2.1, από το γεγονός ότι Α n2 + β n + γ = Θ(n2), για κάθε


τριάδα σταθερών α, β, γ, και Α > 0, συνάγουµε ότι Α n2 + β n + γ = Ο(n2), και Α n2 +
β n + γ = Ω(n2). Στην πράξη, συνήθως θα χρησιµοποιούµε το Θεώρηµα 2.1 κατά την
αντίθετη φορά, δηλαδή για να συνάγουµε ακριβείς εκτιµήσεις από άνω και κάτω
φράγµατα.
Επειδή ο συµβολισµός Ω παρέχει ένα κάτω φράγµα για µία συνάρτηση, όταν τον
χρησιµοποιούµε για να φράξουµε το χρόνο εκτέλεσης καλύτερης περίπτωσης ενός
αλγορίθµου, το αποτέλεσµα αποτελεί ένα κάτω φράγµα στο χρόνο εκτέλεσης του
αλγορίθµου, για όλα τα στιγµιότυπα εισόδου. ∆ηλαδή, το γεγονός ότι ο χρόνος εκτέ-
λεσης καλύτερης περίπτωσης της insertion sort είναι Ω(n) σηµαίνει ότι ο χρόνος εκτέ-
λεσης της insertion sort είναι πάντα Ω(n), ή διαφορετικά ποτέ η insertion sort δεν
πρόκειται να τερµατίσει σε λιγότερο από γραµµικό χρόνο.
Από την άλλη πλευρά, ο χρόνος εκτέλεσης της insertion sort είναι Ο(n2), αλλά όχι
και Ω(n2), καθώς υπάρχουν στιγµιότυπα εισόδου τα οποία χρειάζονται γραµµικό
χρόνο. Παρόλα αυτά, µπορούµε να πούµε ότι ο χρόνος εκτέλεσης χειρότερης περί-
πτωσης της insertion sort είναι Ω(n2), αφού υπάρχουν στιγµιότυπα εισόδου για τα
40 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √

οποία ο αλγόριθµος χρειάζεται τετραγωνικό χρόνο. Ανακεφαλαιώνοντας, ο χρόνος


εκτέλεσης χειρότερης περίπτωσης της insertion sort είναι Θ(n2), ο χρόνος εκτέλεσης
καλύτερης περίπτωσης της insertion sort είναι Θ(n), αλλά ο χρόνος εκτέλεσης (όχι
στην καλύτερη ή στη χειρότερη περίπτωση, αλλά γενικά) της insertion sort κινείται
µεταξύ του Ω(n) και Ο(n2).

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 2.1

Στο προηγούµενο κεφάλαιο είχαµε αναλύσει τους αλγορίθµους selection sort και
linear search. Χρησιµοποιείστε τα αποτελέσµατα αυτών των αναλύσεων για να
χαρακτηρίσετε σαν σωστές ή λανθασµένες τις παρακάτω προτάσεις:
Σωστό Λάθος
1. Ο χρόνος εκτέλεσης της selection sort είναι Θ(n2). ❏ ❏
2. Ο χρόνος εκτέλεσης της selection sort είναι Ο(n2). ❏ ❏
3. Ο χρόνος εκτέλεσης της selection sort είναι Ω(n). ❏ ❏
4. Ο χρόνος εκτέλεσης της selection sort είναι Ο(n3). ❏ ❏
5. Ο χρόνος εκτέλεσης χειρότερης περίπτωσης
της selection sort είναι Ω(n3). ❏ ❏
6. Ο χρόνος εκτέλεσης καλύτερης περίπτωσης
της selection sort είναι Θ(n2). ❏ ❏
7. Ο χρόνος εκτέλεσης χειρότερης περίπτωσης
της selection sort είναι Θ(n2). ❏ ❏
8. Ο χρόνος εκτέλεσης της linear search είναι Θ(n). ❏ ❏
9. Ο χρόνος εκτέλεσης χειρότερης περίπτωσης
της linear search είναι Θ(n). ❏ ❏
10.Ο χρόνος εκτέλεσης µέσης περίπτωσης
της linear search είναι Θ(n). ❏ ❏
11.Ο χρόνος εκτέλεσης καλύτερης περίπτωσης
της linear search είναι Ω(n). ❏ ❏
12.Ο χρόνος εκτέλεσης χειρότερης περίπτωσης
της linear search είναι Ω(n). ❏ ❏
2.1 ∞™Àª¶∆ø∆π∫√™ ™Àªµ√§π™ª√™ 41

13.Ο χρόνος εκτέλεσης καλύτερης περίπτωσης


της linear search είναι Ο(n). ❏ ❏
14.Ο χρόνος εκτέλεσης καλύτερης περίπτωσης
της linear search είναι Ο(1). ❏ ❏
15.Ο χρόνος εκτέλεσης χειρότερης περίπτωσης
της linear search είναι Ω(1). ❏ ❏

2.1.4 √ Û˘Ì‚ÔÏÈÛÌfi˜ Ô

Το ασυµπτωτικό άνω φράγµα που παρέχεται από το συµβολισµό Ο µερικές φορές


είναι ακριβές και άλλες όχι. Για παράδειγµα, το φράγµα 2n2 = O(n2) είναι ακριβές,
ενώ το φράγµα 2n, = Ο(n2), δεν είναι. Ο συµβολισµός ο (µικρό όµικρον) δηλώνει
ένα άνω φράγµα το οποίο δεν είναι ακριβές. Συγκεκριµένα, δεδοµένης µιας συνάρ-
τησης g(n), συµβολίζουµε µε ο(g(n)) το σύνολο των συναρτήσεων
ο(g(n)) = {f(n): για κάθε θετική σταθερά c, υπάρχει σταθερά n0 > 0 τέτοια, ώστε:
0 £ f(n) < cg(n), για κάθε n ≥ n0} .

Οι ορισµοί των συµβολισµών Ο και ο είναι παρόµοιοι. Η ουσιαστική διαφορά είναι


ότι στον ορισµό του Ο, ισχύει 0 £ f(n) £ c g(n) για κάποια σταθερά c > 0, ενώ στον
ορισµό του ο, ισχύει 0 £ f(n) < c g(n) για κάθε σταθερά c > 0. Αυτό σηµαίνει ότι στην
περίπτωση του ο, η συνάρτηση f(n) γίνεται µικρότερη από τη g(n) κατά µια οσοδή-
ποτε µεγάλη σταθερά, καθώς το n τείνει στο άπειρο. Σε διαφορετική µαθηµατική
f (n )
διατύπωση, αυτό γράφεται nlim = 0 . Από τα παραπάνω συνάγεται ότι
Æ• g (n )
2n = o(n2), αλλά 2n2 π o(n2).

2.1.5 √ Û˘Ì‚ÔÏÈÛÌfi˜ ˆ

Σε αναλογία, ο συµβολισµός ω είναι για το συµβολισµό Ω ότι το ο για το Ο. Ο συµ-


βολισµός ω (µικρό ωµέγα) χρησιµοποιείται για τη δήλωση ενός κάτω φράγµατος
που δεν είναι ακριβές. Συγκεκριµένα, δεδοµένης µιας συνάρτησης g(n), συµβολί-
ζουµε µε ω(g(n)) το σύνολο των συναρτήσεων
ω(g(n)) = {f(n): για κάθε θετική σταθερά c, υπάρχει σταθερά n0 > 0 τέτοια, ώστε:
0 £ cg(n) < f(n), για κάθε n ≥ n0} .
42 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √

Ένας ισοδύναµος τρόπος να διατυπωθεί ο παραπάνω ορισµός είναι ότι η συνάρτη-


ση f(n) = ω(g(n)) αν και µόνο αν g(n) = o(f(n)). Ο συµβολισµός f(n) = ω(g(n)) δηλώ-
f (n )
νει ότι lim = • , εφόσον το όριο υπάρχει. ∆ηλαδή, η συνάρτηση f(n) γίνεται
nƕ g (n )
οσοδήποτε µεγαλύτερη σε σύγκριση µε τη g(n), καθώς το n τείνει στο άπειρο. Για
παράδειγµα, 2n2 = ω(n), αλλά 2n2 π ω(n2).

¢Ú·ÛÙËÚÈfiÙËÙ· 2.2

Ας υποθέσουµε ότι, για την επίλυση ενός δεδοµένου προβλήµατος, ένας αλγόριθ-
µος Α χρειάζεται χρόνο f(n), και ένας αλγόριθµος Β χρόνο g(n). Απαντήστε τις ακό-
λουθες τέσσερις ερωτήσεις για κάθε µια από τις περιπτώσεις (α) – (δ).
1. Είναι ο Α ταχύτερος από τον Β για όλες τις τιµές του n;
2. Είναι ο Β ταχύτερος από τον Α για όλες τις τιµές του n;
3. Είναι ο Α ταχύτερος από τον Β για όλες τις τιµές του n που είναι µεγαλύτερες
µιας σταθεράς n0;
4. Είναι ο Β ταχύτερος από τον Α για όλες τις τιµές του n που είναι µεγαλύτερες
µιας σταθεράς n0;
(α). g(n) = Ω(f(n) log n)
(β). g(n) = Θ(f(n) log n)
(γ). g(n) = Ο(f(n) log n)
(δ). g(n) = ο(f(n) log n)

2.1.6 ∞Û˘ÌÙˆÙÈÎfi˜ Û˘Ì‚ÔÏÈÛÌfi˜ Û ̷ıËÌ·ÙÈΤ˜ ÂÎÊÚ¿ÛÂȘ

Όταν ένας ασυµπτωτικός συµβολισµός αποτελεί το δεξιό µέλος µιας ισότητας, π.χ.,
4n2 + 3n + 10 = O(n2), δηλώνει ότι το αριστερό µέλος, π.χ. 4n2 + 3n + 10, ανήκει στο
σύνολο O(n2). Γενικά, όταν ένας ασυµπτωτικός συµβολισµός εµφανίζεται σε µία
µαθηµατική έκφραση, π.χ. 4n2 + 3n + 10 = 4n2 + O(n), εκλαµβάνεται σαν µία «ανώ-
νυµη» συνάρτηση, η οποία ανήκει στο σύνολο που προσδιορίζεται από το συµβολι-
σµό, δηλαδή στο συγκεκριµένο παράδειγµα στο O(n). Με τον όρο «ανώνυµη»
συνάρτηση δηλώνεται κάθε συνάρτηση για την οποία δεν ενδιαφερόµαστε για τον
ακριβή ορισµό της, παρά µόνο για κάποια εκτίµηση / φράγµα της τάξης µεγέθους
της. Στο συγκεκριµένο παράδειγµα, ο όρος O(n) έχει αντικαταστήσει τη συνάρτηση
2 . 2 ∞ £ ƒ √ π ™ ª ∞∆∞ 43

3n + 10. Όταν ενδιαφερόµαστε µόνο για την ασυµπτωτική συµπεριφορά µιας ποσό-
τητας, η χρήση ασυµπτωτικού συµβολισµού σε µαθηµατικές εκφράσεις απλοποιεί
την ανάλυση, γιατί εξαλείφει µη σηµαντικούς όρους.
Μερικές φορές θα γράφουµε εξισώσεις τις µορφής: 2n2 + Θ(n) = Θ(n2). Μια τέτοια
εξίσωση δηλώνει ότι, ανεξάρτητα της επιλογής της ανώνυµης συνάρτησης που δηλώ-
νεται µε το Θ(n), µπορούµε να διαλέξουµε µια ανώνυµη συνάρτηση στη θέση του
Θ(n2) στο δεξιό µέλος της εξίσωσης, ώστε να ισχύει η ισότητα. Ο ίδιος κανόνας
ερµηνείας πρέπει να χρησιµοποιείται όταν τέτοιες εκφράσεις εµφανίζονται η µία
µετά την άλλη, π.χ. 4n2 + 3n + 10 = 4n2 + Θ(n) = Θ(n2).

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 2.2

(Α). Βάλτε τις συναρτήσεις που ακολουθούν σε αύξουσα σειρά τάξης µεγέθους:

22 n , log n, n , n n , log 2 n, n log n, 2 n! , 2 n , log log n, n! .

(Β). Στον πίνακα που ακολουθεί, για κάθε ζευγάρι συναρτήσεων (f, g), σηµειώστε
αν η συνάρτηση f είναι Ο, ο, Ω, ω, ή Θ της g. Θεωρείστε ότι k ≥ 3 και ε > 0
είναι σταθερές οι οποίες δίνονται.
f(n) g(n) Ο ο Ω ω Θ
(α) 2n + k 2n + 2k – nk
3
(β) (log n ) 3 log(nlog( n ) )
(γ) kn (3k)n/3
(δ) (kn)1– ε n1– ε
(ε) n3– 10n 8log n

2.2 ∞ıÚÔ›ÛÌ·Ù·

Όταν η λειτουργία ενός αλγορίθµου βασίζεται σε κατασκευές, όπως βρόγχοι for ή


while, ο χρόνος εκτέλεσης του αλγορίθµου µπορεί να εκφραστεί σαν το άθροισµα
των χρόνων που θα διαρκέσει η κάθε επανάληψη.

Για παράδειγµα, ο αλγόριθµος insertion sort αποτελείται από ένα for βρόγχο, ο οποί-
ος εκτελείται n – 1 φορές στη χειρότερη περίπτωση, και η j–οστή επανάληψη του βρόγ-
χου διαρκεί χρόνο ανάλογο του j. Εποµένως, ο χρόνος εκτέλεσης χειρότερης περί-
44 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √

Â
n
πτωσης του αλγορίθµου insertion sort είναι ανάλογος του αθροίσµατος j.
j =2

Επίσης, ο αλγόριθµος selection sort (Άσκηση Αυτοαξιολόγησης 1.1) αποτελείται


από ένα for βρόγχο, του οποίου η i – οστή επανάληψη χρειάζεται χρόνο ανάλογο
του i. Συνεπώς, ο χρόνος εκτέλεσης του αλγορίθµου insertion sort είναι ανάλογος

Â
n -1
του αθροίσµατος (n - i + 1) .
i =1

Στη συνέχεια αυτής της ενότητας θα ανακεφαλαιώσουµε δύο γενικές τεχνικές για
τον υπολογισµό και την εκτίµηση απλών αθροισµάτων. Συγκεκριµένα, θα αναφερ-
θούµε στη χρήση µαθηµατικής επαγωγής για τον υπολογισµό γνωστών αθροισµά-
των, και στον υπολογισµό φραγµάτων, ενώ πολλές φορές θα χρειαστεί να συνδυά-
σουµε αυτές τις τεχνικές για να έχουµε το επιθυµητό αποτέλεσµα.

2.2.1 ª·ıËÌ·ÙÈ΋ Â·ÁˆÁ‹


Η µαθηµατική επαγωγή χρησιµοποιείται για να επιβεβαιώσουµε ήδη γνωστά απο-
τελέσµατα, ή αποτελέσµατα που έχουν προκύψει µε άλλες τεχνικές. Για παράδειγ-

Â
n -1
µα, έστω το άθροισµα (n - i + 1) , το οποίο ανέκυψε κατά την ανάλυση του
i =1

αλγορίθµου selection sort. Μια απλή ανάπτυξη του αθροίσµατος δίνει

n -1 Ê n ˆ
Â
i =1
(n - i + 1) = n + (n - 1) + (n - 2 ) + L + 3 + 2 = Á
Ë
 i˜¯ - 1 .
i =1

¢Ú·ÛÙËÚÈfiÙËÙ· 2.3

Χρησιµοποιείστε µαθηµατική επαγωγή για να επιβεβαιώσετε ότι

 Â
n n
(n - i + 1) = i .
i =1 i =1

Στην ανάλυση της selection sort χρησιµοποιήσαµε απ’ ευθείας το γεγονός ότι
n
n(n + 1)
Âi =
i =1
2
, το οποίο είναι γνωστό από τα Μαθηµατικά της ∆ευτεροβάθµιας

Εκπαίδευσης. Εδώ θα χρησιµοποιήσουµε µαθηµατική επαγωγή για να επιβεβαιώ-


σουµε ότι το άθροισµα των n πρώτων φυσικών αριθµών είναι n(n + 1)/2.
Προφανώς, αυτό ισχύει για n = 1, αφού 1◊2/2 = 1. Υποθέτουµε ότι ισχύει για κάποιο
n, και θα δείξουµε ότι ισχύει για n + 1. Πράγµατι, κάνοντας µερικούς απλούς υπο-
λογισµούς, καταλήγουµε στο συµπέρασµα ότι:
2 . 2 ∞ £ ƒ √ π ™ ª ∞∆∞ 45

n +1 n

 i = (n + 1) +  i
i =1 i =1

2(n + 1) n(n + 1) (n + 1)(n + 2 )


= + =
2 2 2
(n + 1)[(n + 1) + 1]
=
2
όπου στην πρώτη ισότητα βγάλαµε εκτός αθροίσµατος την περίπτωση i = n + 1, και
στη δεύτερη ισότητα χρησιµοποιήσαµε την επαγωγική υπόθεση.
n
n(n + 1)
Εποµένως, η ισότητα Âi =
i =1
2
είναι αληθής για κάθε τιµή του n.

2.2.2 ÀÔÏÔÁÈÛÌfi˜ ÊÚ·ÁÌ¿ÙˆÓ


Μερικές φορές δεν γνωρίζουµε το αποτέλεσµα του αθροίσµατος ώστε να εφαρµό-
σουµε απ’ ευθείας µαθηµατική επαγωγή. Σε αυτή την περίπτωση πρέπει να βγάλουµε
κάποια συµπεράσµατα για τη µορφή του κλειστού τύπου του αθροίσµατος, πριν τον
υπολογίσουµε ακριβώς. Μία µέθοδος για την εξαγωγή συµπερασµάτων σχετικά µε
τον κλειστό τύπο του αθροίσµατος είναι ο υπολογισµός άνω και κάτω φραγµάτων.

Â
n
Ας υποθέσουµε ότι θέλουµε να υπολογίσουµε το άθροισµα Q(n) = i 2 . Προ-
i =1
φανώς, το Q(n) = Ω(n2). Επιπλέον, αν θεωρήσουµε µόνο τους όρους
για i ≥ n/2, µπορούµε να υπολογίσουµε το ακόλουθο κάτω φράγµα για το Q(n):
n n

Âi ≥ Ân
i = n/2
2

i = n/2
2
/ 4 = n 3 / 8 = W (n 3 )
.

 Â
n n
Επίσης, ισχύει ότι i2 £ n2 = n 3 . Εποµένως, Q(n) = Θ(n3).
i =1 i =1

Έχοντας αυτό σαν δεδοµένο, είναι εύλογο να υποθέσουµε ότι ο κλειστός τύπος του
Q(n) θα είναι ένα πολυώνυµο τρίτου βαθµού, δηλαδή Q(n) = An3 + Bn2 + Cn + D.
Για να προσδιορίσουµε τους συντελεστές, υπολογίζουµε το άθροισµα για µικρές
τιµές του n.
n = 1: A + B + C + D = 1
n = 2: 8A + 4B + 2C + D = 5
n = 3: 27A + 9B + 3C + D = 14
n = 4: 64A + 16B + 4C + D = 30
Αυτό το γραµµικό σύστηµα τεσσάρων εξισώσεων µε τέσσερις αγνώστους έχει µονα-
46 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √

δικές λύσεις τις Α = 1/3, Β = 1/2, C = 1/6, και D = 0. Συνεπώς, ένας υποψήφιος κλει-
στός τύπος για το άθροισµα Q(n) είναι:
n
2n 3 + 3n2 + n n(n + 1)( 2n + 1)
Â
n 3 n2 n
i2 = + + +0= = .
i = n/2
3 2 6 6 6

Έχοντας έναν υποψήφιο κλειστό τύπο για το άθροισµα Q(n), µπορούµε να χρησιµο-
ποιήσουµε µαθηµατική επαγωγή για να αποδείξουµε την ορθότητα του ισχυρισµού µας.

¢Ú·ÛÙËÚÈfiÙËÙ· 2.4

Χρησιµοποιείστε µαθηµατική επαγωγή για να επιβεβαιώσετε ότι

n(n + 1)( 2n + 1)
Â
n
i2 = .
i =1 6

¢Ú·ÛÙËÚÈfiÙËÙ· 2.5

Â
n
∆είξτε ότι 1 i 2 = O (1) .
i =1

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 2.3

Â
n
Υπολογίστε τον κλειστό τύπο του αθροίσµατος C (n ) = i3 .
i =1

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 2.4

Â
n
Αποδείξτε ότι 3i £ c ¥ 3 n , για κάποια σταθερά c ≥ 1. Ποιά είναι η ελάχιστη
i =0

τιµή του c για την οποία ισχύει η ανισότητα; Αποδείξτε την αντίστοιχη ανισότητα,
όταν αντί του 3 έχετε µια οποιαδήποτε σταθερά a > 1 .

2.3 ∞Ó·‰ÚÔÌÈΤ˜ ÂÍÈÛÒÛÂȘ

Οι αναδροµικές εξισώσεις εµφανίζονται κατά την ανάλυση αναδροµικών αλγορίθ-


µων, δηλαδή αλγορίθµων οι οποίοι λειτουργούν καλώντας τον εαυτό τους. Οι ανα-
δροµικοί αλγόριθµοι εφαρµόζουν την τεχνική «διαίρει και βασίλευε» (divide and
2.3 ∞¡∞¢ƒ√ªπ∫∂™ ∂•π™ø™∂π™ 47

conquer) για την επίλυση ενός προβλήµατος. Για την επίλυση ενός προβλήµατος,
ένας αναδροµικός αλγόριθµος διαιρεί το πρόβληµα σε µικρότερα, επιµέρους προ-
βλήµατα, και εφαρµόζει τον εαυτό του για τη επίλυση αυτών των προβληµάτων.
Τέλος, συνδυάζει τις λύσεις των επιµέρους προβληµάτων για να δηµιουργήσει µια
λύση του αρχικού προβλήµατος.
Προφανώς, ο χρόνος εκτέλεσης ενός τέτοιου αλγορίθµου είναι ίσος µε το άθροισµα
των χρόνων για την επίλυση των επιµέρους προβληµάτων και του χρόνου για να συν-
δυαστούν οι επιµέρους λύσεις σε µία λύση για το αρχικό πρόβληµα. Σε αυτή την ενό-
τητα θα παρουσιάσουµε τρεις βασικές τεχνικές για την επίλυση τέτοιας µορφής ανα-
δροµικών εξισώσεων, οι οποίες ανακύπτουν κατά την ανάλυση των αναδροµικών
αλγορίθµων. Συγκεκριµένα, θα δούµε τη µέθοδο της επανάληψης (iteration method),
τη µέθοδο της αντικατάστασης (substitution method) και το Θεώρηµα της Κυριαρ-
χίας (Master Theorem).

2.3.1 ¶·Ú¿‰ÂÈÁÌ· ·Ó·‰ÚÔÌÈÎÔ‡ ·ÏÁÔÚ›ıÌÔ˘

Πριν ξεκινήσουµε την παρουσίαση των τεχνικών για την επίλυση αναδροµικών εξι-
σώσεων, θα περιγράψουµε και θα αναλύσουµε τον αλγόριθµο merge sort, που είναι
ένας αναδροµικός αλγόριθµος για τη διάταξη n αριθµών. Για να διατάξει έναν πίνα-
κα n αριθµών, ο αλγόριθµος merge sort διαιρεί τον αρχικό πίνακα σε δύο υποπίνα-
κες n/2 στοιχείων. Ο merge sort διατάσσει τους δύο υποπίνακες καλώντας αναδρο-
µικά τον εαυτό του και συνενώνει τους δύο (διατεταγµένους) υποπίνακες σε έναν
πίνακα του οποίου τα στοιχεία είναι διατεταγµένα σε αύξουσα σειρά.
merge_sort(A, p, r)
{¢È·Ù¿ÛÛÂÈ ÙÔÓ ˘Ô›Ó·Î· A[p, ..., r]}
if p < r then
{ ∞Ó Ô ›Ó·Î·˜ ¤¯ÂÈ ÌfiÓÔ ¤Ó· ÛÙÔȯ›Ô,
ÌÔÚ› Ó· ıˆÚËı› ‰È·ÙÂÙ·Á̤ÓÔ˜ }
q ¨ (p + r)/2;
{ ¢È·›ÚÂÛË ÙÔ˘ ÚÔ‚Ï‹Ì·ÙÔ˜ Û ‰‡Ô
ÈÛÔÌÂÁ¤ıË ˘ÔÚÔ‚Ï‹Ì·Ù· }
merge_sort(A, p, q);
merge_sort(A, q + 1, r);
{ ™˘Ó¤ÓˆÛË ÙˆÓ ‰‡Ô ‰È·ÙÂÙ·ÁÌ¤ÓˆÓ ˘ÔÈÓ¿ÎˆÓ }
merge(A, p, q, r);
Στον ψευδοκώδικα της merge sort, χρησιµοποιούµε τη διαδικασία merge(A, p, q, r),
48 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √

όπου A είναι ένας πίνακας, και p £ q £ r είναι οι δείκτες σε θέσεις του πίνακα Α που
ορίζουν τους υποπίνακες που θα συνενωθούν. Η διαδικασία merge πραγµατοποιεί
τη συνένωση των διατεταγµένων υποπινάκων A[p, …,q] και A[q + 1, …, r] σε έναν
διατεταγµένο υποπίνακα A[p, …, r].

¢Ú·ÛÙËÚÈfiÙËÙ· 2.6

Γράψτε ψευδοκώδικα για τη διαδικασία merge(A, p, q, r) και υπολογίστε το χρόνο


εκτέλεσης χειρότερης περίπτωσης. Ο χρόνος που χρειάζεται για τη συνένωση των
διατεταγµένων υποπινάκων πρέπει να είναι (στη χειρότερη περίπτωση) γραµµικός
στο µέγεθος του τελικού πίνακα, δηλαδή Θ(r – p + 1).

Στη συνέχεια, βλέπουµε ένα απλό παράδειγµα της λειτουργίας της διαδικασίας
merge_sort. Ο πίνακας εισόδου είναι A = [5, 2, 4, 6, 1, 3, 7, 6]. Οι αναδροµικές κλή-
σεις της διαδικασίας merge_sort διαιρούν τον πίνακα Α. Η ανάπτυξη της αναδροµής
σταµατά όταν κάθε υποπίνακας περιέχει µόνο ένα στοιχείο. Από αυτό το σηµείο, µε
διαδοχικές συνενώσεις, καταλήγουµε στον διατεταγµένο πίνακα Α = [1, 2, 3, 4, 5, 6,
7, 8]. Αριστερά, στο Σχήµα 2.2, φαίνονται οι πίνακες µε τους οποίους γίνονται οι ανα-
δροµικές κλήσεις της merge_sort, ενώ δεξιά οι διατεταγµένοι πίνακες που προκύ-
πτουν, κατά την επιστροφή της αναδροµής, από την εφαρµογή της διαδικασίας merge.

[5, 2, 4, 8, 1, 3, 7, 6] [1, 2, 3, 4, 5, 6, 7, 8]

[5, 2, 4, 8] [1, 3, 7, 6] [2, 4, 5, 8] [1, 3, 6, 7]

[5, 2] [4, 8] [1, 3] [7, 6] [2, 5] [4, 8] [1, 3] [6, 7]


™¯‹Ì· 2.2
Παράδειγµα
λειτουργίας
της merge sort. [5] [2] [4] [8] [1] [3] [7] [6] [5] [2] [4] [8] [1] [3] [7] [6]

Έστω Τ(n) ο χρόνος εκτέλεσης χειρότερης περίπτωσης που χρειάζεται η διαδικασία


merge_sort για τη διάταξη n, n > 1, αριθµών. Ο χρόνος αυτός είναι ίσος µε το άθροι-
σµα του χρόνου 2T(n/2), που χρειάζεται η merge_sort για τη διάταξη δύο υποπινά-
κων n/2 αριθµών, και του χρόνου που χρειάζεται η διαδικασία merge για να συνε-
2.3 ∞¡∞¢ƒ√ªπ∫∂™ ∂•π™ø™∂π™ 49

νώσει τους δύο διατεταγµένους υποπίνακες σε έναν διατεταγµένο πίνακα n στοιχεί-


ων. Αφού ο χρόνος εκτέλεσης χειρότερης περίπτωσης της διαδικασίας merge είναι
Θ(n), έχουµε ότι T(n) = 2T(n/2) + Θ(n). Στην περίπτωση n = 1, η merge_sort χρειά-
ζεται σταθερό χρόνο. ∆ηλαδή T(1) = Θ(1).
Εποµένως, ο χρόνος εκτέλεσης χειρότερης περίπτωσης για τη διαδικασία merge_sort
περιγράφεται από την αναδροµική εξίσωση:

ÏQ (1) αν n = 1,
T (n ) = Ì
Ó2T (n / 2 ) + Q (n ) αν n > 1.
Έχοντας καταλήξει στην αναδροµική εξίσωση που περιγράφει το χρόνο εκτέλεσης,
έχουµε ολοκληρώσει τη σηµαντικότερη φάση του σχεδιασµού και της ανάλυσης του
αλγορίθµου. Αποµένει το µαθηµατικό µέρος της επίλυσης της αναδροµικής εξίσωσης.

¢Ú·ÛÙËÚÈfiÙËÙ· 2.7

Θεωρείστε το πρόβληµα της αναζήτησης ενός αριθµού x σε έναν πίνακα Α[1, …,


n] που περιέχει n αριθµούς διατεταγµένους σε αύξουσα σειρά. Η δυαδική αναζή-
τηση (binary search) είναι µία προσφιλής και αποδοτική µέθοδος για την επίλυση
αυτού του προβλήµατος. Στη δυαδική αναζήτηση συγκρίνουµε το µεσαίο στοιχείο
A[m], m = (n + 1) / 2, του πίνακα µε το ζητούµενο στοιχείο x. Αν Α[m] = x, τότε
έχουµε βρει το ζητούµενο στοιχείο στη θέση m. ∆ιαφορετικά, αν το Α[m] είναι
µικρότερο από το x, εφαρµόζουµε δυαδική αναζήτηση στον υποπίνακα Α[m + 1,
…, n], ενώ αν το A[m] είναι µεγαλύτερο από το x, εφαρµόζουµε δυαδική αναζή-
τηση στον υποπίνακα A[1, …, m – 1]. Γράψτε ψευδοκώδικα για τη διαδικασία δυα-
δικής αναζήτησης. ∆ιατυπώστε την αναδροµική εξίσωση που δίνει το χρόνο εκτέ-
λεσης χειρότερης περίπτωσης για τη δυαδική αναζήτηση.

Αξίζει να σηµειωθεί ότι συχνά κατά τη διατύπωση και την επίλυση αναδροµικών
εξισώσεων θα αγνοούµε συγκεκριµένες τεχνικές λεπτοµέρειες, δίνοντας έµφαση
στην ουσία. Για παράδειγµα, παρατηρείστε ότι στις ∆ραστηριότητες 2.6 και 2.7 έχου-
µε αγνοήσει το γεγονός ότι η συνάρτηση του χρόνου εκτέλεσης T(n) ορίζεται µόνο
για ακέραια n και χρησιµοποιούµε στη διατύπωση των αναδροµικών εξισώσεων το
T(n/2), αν και το n/2 µπορεί να µην είναι ακέραιος. Τυπικά, η εξίσωση που περι-
γράφει το χρόνο εκτέλεσης χειρότερης περίπτωσης για τη merge sort είναι:

ÏÔQ (1) αν n = 1,
T (n ) = Ì
ÔÓT ( În / 2û ) + T ( Èn / 2ù ) + Q (n ) αν n > 1.
50 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √

Μία άλλη τεχνική λεπτοµέρεια που συχνά θα αγνοούµε είναι οι αρχικές συνθήκες
της αναδροµικής εξίσωσης. Ο λόγος είναι ότι, για τις περισσότερες περιπτώσεις, οι
αλγόριθµοι που θα αναλύσουµε έχουν T(n) = Θ(1), για µικρές τιµές του n, και ο
προσδιορισµός συγκεκριµένης σταθεράς για τις αρχικές συνθήκες δεν επηρεάζει την
ασυµπτωτική συµπεριφορά του T(n).

2.3.2 ª¤ıÔ‰Ô˜ Â·Ó¿Ï˄˘

Η βασική ιδέα της µεθόδου της επανάληψης (iteration method) είναι να εκφράσου-
µε την αναδροµική εξίσωση σαν άθροισµα, αναπτύσσοντάς την και, στη συνέχεια,
να υπολογίσουµε τον κλειστό τύπο του αθροίσµατος. Για παράδειγµα, ας θεωρή-
σουµε την παρακάτω αναδροµική εξίσωση, η οποία έχει τη µορφή της εξίσωσης που
περιγράφει το χρόνο εκτέλεσης της merge sort.

Ï2 αν n = 2,
T (n ) = Ì
Ó2T (n / 2 ) + n αν n = 2 k , k > 1.

Η υπόθεση ότι το n πρέπει να είναι δύναµη 2 γίνεται για να αποφύγουµε την περίπτωση
που το n/2 δεν είναι ακέραιος. Αναπτύσσοντας την αναδροµική εξίσωση έχουµε:

T (n ) = n + 2T (n / 2 )
2n
=n+ + 22 T ( n / 4 )
2
2n 22 n
=n+ + + 2 4 T (n / 8 )
2 4
M
2n 22 n 2i -1 n
=n+ + + L + i -1 + 2i T (n / 2i )
2 4 2
= ni + 2 T (n / 2 )
i i

Θέτοντας i = (log n – 1) στην παραπάνω ισότητα, παρατηρούµε ότι η ανάπτυξη της


αναδροµής τερµατίζεται, αφού n / 2(log n – 1) = 2. Εποµένως, T(n) = n log n .
Η ιδέα της µεθόδου της επανάληψης είναι απλή, αλλά η εφαρµογή της συχνά οδη-
γεί σε πολύπλοκους αλγεβρικούς υπολογισµούς. ∆ύο είναι οι σηµαντικότερες παρά-
µετροι κατά την εφαρµογή της µεθόδου: ο αριθµός των επαναλήψεων / αναπτύξεων
της αναδροµής µέχρι να φτάσουµε στην αρχική συνθήκη, και το υπολογισµός του
αθροίσµατος των όρων που προκύπτουν από κάθε επίπεδο ανάπτυξης της αναδρο-
µής. Η εφαρµογή της µεθόδου της επανάληψης όταν η αναδροµική εξίσωση ορίζε-
ται µε πάνω ή κάτω ακέραια µέρη κλασµάτων µπορεί να οδηγήσει σε πολύπλοκες
2.3 ∞¡∞¢ƒ√ªπ∫∂™ ∂•π™ø™∂π™ 51

αλγεβρικές εκφράσεις. Σε αυτή την περίπτωση είναι ιδιαίτερα χρήσιµη η υπόθεση


ότι το n έχει τέτοια µορφή ώστε το κλάσµα να δίνει πάντα ακέραιο αποτέλεσµα (π.χ.
στην εξίσωση T(n) = 2T(n/2) + n, υποθέσαµε ότι σε κάθε βήµα το n είναι δύναµη
του 2, ώστε το n/2 να είναι ακέραιος).

Μία απλή και χρήσιµη µέθοδος για την αναπαράσταση της ανάπτυξης µιας ανα-
δροµικής εξίσωσης είναι το δέντρο της αναδροµής (recursion tree). Το δέντρο της
αναδροµής επιτρέπει την καλύτερη οργάνωση των αλγεβρικών υπολογισµών κατά
την ανάπτυξη της αναδροµικής εξίσωσης. Έστω η αναδροµική εξίσωση T(n) =
2T(n/2) + n2. Το δέντρο της αναδροµής για αυτή την εξίσωση φαίνεται στο Σχήµα
2.3. Παρατηρούµε ότι η συνεισφορά κάθε γραµµής του δέντρου σε ύψος i (η ρίζα
θεωρείται ότι βρίσκεται σε ύψος 0) είναι n2/ 2i. Αφού σε κάθε επίπεδο το n υποδι-
πλασιάζεται, το ύψος του δέντρου είναι log n (δηλαδή το δέντρο έχει log n + 1 επί-

Â
log n 1
πεδα). Επειδή < 2 σαν άθροισµα όρων γεωµετρικής προόδου µε λόγο 1/2,
i =0 2i
είναι T(n) = Θ(n2).

n2 n2

(n/2)2 (n/2)2 n2/2


log n
+

(n/4)2 (n/4)2 (n/4)2 (n/4)2 n2/4


™¯‹Ì· 2.3
+
Το δέντρο
...

...

της αναδροµής για


την εξίσωση
Σύνολο: Θ(n2) T(n) = 2T(n/2) + n2.

¢Ú·ÛÙËÚÈfiÙËÙ· 2.8

Με χρήση του δέντρου της αναδροµής, δώστε µια ακριβή ασυµπτωτική εκτίµηση
της λύσης της αναδροµικής εξίσωσης

T (n ) = 4T ( În / 2û ) + n
52 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 2.5

Λύστε την παρακάτω αναδροµική εξίσωση χρησιµοποιώντας τη µέθοδο της επα-


νάληψης.

Ï1 αν n = 1,
T (n ) = Ì
ÓT (n / 2 ) + 1 αν n = 2 k , k ≥ 1 .

2.3.3 ª¤ıÔ‰Ô˜ ·ÓÙÈηٿÛÙ·Û˘

Η βασική ιδέα της µεθόδου της αντικατάστασης (substitution method) είναι να µαντέ-
ψουµε τη µορφή της λύσης και να χρησιµοποιήσουµε µαθηµατική επαγωγή για να
υπολογίσουµε µε ακρίβεια τις σταθερές, όταν αυτό απαιτείται, και να αποδείξουµε
ότι η λύση είναι σωστή. Η µέθοδος είναι ισχυρή και απλή, αλλά µπορεί να εφαρµο-
στεί µόνο στις περιπτώσεις που µπορούµε να µαντέψουµε τη µορφή της λύσης. Επι-
πλέον, η µέθοδος της αντικατάστασης µπορεί να εφαρµοστεί για την απόδειξη ασυ-
µπτωτικών εκτιµήσεων σχετικά µε τη λύση µιας αναδροµικής εξίσωσης.
Σε περιπτώσεις που δεν φαίνεται εύκολο να µαντέψουµε τη µορφή της λύσης, µπο-
ρούµε να εφαρµόσουµε τη µέθοδο της επανάληψης, υπολογίζοντας απλώς κάποια
φράγµατα στο άθροισµα που προκύπτει. Στη συνέχεια, µπορούµε να χρησιµοποιή-
σουµε αυτά τα φράγµατα για την εφαρµογή της µεθόδου της αντικατάστασης.
Για παράδειγµα, ας θεωρήσουµε την αναδροµική εξίσωση T(n) = 2T(n/2) + Θ(n),
που δίνει το χρόνο εκτέλεσης χειρότερης περίπτωσης για τη merge sort. Έχουµε δει
ότι η εξίσωση

Ï2 αν n = 2,
T ' (n ) = Ì
Ó2T ' (n / 2 ) + n αν n = 2 k , k > 1 ,

η οποία είναι απολύτως παρόµοια µε αυτή της merge sort, έχει λύση T¢ (n) = n log
n. Θα χρησιµοποιήσουµε τη µέθοδο της αντικατάστασης για να αποδείξουµε ότι Τ(n)
= Θ(n log n). Όσον αφορά στις αρχικές συνθήκες, αν και 1 log 1 = 0, εντούτοις, για
µικρές τιµές του n που ξεπερνούν τη µονάδα, π.χ. n = 2, 3, 4, κοκ., είναι T(n) = Θ(1).
Υποθέτουµε ότι T(n/2) = Θ(n/2 log(n/2)), όπου οι σταθερές c1, c2, που κρύβει ο συµ-
βολισµός Θ είναι ίδιες µε αυτές που κρύβει το Θ(n) στον ορισµό της εξίσωσης. Αντι-
καθιστώντας αυτή την υπόθεση στην αναδροµική εξίσωση, έχουµε
2.3 ∞¡∞¢ƒ√ªπ∫∂™ ∂•π™ø™∂π™ 53

Ê n nˆ Ê n nˆ
T (n ) £ 2Á c2 log ˜ + c2 n T (n ) ≥ 2Á c1 log ˜ + c1n
Ë 2 2¯ Ë 2 2¯
και
£ c2 n(log n - 1) + c2 n ≥ c1n(log n - 1) + c1n
= c2 n log n , = c1n log n .

Εποµένως, για κάθε n > 1, υπάρχουν θετικές σταθερές c1, c2, τέτοιες, ώστε c1 n log
n £ T(n) £ c2 n log n. Συνεπώς, ο χρόνος εκτέλεσης χειρότερης περίπτωσης της merge
sort είναι Θ(n log n).

¢Ú·ÛÙËÚÈfiÙËÙ· 2.9

Αποδείξτε ότι ο χρόνος εκτέλεσης χειρότερης περίπτωσης της δυαδικής αναζήτη-


σης είναι Θ(log n).

Κατά την εφαρµογή της µεθόδου της αντικατάστασης, είναι δυνατόν να µαντέψου-
µε σωστά ένα ασυµπτωτικό φράγµα για τη λύση της αναδροµικής εξίσωσης, αλλά
το ζητούµενο να µην προκύπτει από την επαγωγή. Το πρόβληµα, συνήθως, είναι ότι
η επαγωγική υπόθεση δεν είναι αρκετά ισχυρή ώστε να αποδειχθεί το συγκεκριµέ-
νο φράγµα. Σε τέτοιες περιπτώσεις, η αφαίρεση ενός όρου µικρότερης τάξης, συνή-
θως, επιτρέπει την απόδειξη του φράγµατος. Για παράδειγµα, θεωρούµε την ανα-
δροµική εξίσωση:

T (n ) = T ( În / 2û + T ( Èn / 2ù ) + 1

Μαντεύουµε ότι η λύση της εξίσωσης είναι Ο(n) και προσπαθούµε να δείξουµε ότι
T(n) £ c n, για µια κατάλληλα επιλεγµένη σταθερά c. Εφαρµόζοντας τη µέθοδο της
αντικατάστασης, έχουµε T(n) £ c n + 1, από το οποίο δεν συνάγεται ότι T(n) £ c n,
για καµία επιλογή σταθεράς c. Αντίθετα, αν δοκιµάσουµε να αποδείξουµε µε επα-
γωγή ότι T(n) £ c n – b, όπου b µια σταθερά όχι µικρότερη της µονάδας, έχουµε

T (n ) £ ( c În / 2û - b ) + ( c Èn / 2ù - b ) + 1
£ cn - 2 b + 1 £ cn - b .
Όπως συνήθως, η σταθερά c πρέπει να επιλεγεί αρκετά µεγάλη, ώστε να πληρούνται
οι αρχικές συνθήκες.
54 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 2.6

Συµπληρώστε τον πίνακα µε ακριβείς ασυµπτωτικές εκτιµήσεις για τις λύσεις των
αναδροµικών εξισώσεων. Για όλες τις εξισώσεις, θεωρείστε σαν αρχική συνθήκη
T(Θ(1)) = Θ(1).
Αναδροµική Εξίσωση Λύση
1. T(n) = T(n – 1) + 3
2. T(n) = T(n – 1) + 2n
3. T(n) = 2T(n / 2) + n
4. T(n) = 2T(n / 3) + 1
5. T(n) = T(n / 2) + n

2.3.4 £ÂÒÚËÌ· ΢ÚÈ·Ú¯›·˜

Το Θεώρηµα της Κυριαρχίας (Master Theorem) αποτελεί µια εύκολη συνταγή για
την επίλυση αναδροµικών εξισώσεων της µορφής T(n) – aT(n\b) + f(n) όπου α ≥ 1
και b > 1 είναι σταθερές, και f(n) είναι µία ασυµπτωτικά θετική συνάρτηση.
Το Θεώρηµα της Κυριαρχίας εφαρµόζεται για αλγορίθµους που διαιρούν το πρόβληµα
σε α επιµέρους προβλήµατα, καθένα µεγέθους n / b, τα οποία λύνονται αναδροµικά,
και το συνολικό κόστος για τη διαίρεση και το συνδυασµό των επιµέρους λύσεων
είναι f(n). Για παράδειγµα, στην περίπτωση της merge sort a = 2, b = 2, και f(n) =
Θ(n), ενώ στην περίπτωση της δυαδικής αναζήτησης a =1, b = 2, και f(n) = Θ(1).
Το Θεώρηµα της Κυριαρχίας διακρίνει τις ακόλουθες τρεις περιπτώσεις:

( ) ( )
1. Αν f(n) = O nlog b a - e , για κάποια σταθερά ε > 0, τότε T(n) = Q nlog b a .

2. Αν f(n) = Q (n ) , τότε T(n) = Q (n log n) .


log b a log b a

3. Αν f(n) = W (n ) , για κάποια σταθερά ε > 0, και αν υπάρχει σταθερά n ,


log b a + e
0

τέτοια ώστε, για κάθε n ≥ n0, af(n/b) £ cf(n), για κάποια σταθερά c < 1, τότε
T(n) = Θ(f(n)).

Κατά την εφαρµογή του Θεωρήµατος της Κυριαρχίας, η µεγαλύτερη από τις συναρ-
τήσεις f(n) και nlog b a καθορίζει τη λύση της εξίσωσης. Στην πρώτη περίπτωση, δεν
2.3 ∞¡∞¢ƒ√ªπ∫∂™ ∂•π™ø™∂π™ 55

αρκεί η f(n) να είναι µικρότερη από την nlog b a , πρέπει να είναι πολυωνυµικά µικρό-
τερη (δηλαδή µικρότερη κατά ένα παράγοντα nε, για κάποια σταθερά ε > 0). Στη δεύ-
τερη περίπτωση, όπου οι συναρτήσεις f(n) και nlog b a είναι ίσες, πολλαπλασιάζουµε

( )
µε ένα λογαριθµικό παράγοντα και έχουµε T (n ) = Q nlog b a log n .

Στην τρίτη περίπτωση, η f(n) πρέπει να είναι πολυωνυµικά µεγαλύτερη από την
nlog b a και να ικανοποιεί τη συνθήκη af(n/b) £ cf(n), η οποία ικανοποιείται από τις
περισσότερες συναρτήσεις που θα συναντήσουµε. Παρόλα αυτά, είναι δυνατόν η
f(n) να µην µπορεί να ενταχθεί σε καµία από τις παραπάνω περιπτώσεις και το θεώ-
ρηµα να µην µπορεί να εφαρµοστεί.
Σαν ένα πρώτο παράδειγµα, θεωρούµε την εξίσωση T(n) = 9T(n/3) + n. Είναι
nlog 3 9 = n2 και f(n) = n. Εποµένως, εφαρµόζοντας την πρώτη περίπτωση του Θεω-
ρήµατος της Κυριαρχίας, καταλήγουµε στο συµπέρασµα ότι T(n) = Θ(n2).

Σαν ένα δεύτερο παράδειγµα, θεωρούµε την εξίσωση T(n) = T(2n/3) + 1. Σε αυτή
την περίπτωση, έχουµε f (n ) = Q (1) = nlog 3/ 2 1 = n0 . Εποµένως, εφαρµόζεται η δεύ-
τερη περίπτωση του θεωρήµατος, και T(n) = Θ(log n).

Για την αναδροµική εξίσωση T(n) = 3T(n/4) + nlog n. εφαρµόζεται η τρίτη περί-
πτωση, αφού f(n) = n log n, nlog 4 3 = O (n0,793 ) , και η συνθήκη 3 f(n/4) = 3 (n/4)
log(n/4) £ 3/4 n log n £ 3/4 f(n) ισχύει για αρκετά µεγάλες τιµές του n. Εποµένως,
T(n) = Θ(n log n).

Σαν ένα τελευταίο παράδειγµα, θεωρούµε την εξίσωση T(n) = 2T(n/2) + nlog n.
Παρατηρήστε ότι δεν µπορούµε να εφαρµόσουµε το Θεώρηµα της Κυριαρχίας για
αυτή την εξίσωση, γιατί η ποσότητα nlog 2 2 = n είναι µικρότερη από το f(n) = n log
n, αλλά όχι πολυωνυµικά µικρότερη. Εποµένως, αυτή η αναδροµική εξίσωση δεν
µπορεί να ενταχθεί ούτε στην περίπτωση 2, ούτε στην περίπτωση 3.

¢Ú·ÛÙËÚÈfiÙËÙ· 2.10

∆ώστε µια ακριβή ασυµπτωτική εκτίµηση για τη λύση της αναδροµικής εξίσωσης
T(n) = 2T(n/2) + nlog n
56 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 2.7

∆ώστε ακριβείς ασυµπτωτικές εκτιµήσεις για τις αναδροµικές εξισώσεις.


1. T(n) = 6T(n/5) + nlog6 n
2. T(n) = 5T(n/6) + n
3. T (n ) = 3T (n / 9 ) + n
4. T(n) = T(n – 1) + n2
5. T(n) = T(n/5) + T(7n/10) + 3n
6. T(n) = T(5n/9) + T(4n/9) + n

™‡ÓÔ„Ë
Αρχικά ορίστηκε ο συµβολισµός Θ, που παρέχει µια ακριβή ασυµπτωτική εκτίµηση
για την τάξη µεγέθους µιας συνάρτησης, ο συµβολισµός Ο, που παρέχει ένα ασυ-
µπτωτικό άνω φράγµα, και ο συµβολισµός Ω, που παρέχει ένα ασυµπτωτικό κάτω
φράγµα. Οι συµβολισµοί ο και ω χρησιµοποιούνται για να δηλώσουν ασυµπτωτικά
άνω και κάτω φράγµατα τα οποία δεν είναι ακριβή.
Ο υπολογισµός αθροισµάτων ανακύπτει, πολλές φορές, κατά την ανάλυση αλγορίθ-
µων των οποίων η λειτουργία βασίζεται σε βρόγχους επανάληψης. Η µαθηµατική
επαγωγή είναι ένα ισχυρό εργαλείο για τον υπολογισµό αθροισµάτων, όταν υπάρχει
µια εκτίµηση για τη µορφή του κλειστού τύπου. Τέτοιες εκτιµήσεις µπορούν να προ-
κύψουν από τον υπολογισµό άνω και κάτω φραγµάτων στις τιµές του αθροίσµατος.
Ο χρόνος εκτέλεσης των αναδροµικών αλγορίθµων περιγράφεται από αναδροµικές
εξισώσεις. Η µέθοδος της επανάληψης, αναπτύσσοντας την αναδροµή, ανάγει την
επίλυση µιας εξίσωσης στον υπολογισµό ενός αθροίσµατος. Το δέντρο της αναδρο-
µής αναπαριστά την ανάπτυξη της αναδροµής, και συχνά διευκολύνει σηµαντικά στον
υπολογισµό του αθροίσµατος. Στις περιπτώσεις που το άθροισµα είναι δύσκολο να
υπολογιστεί και γνωρίζουµε τη µορφή της λύσης, µπορεί να χρησιµοποιηθεί η µέθο-
δος της αντικατάστασης, η οποία επιβεβαιώνει τη λύση της εξίσωσης επαγωγικά. Το
Θεώρηµα της Κυριαρχίας αποτελεί µία ισχυρή και εύκολη στην εφαρµογή συνταγή
για την επίλυση αναδροµικών εξισώσεων συγκεκριµένης µορφής.
B I B § I O ° PA º I A 57

µÈ‚ÏÈÔÁÚ·Ê›·

Όλα τα βιβλία που αναφέρθηκαν στην αντίστοιχη παράγραφο του προηγούµενου


κεφαλαίου καλύπτουν το υλικό αυτού του κεφαλαίου παρουσιάζοντας το µαθηµατι-
κό υπόβαθρο που απαιτείται για την ανάλυση απλών συνδυαστικών αλγόριθµων. Για
περαιτέρω ανάγνωση, προτείνεται το παρακάτω βιβλίο:
[1] C.L. Liu. Introduction to Combinatorial Mathematics. McGraw – Hill, 1968. Αν
και παλιό, διαπραγµατεύεται µε εξαιρετικό τρόπο όλες τις θεµελιώδεις έννοιες
και τεχνικές των ∆ιακριτών Μαθηµατικών, επικεντρώνει στην ουσία, και έχει
πολύ καλή συλλογή από λυµένα παραδείγµατα και ασκήσεις.
¢È·›ÚÂÈ Î·È µ·Û›Ï¢Â

™ÎÔfi˜
∫ ∂

3
º

Σκοπός αυτού του κεφαλαίου είναι η αναλυτική παρουσίαση της µεθόδου σχεδιασµού
αλγορίθµων «διαίρει και βασίλευε». Η παρουσίαση της µεθόδου γίνεται µέσα από
παραδείγµατα αλγορίθµων που επιλύουν προβλήµατα προερχόµενα από διαφορετι-
κά πεδία, ώστε να τονισθεί η σηµασία, η αποτελεσµατικότητα και το ευρύ φάσµα
εφαρµογών της µεθόδου.
∞ § ∞ π √

¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·
Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση:
• Να εφαρµόζει τη µέθοδο «διαίρει και βασίλευε» για την επίλυση προβληµάτων
ενδιάµεσου βαθµού δυσκολίας.
• Να εφαρµόζει, να συνθέτει ή να τροποποιεί γνωστούς αλγορίθµους για την επίλυ-
ση άλλων απλών προβληµάτων.
• Να υπολογίζει κάτω φράγµατα στο χρόνο εκτέλεσης χειρότερης περίπτωσης αλγο-
ρίθµων που επιλύουν απλά προβλήµατα.

ŒÓÓÔȘ ÎÏÂȉȿ
• µέθοδος «διαίρει και βασίλευε» αλγόριθµος

• δέντρο συγκρίσεων • αναπαράσταση πολυωνύµων µε συντε-


λεστές και µε ζεύγη σηµείων – τιµών
• πρόβληµα της επιλογής
• διακριτός µετασχηµατισµός Fourier
• ντετερµινιστικός και πιθανοτικός και FFT

∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Στο προηγούµενο κεφάλαιο, είδαµε µερικά παραδείγµατα αναδροµικών αλγορίθµων,
των οποίων η λειτουργία βασίζεται στη µέθοδο «διαίρει και βασίλευε» (divide and
conquer). Η ιδέα του «διαίρει και βασίλευε» παρέχει µια απλή και ισχυρή τεχνική
σχεδιασµού αλγορίθµων, η οποία βρίσκει εφαρµογή σε πληθώρα προβληµάτων από
διαφορετικά πεδία (π.χ. προβλήµατα διάταξης, πολλαπλασιασµού πινάκων, πολλα-
πλασιασµού πολυωνύµων, µετασχηµατισµός Fourier).
60 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂

Η µέθοδος του «διαίρει και βασίλευε» συνίσταται στη διάσπαση του στιγµιότυπου
εισόδου σε µικρότερα, επιµέρους στιγµιότυπα του ίδιου προβλήµατος, στην επίλυση
των επιµέρους στιγµιότυπων και στον υπολογισµό µιας λύσης για το αρχικό στιγµιό-
τυπο εισόδου από τις λύσεις των επιµέρους στιγµιότυπων. Η επίλυση των επιµέρους
στιγµιότυπων, συνήθως, γίνεται µε επίκληση του ίδιου αλγορίθµου. Σε αυτές τις περι-
πτώσεις, το αποτέλεσµα της µεθόδου «διαίρει και βασίλευε» είναι ένας αναδροµικός
αλγόριθµος. Μερικές φορές, όταν το µέγεθος των επιµέρους στιγµιότυπων γίνει αρκε-
τά µικρό, είναι προτιµότερη η εφαρµογή κάποιου άλλου, µη αναδροµικού αλγορίθ-
µου, για την επίλυση των επιµέρους στιγµιότυπων.
Η µέθοδος «διαίρει και βασίλευε» βρίσκει εφαρµογή σε όσα προβλήµατα η λύση ενός
αρχικού στιγµιότυπου εισόδου µπορεί να συντεθεί από τις λύσεις επιµέρους στιγµιό-
τυπων, που έχουν προέλθει από τη διάσπαση του αρχικού. Για παράδειγµα, στον αλγό-
ριθµο διάταξης merge sort, κατασκευάζουµε τη διατεταγµένη ακολουθία εξόδου από
τις δύο διατεταγµένες, επιµέρους ακολουθίες, που έχουν προέλθει από τη διαίρεση
της (µη διατεταγµένης) ακολουθίας εισόδου. Η διάταξη των επιµέρους ακολουθιών
γίνεται µε την αναδροµική εφαρµογή του αλγορίθµου merge sort.
Εκτός από την απλότητα στη σύλληψη και την εφαρµογή, ένα σηµαντικό πλεονέκτη-
µα της µεθόδου «διαίρει και βασίλευε» είναι ότι οδηγεί σε αλγορίθµους που είναι εύκο-
λο να αναλυθούν. Η ανάλυση ενός αλγορίθµου που βασίζεται στη µέθοδο «διαίρει και
βασίλευε» συνίσταται στη διατύπωση και την επίλυση της αναδροµικής εξίσωσης που
διέπει τη λειτουργία του αλγορίθµου. Η αναδροµική εξίσωση, συνήθως, προκύπτει
απευθείας από την ιδέα στην οποία βασίζεται ο αλγόριθµος. Επιπλέον, είναι γνωστά
πολλά ισχυρά µαθηµατικά εργαλεία για την επίλυση αναδροµικών εξισώσεων.
Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες:
3.1. Quicksort
3.2. Το πρόβληµα της επιλογής
3.3. Πολλαπλασιασµός αριθµών και πινάκων
3.4. Πολυώνυµα και FFT
3.1 QUICKSORT 61

3.1 Quicksort

Έχουµε ήδη παρουσιάσει µια εφαρµογή της µεθόδου «διαίρει και βασίλευε» στο
πρόβληµα της διάταξης n αριθµών (αλγόριθµος merge sort). Μάλιστα, δείξαµε ότι
ο χρόνος εκτέλεσης χειρότερης περίπτωσης του αλγορίθµου merge sort είναι Θ(n
log n). Όπως θα δούµε στη συνέχεια, δεν µπορεί να υπάρξει αλγόριθµος διάταξης
µε χρόνο εκτέλεσης χειρότερης περίπτωσης καλύτερο του Θ(n log n), οπότε ο αλγό-
ριθµος merge sort έχει τον καλύτερο δυνατό χρόνο εκτέλεσης (ασυµπτωτικά).
Σε αυτή την ενότητα, θα παρουσιάσουµε τον αλγόριθµο quicksort, ο οποίος ανακα-
λύφθηκε από τον C.A.R. Hoare το 1962 και, επίσης, βασίζεται στη µέθοδο του «διαί-
ρει και βασίλευε». Αν και ο χρόνος εκτέλεσης χειρότερης περίπτωσης του quicksort
είναι Θ(n2), στην πράξη αποδεικνύεται πολύ γρήγορος, ενώ έχει χρόνο εκτέλεσης
µέσης περίπτωσης O(n log n).
Όπως κάθε αλγόριθµος που βασίζεται στη µέθοδο «διαίρει και βασίλευε», ο αλγό-
ριθµος quicksort διατάσσει έναν πίνακα αριθµών Α[p, …, r] σε τρία βήµατα.
• ∆ιαίρεση. Ο πίνακας A[p, …, r] αναδιατάσσεται και διαιρείται σε δύο υποπίνα-
κες A[p, …, q] και Α[q + 1, …, r], έτσι ώστε κάθε στοιχείο του υποπίνακα A[p,
…, q] να είναι µικρότερο ή ίσο από κάθε στοιχείο του υποπίνακα A[q + 1, …, r].
Ο υπολογισµός του δείκτη q είναι µέρος της διαδικασίας διαίρεσης.
• Επίλυση επιµέρους στιγµιότυπων. Οι υποπίνακες A[p, …, q] και A[q + 1, …, r]
διατάσσονται µε αναδροµικές κλήσεις του αλγορίθµου quicksort.
• Σύνθεση λύσεων επιµέρους στιγµιότυπων. Αφού κάθε στοιχείο του υποπίνακα
A[p, …, q] είναι µικρότερο ή ίσο από κάθε στοιχείο του υποπίνακα A[q + 1, …,
r], και οι A[p, …, q] και Α[q + 1, …, r] είναι διατεταγµένοι, ο πίνακας A[p, …, r]
είναι επίσης διατεταγµένος.
Ο παρακάτω ψευδοκώδικας υλοποιεί τον αλγόριθµο quicksort. Για την διάταξη ενός
πίνακα n αριθµών A[1, …, n], καλούµε quicksort(A, 1, n).
quicksort(A, p, r)
if p < r then
q ¨ partition(A, p, r);
quicksort(A, p, q);
quicksort(A, q + 1, r);
Το σηµείο κλειδί στη λειτουργία του αλγορίθµου quicksort είναι η διαδικασία
partition, η οποία πραγµατοποιεί την αναδιάταξη και τη διαίρεση του πίνακα Α[p,
…, r].
62 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂

partition(A, p, r)
x ¨ A[p]; i ¨ p – 1; j ¨ r + 1;
while TRUE do
repeat j ¨ j – 1
until A[j] £ x;
repeat i ¨ i + 1
until A[i] ≥ x;
if i < j then swap(A[i], A[j])
{∏ swap ·ÓÙÈÌÂÙ·ı¤ÙÂÈ Ù· ÛÙÔȯ›· A[i] Î·È A[j]}
else return j;
Η διαδικασία partition οργανώνει τη διαίρεση του πίνακα A[p, …, r] γύρω από το
στοιχείο x = A[p]. Η partition συνεχώς αναπτύσσει τις περιοχές A[p, …, i] και Α[j,
…, r], ξεκινώντας από το αριστερό και το δεξιό άκρο του Α, αντίστοιχα, ώστε κάθε
στοιχείο της περιοχής A[p, …, i] να είναι µικρότερο του x, και κάθε στοιχείο της
περιοχής A[j, …, r] να είναι µεγαλύτερο του x. Αρχικά, είναι i = p – 1 και j = r + 1,
εποµένως, οι περιοχές δεν περιέχουν στοιχεία. Ο πρώτος repeat – βρόγχος εντοπίζει
το πρώτο προς τα αριστερά στοιχείο που εµποδίζει την ανάπτυξη της περιοχής A[j,
…, r], δηλαδή την πρώτη θέση j για την οποία ισχύει A[j] £ x. Ο δεύτερος repeat –
βρόγχος εντοπίζει το πρώτο προς τα δεξιά στοιχείο που εµποδίζει την ανάπτυξη της
περιοχής A[p, …, i], δηλαδή την πρώτη θέση i για την οποία ισχύει A[i] ≥ x.
Εφόσον οι δύο περιοχές δεν επικαλύπτονται, το στοιχείο A[i] είναι πολύ µεγάλο για να
ανήκει στην περιοχή του αριστερού άκρου, και το στοιχείο A[j] είναι πολύ µικρό για
να ανήκει στην περιοχή του δεξιού άκρου. Έτσι, τα στοιχεία A[i] και A[j] αλλάζουν
αµοιβαία θέσεις και συνεχίζεται η ανάπτυξη των δύο περιοχών. Όταν για πρώτη φορά
οι περιοχές A[p, …, i] και A[j, …, r] επικαλυφθούν, δηλαδή γίνει i ≥ j, η διαδικασία
της διαίρεσης ολοκληρώνεται, και σαν όριο των δύο υποπινάκων ορίζεται η θέση j.

¢Ú·ÛÙËÚÈfiÙËÙ· 3.1

∆ώστε µια αναπαράσταση της λειτουργίας της διαδικασίας partition για τον πίνα-
κα Α = [5, 3, 2, 6, 4, 1, 3, 7]. Επαναλάβετε για τον πίνακα B = [13, 19, 9, 5, 12, 8,
7, 4, 11, 2, 6, 21].
3.1 QUICKSORT 63

¢Ú·ÛÙËÚÈfiÙËÙ· 3.2

∆είξτε ότι ο χρόνος εκτέλεσης της διαδικασίας partition είναι Θ(n), όπου n = r – p
+ 1 είναι ο αριθµός των στοιχείων που συµµετέχουν στη διαίρεση.

Ο χρόνος εκτέλεσης Τ(n) που χρειάζεται η quicksort για να διατάξει έναν πίνακα n
στοιχείων είναι ίσος µε το άθροισµα του Θ(n), για την εκτέλεση της partition, και
των χρόνων εκτέλεσης των δύο αναδροµικών κλήσεων για τη διάταξη των δύο υπο-
πινάκων. Οι χρόνοι εκτέλεσης των αναδροµικών κλήσεων εξαρτώνται από τη θέση
της διαίρεσης q, που καθορίζει το µέγεθος των δύο υποπινάκων. Εποµένως, T(n) =
T(q) + T(n – q) + Θ(n), και µπορούµε πάντα να θεωρούµε ότι T(1) = Θ(1).
∆ιαισθητικά, το µέγεθος του µεγαλύτερου από τα επιµέρους στιγµιότυπα που προ-
κύπτουν από τη διαδικασία της διαίρεσης αποτελεί µέτρο για την πρόοδο ενός αλγό-
ριθµου «διαίρει και βασίλευε». Για την quicksort συγκεκριµένα, αν ο µεγαλύτερος
από τους δύο υποπίνακες έχει µέγεθος σχεδόν ίσο µε αυτό του αρχικού πίνακα, αφε-
νός ο αλγόριθµος ανάλωσε χρόνο Θ(n) για να πραγµατοποιηθεί η διαίρεση και, αφε-
τέρου, το µεγαλύτερο επιµέρους στιγµιότυπο είναι σχεδόν το ίδιο δύσκολο να λυθεί
όσο το αρχικό στιγµιότυπο. Αντίθετα, αν ο µεγαλύτερος από τους δύο υποπίνακες
είναι σηµαντικά µικρότερος από τον αρχικό πίνακα, και τα επιµέρους στιγµιότυπα
θα είναι σηµαντικά ευκολότερο να επιλυθούν. Εποµένως, στην τελευταία περίπτω-
ση, η εφαρµογή της διαίρεσης µοιάζει να άξιζε τον κόπο.
Με βάση τις παραπάνω παρατηρήσεις, η χειρότερη περίπτωση για την quicksort συµ-
βαίνει όταν, σε κάθε βήµα, η διαδικασία partition παράγει έναν υποπίνακα µεγέθους
n – 1 και έναν υποπίνακα µεγέθους 1. Σε αυτή την περίπτωση, η αναδροµική εξίσω-
ση που περιγράφει το χρόνο εκτέλεσης γίνεται T(n) = T(n – 1) + Θ(n). Η λύση αυτής
της εξίσωσης (βλ. Άσκηση Αυτοαξιολόγησης 2.6, περίπτωση 2) είναι T(n) = Θ(n2).
Αντίθετα, η καλύτερη περίπτωση συµβαίνει όταν, σε κάθε της εφαρµογή, η διαδι-
κασία partition παράγει δύο υποπίνακες µεγέθους n/2. Τότε, ο χρόνος εκτέλεσης της
quicksort δίνεται από την αναδροµική εξίσωση T(n) = 2T(n/2) + Θ(n), η οποία γνω-
ρίζουµε ότι έχει λύση Τ(n) = Θ(n log n). ∆ηλαδή, ο χρόνος εκτέλεσης της quicksort
είναι O(n2) και Ω(n log n).

¢Ú·ÛÙËÚÈfiÙËÙ· 3.3

∆ώστε στιγµιότυπα για τα οποία η quicksort χρειάζεται χρόνο Θ(n log n), και Θ(n2).
64 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂

3.1.1 ÃÚ‹ÛË Ù˘¯·ÈfiÙËÙ·˜ Î·È ·Ó¿Ï˘ÛË Ì¤Û˘ ÙÈÌ‹˜

Είναι εύλογος ο ισχυρισµός ότι, για την ανάλυση της quicksort, είναι πολύ περιορι-
στικό να υποθέσουµε ότι η διαδικασία partition παράγει, σε κάθε βήµα, δύο ισοµε-
γέθεις υποπίνακες. Αντ’ αυτού, ας υποθέσουµε ότι, σε κάθε βήµα, οι δύο υποπίνα-
κες που παράγονται από την partition έχουν την ίδια τάξη µεγέθους Θ(n). Και σε
αυτή την περίπτωση, µπορούµε να αποδείξουµε ότι ο χρόνος εκτέλεσης της quicksort
είναι Τ(n) = Θ(n log n). Ο λόγος είναι ότι, όταν σε κάθε βήµα, οι δύο υποπίνακες
έχουν µέγεθος Θ(n), το ύψος του δέντρου της αναδροµής είναι Θ(log n), ενώ κάθε
επίπεδο του δέντρου συνεισφέρει Θ(n) στο συνολικό χρόνο εκτέλεσης. Το ίδιο επι-
χείρηµα ισχύει και όταν για όλα, εκτός από O(log n) βήµατα, η διαδικασία partition
παράγει υποπίνακες που αµφότεροι έχουν τάξη µεγέθους Θ(n).

¢Ú·ÛÙËÚÈfiÙËÙ· 3.4

Έστω ότι σε κάθε βήµα, η διαδικασία partition παράγει έναν υποπίνακα µεγέθους cn
και έναν υποπίνακα µεγέθους dn, όπου c, d θετικές σταθερές, c + d = 1. Αποδείξτε
ότι, και σε αυτή την περίπτωση, ο χρόνος εκτέλεσης της quicksort είναι Θ(n log n).

Ο λόγος που η quicksort, αν και έχει χρόνο εκτέλεσης χειρότερης περίπτωσης Θ(n2),
είναι πολύ γρήγορη στην πράξη, είναι ότι στις περισσότερες περιπτώσεις η διαδικα-
σία partition παράγει δύο υποπίνακες της ίδιας τάξης µεγέθους.
Για να τεκµηριώσουµε και θεωρητικά την ταχύτητα της quicksort στην πράξη, θα
τροποποιήσουµε τη διαδικασία partition, ώστε να επιλέγει τυχαία το στοιχείο γύρω
από το οποίο οργανώνεται η διαίρεση σε υποπίνακες και θα υπολογίσουµε το χρόνο
εκτέλεσης µέσης περίπτωσης για αυτήν την παραλλαγή της quicksort. Συγκεκριµέ-
να, στον κώδικα της quicksort αντικαθιστούµε την κλήση της διαδικασίας partition
µε κλήση της ακόλουθης παραλλαγής της.
r_partition(A, p, r)
∂¤ÏÂÍ ¤Ó·Ó ·Î¤Ú·ÈÔ i Ù˘¯·›· ÛÙÔ ‰È¿ÛÙËÌ· [p, r), ÒÛÙÂ
οı ÙÈÌ‹ Ó· ¤¯ÂÈ Èı·ÓfiÙËÙ· 1/(r – p) Ó· ÂÈÏÂÁ›.
swap(A[i], A[p]);
return partition(A, p, r);
3.1 QUICKSORT 65

™∏ª∂πø™∏

Οι αλγόριθµοι, όπως η βασική εκδοχή της quicksort, που δεν χρησιµοποιούν τυχαι-
ότητα στις επιλογές τους, ονοµάζονται ντετερµινιστικοί αλγόριθµοι (deterministic
algorithms), ενώ οι αλγόριθµοι, όπως η παραπάνω παραλλαγή της quicksort, που
χρησιµοποιούν τυχαιότητα σε κάποιες από τις επιλογές τους, ονοµάζονται πιθανοτι-
κοί αλγόριθµοι (randomized algorithms). Οι πιθανοτικοί αλγόριθµοι είναι συχνά
ευκολότεροι στο σχεδιασµό και αποτελεσµατικότεροι από τους ντετερµινιστικούς.
Επιπλέον, υπάρχουν προβλήµατα για τα οποία δεν είναι γνωστοί ντετερµινιστικοί
αλγόριθµοι των οποίων η απόδοση να είναι παρόµοια µε αυτή των καλύτερων πιθα-
νοτικών. Από την άλλη πλευρά, η ανάλυση των πιθανοτικών αλγορίθµων είναι συχνά
δυσκολότερη τεχνικά από αυτή των ντετερµινιστικών αλγορίθµων.
Συχνά, οι τυχαίες επιλογές ενός πιθανοτικού αλγόριθµου επηρεάζουν σηµαντικά το
χρόνο εκτέλεσής του, δηµιουργώντας διαφορετικά ενδεχόµενα εκτέλεσης του αλγό-
ριθµου, καθένα από τα οποία έχει διαφορετικό χρόνο εκτέλεσης. Σε αυτές τις περιπτώ-
σεις, προσπαθούµε να προσδιορίσουµε τη µέση τιµή του χρόνου εκτέλεσης του αλγό-
ριθµου που δίνεται από το άθροισµα, για όλα τα διαφορετικά ενδεχόµενα, των γινοµέ-
νων του χρόνου εκτέλεσης για κάθε ενδεχόµενο επί την πιθανότητα να προκύψει αυτό
το ενδεχόµενο (και, εποµένως, ο αλγόριθµος να έχει αυτόν το χρόνο εκτέλεσης).
Επιστρέφοντας στην ανάλυση της πιθανοτικής εκδοχής της quicksort, έστω n = r –
p + 1 ο αριθµός των στοιχείων του πίνακα Α[p, …, r]. Στην νέα έκδοση της partition,
η οποία επιλέγει τυχαία το στοιχείο x γύρω από το οποίο οργανώνεται η διαίρεση σε
υποπίνακες, κάθε στοιχείο Α[i] (p £ i < r) µπορεί να επιλεγεί µε πιθανότητα 1/(n –
1) . Επιπλέον, σε κάθε δυνατό όριο q (q = p, …, r – 1) για τη διαίρεση του πίνακα
Α[p, …, r], αντιστοιχεί ακριβώς ένα στοιχείο A[iq], το οποίο, αν επιλεγεί για να οργα-
νωθεί η διαίρεση γύρω από αυτό, οι υποπίνακες που θα προκύψουν θα είναι A[p, …,
q] και A[q + 1, …, r].
Έστω S(n) ο µέσος χρόνος που χρειάζεται η πιθανοτική εκδοχή της quicksort µε τη
διαδικασία διαίρεσης r_partition για να διατάξει n αριθµούς. Το S(n) είναι ίσο µε το
άθροισµα του Θ(n), για την εκτέλεση της r_partition και των µέσων χρόνων για τη
διάταξη των υποπινάκων που προκύπτουν. Αφού κάθε όριο q, q = p, …, r – 1, προ-
κύπτει µε πιθανότητα 1/(n – 1), έχουµε:
n -1 n -1

Â( ) Â S (i ) .
1 2
S (n ) = Q (n ) + S (i ) + S (n - i ) = Q (n ) +
n -1 i =1
n -1 i =1

Προφανώς, S(n) = Ω(n log n) και S(n) = O(n2), αφού ο µέσος χρόνος εκτέλεσης πρέ-
66 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂

πει να βρίσκεται µεταξύ της καλύτερης και της χειρότερης περίπτωσης. Έστω c > 0
µια σταθερά, ώστε ο χρόνος που χρειάζεται η r_partition για τη διαίρεση ενός πίνα-
κα n στοιχείων να µην ξεπερνά το cn. Χρησιµοποιώντας τη µέθοδο της αντικατά-
στασης, θα δείξουµε ότι, για κάθε n ≥ 1, S(n) £ 8cn log n .
Μπορούµε να υποθέσουµε ότι S(1) = 0 και να επιλέξουµε τη σταθερά c ώστε S(2) £
16c. Πράγµατι, αντικαθιστώντας την υπόθεση S(n) £ 8cn log n στην αναδροµική εξί-
σωση, έχουµε:
n -1

 i log i
16 c
S (n ) £ cn +
n -1 i =1

16 c Ê n(n - 1) log n n(n - 2 ) ˆ


£ cn + Á - ˜
n -1 Ë 2 8 ¯
£ 8 cn log n ,

για κάθε n ≥ 3, όπου στη δεύτερη ανισότητα χρησιµοποιήσαµε το γεγονός ότι


n -1
n(n - 1) log n n(n - 2 )
 i log i £
i =1
2
-
8 .

Για να αποδείξουµε το παραπάνω φράγµα, χρειάζεται να χωρίσουµε το άθροισµα

Â
n -1
i log i σε δύο µέρη.
i =1

n -1 n / 2 -1 n -1

 i log i =  i log i +  i log i


i =1 i =1 i = n/2
n / 2 -1 n -1
£ (log n - 1)  i + log n  i
i =1 i = n/2
n -1 n / 2 -1
= log n Âi - Â i
i =1 i =1

n(n - 1) log n n(n - 2 )


£ - .
2 8

Εποµένως, όταν το στοιχείο γύρω από το οποίο οργανώνεται η διαίρεση επιλέγεται


µε τυχαίο και οµοιόµορφο τρόπο, ο µέσος χρόνος εκτέλεσης της quicksort είναι
Θ(nlog n). Με προσεκτική ανάλυση, µπορεί να αποδειχθεί ότι, για τη διάταξη ενός
πίνακα n στοιχείων, αυτή η εκδοχή της quicksort χρειάζεται κατά µέσον όρο το πολύ
2n ln n + O(n) συγκρίσεις µεταξύ των στοιχείων του πίνακα.
3.1 QUICKSORT 67

Εκτός από την ταχύτητα, ένα άλλο σηµαντικό πλεονέκτηµα της quicksort είναι ότι ο
αριθµός των – επιπλέον του πίνακα Α – θέσεων µνήµης που χρησιµοποιούνται είναι
µικρός και σταθερός, δηλαδή ανεξάρτητος από τον αριθµό n των στοιχείων του πίνακα.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 3.1

Σε πρακτικές εφαρµογές, µπορούµε να βελτιώσουµε το χρόνο εκτέλεσης της


quicksort εκµεταλλευόµενοι την ταχύτητα της insertion sort όταν ο πίνακας εισό-
δου είναι «σχεδόν διατεταγµένος». Ένας τρόπος να συνδυάσουµε την quicksort µε
την insertion sort είναι, όταν η quicksort καλείται µε είσοδο έναν πίνακα µε λιγό-
τερα από k στοιχεία, να επιστρέφει χωρίς να εκτελεί καµία ενέργεια. Μετά την επι-
στροφή της αρχικής κλήσης της quicksort, ολοκληρώνουµε τη διαδικασία διάτα-
ξης, εκτελώντας την insertion sort σε ολόκληρο τον πίνακα. Υποθέστε ότι χρησι-
µοποιείται η πιθανοτική εκδοχή της quicksort, και αποδείξτε ότι ο παραπάνω αλγό-
ριθµος διάταξης έχει χρόνο εκτέλεσης µέσης περίπτωσης O(nk + n log(n/k)). Με
ποια κριτήρια πρέπει να επιλέγεται η παράµετρος k στη θεωρία και την πράξη.

3.1.2 ∂Ï¿¯ÈÛÙÔ˜ ¯ÚfiÓÔ˜ ÂÎÙ¤ÏÂÛ˘ ·ÏÁÔÚ›ıÌˆÓ ‰È¿Ù·Í˘

Θα ολοκληρώσουµε την παρουσίαση αλγορίθµων για το πρόβληµα της διάταξης


ενός πίνακα n αριθµών, παρουσιάζοντας ένα κάτω φράγµα στο χρόνο εκτέλεσης χει-
ρότερης περίπτωσης για κάθε αλγόριθµο που δεν χρησιµοποιεί τυχαιότητα, και η
λειτουργία του βασίζεται σε συγκρίσεις µεταξύ των στοιχείων του πίνακα. Συγκε-
κριµένα, θα δείξουµε ότι για κάθε τέτοιο αλγόριθµο, υπάρχει ένα στιγµιότυπο εισό-
δου, ώστε ο αλγόριθµος να χρειάζεται Ω(n log n) συγκρίσεις. Εποµένως, ο χρόνος
εκτέλεσης χειρότερης περίπτωσης για κάθε τέτοιο αλγόριθµο είναι Ω(n log n).
Κάθε ντετερµινιστικός αλγόριθµος διάταξης που η λειτουργία του βασίζεται σε
συγκρίσεις µπορεί να αναπαρασταθεί µε το δέντρο των συγκρίσεων (comparison
tree) τις οποίες εκτελεί. Στο Σχήµα 3.1 φαίνεται το δέντρο των συγκρίσεων της
insertion sort για 3 αριθµούς.
68 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂

a1£a2

Nαι Όχι

a2£a3 a1£a3

Nαι Όχι Nαι Όχι

™¯‹Ì· 3.1 a1, a2, a3 a1£a3 a2, a1, a3 a2£a3


Το δέντρο
συγκρίσεων Nαι Όχι Nαι Όχι
της insertion sort
για 3 αριθµούς. a1, a3, a2 a3, a1, a2 a2, a3, a1 a3, a2, a1

Το δέντρο των συγκρίσεων για τη διάταξη n αριθµών πρέπει να έχει τουλάχιστον n!


φύλλα / αποτελέσµατα, αφού κάθε διαφορετική αναδιάταξη των αριθµών εισόδου
πρέπει να αποτελεί πιθανό αποτέλεσµα του αλγορίθµου και, εποµένως, ο αλγόριθµος
πρέπει να µπορεί να καταλήξει σε αυτή. Το ύψος του δέντρου των συγκρίσεων, το
οποίο ορίζεται σαν το µακρύτερο µονοπάτι από τη ρίζα σε κάποιο φύλλο, είναι ίσο
µε τον αριθµό των συγκρίσεων που εκτελεί ο αλγόριθµος στη χειρότερη περίπτωση.
Αφού ο αλγόριθµος, ανάλογα µε το αποτέλεσµα µιας σύγκρισης, µπορεί να διαλέ-
ξει το πολύ ανάµεσα σε δύο ενδεχόµενα / µονοπάτια του δέντρου, το δέντρο των
συγκρίσεων είναι ένα δυαδικό δέντρο. Είναι γνωστό ότι κάθε δυαδικό δέντρο µε
ύψος h έχει το πολύ 2h φύλλα. Εποµένως, αν h είναι το ύψος του δέντρου των συγκρί-
σεων, πρέπει να είναι 2h ≥ n!. Λογαριθµώντας αυτή την ανισότητα, έχουµε:

h ≥ log(n!)
n
= Â log i
i =1
n
≥ Â log i
i = n/2
n
≥ Â log(n / 2)
i = n/2

= W (n log n ) .
Εποµένως, για κάθε ντετερµινιστικό αλγόριθµο που η λειτουργία του βασίζεται σε
συγκρίσεις (δηλαδή η λειτουργία του µπορεί να αναπαρασταθεί µε το δέντρο των
3.2 ∆√ ¶ƒ√µ§∏ª∞ ∆∏™ ∂¶π§√°∏™ 69

συγκρίσεων), υπάρχει τουλάχιστον ένα στιγµιότυπο εισόδου για το οποίο ο αλγό-


ριθµος χρειάζεται Ω(n log n) συγκρίσεις. Συνεπώς, ο χρόνος εκτέλεσης χειρότερης
περίπτωσης κάθε τέτοιου αλγορίθµου είναι Ω(n log n).

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 3.2

Θεωρείστε ότι σε ένα πρόβληµα διάταξης τα στοιχεία είναι χωρισµένα σε n/k οµά-
δες που καθεµία περιέχει k στοιχεία. Τα στοιχεία κάθε συγκεκριµένης οµάδας είναι
µεγαλύτερα από αυτά της προηγούµενης και είναι µικρότερα από αυτά της επόµε-
νης. Εποµένως, για να διατάξουµε το σύνολο των στοιχείων, αρκεί να διατάξουµε
τα στοιχεία κάθε οµάδας. Αποδείξτε ένα κάτω φράγµα στον αριθµό των συγκρί-
σεων που χρειάζεται κάθε ντετερµινιστικός αλγόριθµος που βασίζεται σε συγκρί-
σεις και λύνει αυτό το πρόβληµα.

3.2 ∆Ô ¶Úfi‚ÏËÌ· Ù˘ ÂÈÏÔÁ‹˜

Το πρόβληµα της επιλογής (selection) είναι, δεδοµένου ενός συνόλου / πίνακα Α µε


n αριθµούς και ενός ακεραίου k, 1 £ k £ n, να υπολογισθεί το στοιχείου του Α που
έχει σειρά (rank) k. Η σειρά ενός στοιχείου είναι η θέση που αυτό το στοιχείο κατα-
λαµβάνει στον πίνακα Α, όταν τα στοιχεία του διαταχθούν σε αύξουσα σειρά.
Μερικές ειδικές περιπτώσεις του προβλήµατος επιλογής που έχουν ιδιαίτερο ενδια-
φέρον είναι για k = 1, που αντιστοιχεί στην εύρεση του ελάχιστου στοιχείου, για k =
n, που αντιστοιχεί στην εύρεση του µέγιστου στοιχείου και για k = n/2, που αντι-
στοιχεί στην εύρεση του λεγόµενου ενδιάµεσου (median) στοιχείου.
Από τον ορισµό του προβλήµατος της επιλογής προκύπτει ότι µια απλή λύση είναι
να διατάξουµε τον πίνακα Α σε O(n log n) χρόνο και να επιστρέψουµε το k – οστό
στοιχείου του διατεταγµένου πίνακα. Από την άλλη πλευρά, οι ειδικές περιπτώσεις
του µέγιστου και του ελάχιστου στοιχείου µπορούν να επιλυθούν σε γραµµικό χρόνο.
Εποµένως, ανακύπτει το ερώτηµα αν το γενικότερο πρόβληµα της επιλογής µπορεί
επίσης να λυθεί σε χρόνο Ο(n).

¢Ú·ÛÙËÚÈfiÙËÙ· 3.5

∆ώστε έναν αλγόριθµο µε γραµµικό χρόνο εκτέλεσης χειρότερης περίπτωσης για


την εύρεση του ελάχιστου στοιχείου ενός πίνακα Α. Τροποποιείστε αυτόν τον αλγό-
ριθµο ώστε να επιστρέφει το µέγιστο στοιχείο. Υπάρχει αλγόριθµος για αυτά τα
προβλήµατα µε χρόνο εκτέλεσης χειρότερης περίπτωσης o(n);
70 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂

Μια απάντηση σε αυτό το ερώτηµα προκύπτει από την επανεξέταση της λειτουργίας
της quicksort. Αφού κανένα στοιχείο του υποπίνακα Α[p, …, q] δεν είναι µεγαλύτε-
ρο από τα στοιχεία του Α[q + 1, …, r], αν k £ q, το k – οστό στοιχείο του Α[p, …, r]
θα είναι το k – οστό στοιχείο του υποπίνακα Α[p, …, q]. ∆ιαφορετικά, αν k > q, το
k – οστό στοιχείο του Α[p, …, r] θα είναι το (k – (q + 1 – p)) – οστό στοιχείο του
υποπίνακα A[q + 1, …, r]. Αυτή η παρατήρηση µας οδηγεί στον ακόλουθο, πιθανο-
τικό, «διαίρει και βασίλευε» αλγόριθµο για το πρόβληµα της επιλογής.
r_quickselect(A, p, r, k)
if p = r then return A[p];
q ¨ r_partition(A, p, r);
m ¨ q + 1 – p;
if k £ m then
return r_quickselect(A, p, q, k);
else
return r_quickselect(A, q + 1, r, k – m);
Η χειρότερη περίπτωση για αυτό τον αλγόριθµο συµβαίνει όταν, σε κάθε βήµα, το
k – οστό στοιχείο του Α να βρίσκεται στον µεγαλύτερο από τους δύο υποπίνακες, ο
οποίος έχει µέγεθος n – 1 (n = r – p + 1). Σε αυτή την περίπτωση, ο αλγόριθµος χρει-
άζεται χρόνο Θ(n2) για την εύρεση ακόµα και του ελάχιστου ή του µέγιστου στοι-
χείου του Α. Λόγω όµως της πιθανοτικής του φύσης, δεν υπάρχει συγκεκριµένο στιγ-
µιότυπο εισόδου για το οποίο ο αλγόριθµος να επιδεικνύει αυτή τη συµπεριφορά. Η
χειρότερη περίπτωση µπορεί να συµβεί µόνο εξαιτίας συνεχών «άτυχων» επιλογών
του στοιχείου γύρω από το οποίο οργανώνεται η διαίρεση.
Παρόλα αυτά, ο χρόνος εκτέλεσης µέσης περίπτωσης του αλγόριθµου r_quickselect
είναι σηµαντικά µικρότερος. Έστω S(n) ο µέσος χρόνος για να επιλέξει ο
r_quickselect το k – οστό στοιχείο από έναν πίνακα Α µε n στοιχεία. Το S(n) είναι
ίσο µε Θ(n), από την κλήση της r_partition, συν το µέσο χρόνο που χρειάζεται για
την αναδροµική κλήση της r_quickselect. Ο µέσος χρόνος για την αναδροµική κλήση
εξαρτάται τόσο από το σηµείο διαίρεσης q (δηλαδή από το µέγεθος των υποπινά-
κων), όσο και από τον υποπίνακα στον οποίο θα συνεχιστεί η αναζήτηση για το k –
οστό στοιχείο. Χωρίς βλάβη της γενικότητας, θεωρούµε ότι η αναζήτηση συνεχίζε-
ται πάντα στο µεγαλύτερο υποπίνακα. Εποµένως, έχουµε:
3.2 ∆√ ¶ƒ√µ§∏ª∞ ∆∏™ ∂¶π§√°∏™ 71

n -1

 S (max{i, n - i})
1
S (n ) = Q (n ) +
n -1 i =1
n -1

Â
2
£ Q (n ) + S (i ) .
n - 1 i = n/2

Έστω c > 0 µία σταθερά, τέτοια ώστε ο χρόνος για την κλήση της r_partition να είναι
το πολύ cn. Με τη µέθοδο της αντικατάστασης, θα δείξουµε ότι S(n) £ 4cn. Αφού
S(1) = Θ(1), µπορούµε να επιλέγουµε τη σταθερά c, ώστε η ανισότητα να ισχύει για
µικρές τιµές του n, π.χ. S(1) £ 4c, S(2) £ 8c, κλπ. Πράγµατι, αντικαθιστώντας στην
αναδροµική εξίσωση, έχουµε:

n -1

Â
2
S (n ) £ cn + 4 ci
n - 1 i = n/2

8c Ê
n -1 n / 2 -1 ˆ
= cn + Á Â Â
n - 1 Ë i =1
i -
i =1 ¯

8 c Ê n(n - 1) n(n - 2 ) ˆ
= cn + Á - ˜
n -1 Ë 2 8 ¯
8 c n(3n - 2 )
£ cn + ◊
n -1 8
£ cn + 3 cn = 4 cn .
Συνεπώς, ο χρόνος εκτέλεσης µέσης περίπτωσης του αλγορίθµου r_quickselect είναι
γραµµικός.

3.2.1 ¡ÙÂÙÂÚÌÈÓÈÛÙÈ΋ ÂÈÏÔÁ‹ Û ÁÚ·ÌÌÈÎfi ¯ÚfiÓÔ

Σε αυτή την ενότητα, θα περιγράψουµε έναν ντετερµινιστικό αλγόριθµο για το πρό-


βληµα της επιλογής, ο οποίος επίσης βασίζεται στην ιδέα του «διαίρει και βασίλευε»,
και έχει γραµµικό χρόνο εκτέλεσης χειρότερης περίπτωσης. Ο αλγόριθµος
quickselect είναι παρόµοιος µε τον r_quickselect, εκτός από το γεγονός ότι το στοι-
χείο γύρω από το οποίο οργανώνεται η διαίρεση επιλέγεται ντετερµινιστικά. Στον
παρακάτω ψευδοκώδικα για τον αλγόριθµο quickselect, αποµένει να καθοριστεί ο
τρόπος µε τον οποίο επιλέγεται το στοιχείο A[i].
quickselect(A, p, r, k)
if p = r then return A[p];
∂¤ÏÂÍ ¤Ó· ÛÙÔÈ¯Â›Ô A[i] Á‡Úˆ ·fi ÙÔ ÔÔ›Ô ı· ÔÚÁ·Óˆı›
72 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂

Ë ‰È·›ÚÂÛË ÙÔ˘ ∞[p, ..., r].


swap(A[p], A[i]);
q ¨ partition(A, p, r);
m ¨ q + 1 – p;
if k £ m then
return quickselect(A, p, q, k);
else
return quickselect(A, q + 1, r, k – m);
Από τα παραδείγµατα που είδαµε µέχρι τώρα, οι µεγάλοι χρόνοι εκτέλεσης για αλγο-
ρίθµους «διαίρει και βασίλευε» συµβαίνουν όταν το µεγαλύτερο επιµέρους στιγ-
µιότυπο που προκύπτει από το βήµα της διαίρεσης έχει µέγεθος σχεδόν ίσο µε αυτό
του αρχικού στιγµιότυπου. Σε αυτές τις περιπτώσεις, ο αλγόριθµος πληρώνει το
κόστος της διαίρεσης χωρίς να κάνει σηµαντική πρόοδο.
Στην περίπτωση του προβλήµατος της επιλογής, αν είχαµε µια ντετερµινιστική δια-
δικασία για να βρούµε ένα στοιχείο κοντά στο ενδιάµεσο (π.χ. στοιχείο µε σειρά του-
λάχιστον n/d, για κάποια σταθερά d > 1) και οργανώναµε τη διαίρεση γύρω από αυτό
το στοιχείο, σε κάθε βήµα, το µέγεθος του επιµέρους στιγµιότυπου θα περιοριζόταν
σηµαντικά, και µε αναδροµικές κλήσεις θα µπορούσαµε να λύσουµε το πρόβληµα
της επιλογής σε γραµµικό χρόνο (στη χειρότερη περίπτωση).
Μια ιδέα είναι να επιλέξουµε ένα σηµαντικού µεγέθους δείγµα στοιχείων του πίνα-
κα Α και, αναδροµικά, να βρούµε το ενδιάµεσο στοιχείο αυτού του δείγµατος. Έστω
ότι σε χρόνο Θ(n) µπορούµε να επιλέξουµε ένα δείγµα n/c στοιχείων, για κάποια
σταθερά c > 1, και έστω ότι ο αλγόριθµος quickselect λύνει το πρόβληµα της επι-
λογής σε χρόνο (στη χειρότερη περίπτωση) T(n). Με αναδροµική κλήση του
quickselect, µπορούµε να υπολογίσουµε το ενδιάµεσο στοιχείο αυτού του δείγµατος
σε χρόνο T(n/c).
Ας θεωρήσουµε ότι το µέγεθος n/c και ο τρόπος επιλογής του δείγµατος εγγυώνται
ότι, αν η διαίρεση οργανωθεί γύρω από το ενδιάµεσο στοιχείο του δείγµατος, ο µεγα-
λύτερος από τους δύο υποπίνακες θα έχει µέγεθος το πολύ n/d. Άρα, η αναδροµική
κλήση της quickselect χρειάζεται χρόνο το πολύ T(n/d). Εποµένως, ο χρόνος χειρό-
τερης περίπτωσης για την quickselect θα δίνεται από την αναδροµική εξίσωση T(n)
= Θ(n) + T(n/c) + T(n/d), όπου Θ(n) είναι ο χρόνος χειρότερης περίπτωσης για την
επιλογή του δείγµατος και για την κλήση της διαδικασίας partition.
3.2 ∆√ ¶ƒ√µ§∏ª∞ ∆∏™ ∂¶π§√°∏™ 73

¢Ú·ÛÙËÚÈfiÙËÙ· 3.6

Αν 1/c + 1/d < 1, αποδείξτε ότι η λύση της αναδροµικής εξίσωσης T(n) = Θ(n) +
T(n/c) + T(n/d) είναι T(n) = Θ(n). Τι συµβαίνει στην περίπτωση που 1/c + 1/d = 1;
(βλ. Άσκηση Αυτοαξιολόγησης 2.8, περιπτώσεις 5 και 6).

Ας εστιάσουµε λοιπόν στην επιλογή του δείγµατος. Έχοντας θέσει σαν στόχο τον
σχεδιασµό ενός ντετερµινιστικού αλγορίθµου, δεν µπορούµε να επιλέξουµε το δείγ-
µα µε τυχαίο τρόπο (π.χ. τυχαία δειγµατοληψία µε ή χωρίς αντικατάσταση των στοι-
χείων). Επίσης, δεν µπορούµε να επιλέξουµε χωρίς συγκεκριµένη µέθοδο κάποια n/c
στοιχεία του πίνακα Α, γιατί, αν η διαίρεση οργανωθεί γύρω από το ενδιάµεσο στοι-
χείο ενός τέτοιου του δείγµατος, µπορούµε απλώς να εγγυηθούµε ότι ο µεγαλύτερος
υποπίνακας θα έχει µέγεθος (1 – 1/2c).
Γι’ αυτό διαιρούµε τον πίνακα Α σε Èn / 5ù οµάδες, 5 στοιχείων η κάθε µία (η τελευ-
ταία οµάδα θα έχει ακριβώς n mod 5 στοιχεία), και βρίσκουµε το ενδιάµεσο στοι-
χείο κάθε τέτοιας οµάδας. Το δείγµα αποτελείται από αυτά τα Èn / 5ù ενδιάµεσα
στοιχεία. Προφανώς, το ενδιάµεσο στοιχείο κάθε οµάδας µπορεί να υπολογισθεί σε
σταθερό χρόνο, οπότε ο χρόνος χειρότερης περίπτωσης για την επιλογή του δείγµα-
τος είναι Θ(n). Ένα παράδειγµα αυτής της διαδικασίας φαίνεται στον Πίνακα 3.1.
Το ενδιάµεσο στοιχείο του δείγµατος είναι το 7 και η διαίρεση που προκύπτει είναι
[2, 1, 4, 6, 5, 3] και [9, 7, 15, 10, 11, 13, 8, 12, 14].

¶›Ó·Î·˜ 3.1
Ένα παράδειγµα της διαδικασίας επιλογής του δείγµατος.

Πίνακας Α 9 7 15 2 1 10 4 11 6 5 13 8 12 14 3
Οµάδες [9, 7, 15, 2, 1] [10, 4, 11, 6, 5] [14, 15, 12, 10, 9]
∆είγµα 7 6 12

Όσον αφορά το µέγεθος του µεγαλύτερου από τους δύο υποπίνακες που προκύπτουν
από τη διαίρεση γύρω από το ενδιάµεσο στοιχείου του δείγµατος, αυτό δεν µπορεί
να είναι µεγαλύτερο του 7n/10. Για να αποδείξουµε αυτό, θεωρούµε ότι τα στοιχεία
του Α είναι οργανωµένα σε έναν πίνακα µε Èn / 5ù στήλες και 5 γραµµές. Κάθε
στήλη περιέχει τα στοιχεία µιας από τις Èn / 5ù οµάδες (στις οποίες έχουν χωριστεί
τα στοιχεία του Α για την επιλογή του δείγµατος) σε αύξουσα σειρά. Εποµένως, όλα
τα ενδιάµεσα στοιχεία των στηλών βρίσκονται στην 3η γραµµή. Επιπλέον, η θέση
74 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂

των στηλών είναι τέτοια ώστε το ενδιάµεσο στοιχείο µιας στήλης να µην είναι µεγα-
λύτερο από το ενδιάµεσο στοιχείο της επόµενης. Συνεπώς, το ενδιάµεσο στοιχείο
του δείγµατος βρίσκεται στην (n/10) – η στήλη και στην 3η γραµµή.
Από την κατασκευή αυτή φαίνεται ότι τα στοιχεία που ανήκουν στις στήλες από 1
µέχρι και n/10 και στις γραµµές 1η, 2η, και 3η (συνολικά 3n/10 στοιχεία) είναι µικρό-
τερα του ενδιάµεσου στοιχείου του δείγµατος. Εποµένως, αυτά τα στοιχεία θα τοπο-
θετηθούν στον πρώτο υποπίνακα. Επίσης, τα στοιχεία που βρίσκονται στις στήλες
από n/10 µέχρι και Èn / 5ù και στις γραµµές 3η, 4η και 5η (συνολικά 3n/10 στοιχεία)
είναι µεγαλύτερα του ενδιάµεσου στοιχείου του δείγµατος και, συνεπώς, θα τοπο-
θετηθούν στον δεύτερο υποπίνακα. Άρα, κανένας από τους δύο υποπίνακες δεν µπο-
ρεί να έχει περισσότερα από 7n/10 στοιχεία.
Η κατασκευή αυτή για το παράδειγµα του Πίνακα 3.1 φαίνεται στον Πίνακα 3.2.
Επίσης, η γενική µορφή της κατασκευής φαίνεται στο Σχήµα 3.2, όπου τα στοιχεία
σηµειώνονται µε µαύρους κύκλους, τα στοιχεία του δείγµατος µε λευκούς κύκλους,
και το ενδιάµεσο στοιχείο του δείγµατος µε x. Τα βέλη δηλώνουν ότι το στοιχείο
προορισµού είναι µικρότερο από το στοιχείο αφετηρίας.

¶›Ó·Î·˜ 3.2
Τουλάχιστον 5 στοιχεία είναι µεγαλύτερα και άλλα πέντε µικρότερα
από το ενδιάµεσο στοιχείο του δείγµατος.
4 1 3
5 2 8
6 7 12
10 9 13
11 15 14

... ...
... ...
™¯‹Ì· 3.2
... x
...
Το µέγεθος του
µικρότερου υποπί-
... ...
νακα είναι τουλά-
χιστον 3n/10.
... ...
3.2 ∆√ ¶ƒ√µ§∏ª∞ ∆∏™ ∂¶π§√°∏™ 75

Αφού 1/5 + 7/10 = 9/10 < 1, η ∆ραστηριότητα 3.5 καταδεικνύει ότι ο χρόνος εκτέ-
λεσης χειρότερης περίπτωσης του αλγορίθµου quickselect είναι Θ(n).

¢Ú·ÛÙËÚÈfiÙËÙ· 3.7

Ποιος ο χρόνος εκτέλεσης χειρότερης περίπτωσης για τον αλγόριθµο quickselect,


όταν τα στοιχεία του πίνακα Α χωρίζονται σε οµάδες των 7 αντί σε οµάδες των 5.
Τι συµβαίνει όταν τα στοιχεία του Α χωρίζονται σε οµάδες των 3;

¢Ú·ÛÙËÚÈfiÙËÙ· 3.8

Τροποποιείστε τον αλγόριθµο quicksort ώστε να έχει χρόνο εκτέλεσης χειρότερης


περίπτωσης O(n log n).

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 3.3

Έστω Α και Β δύο πίνακες n στοιχείων διατεταγµένοι σε αύξουσα σειρά. ∆ώστε


έναν «διαίρει και βασίλευε» αλγόριθµο ο οποίος, σε O(log n) βήµατα, επιστρέφει
το ενδιάµεσο (n – οστό) στοιχείο της ένωσης των δύο πινάκων. Για απλότητα, µπο-
ρείτε να υποθέσετε ότι όλα τα 2n στοιχεία είναι διαφορετικά µεταξύ τους.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 3.4

Έστω n διαφορετικά στοιχεία x1, x2, …, xn στα οποία έχουµε αντιστοιχήσει θετικά

Â
n
βάρη w1, w2, …, wn τέτοια ώστε wi = 1 . Το πρόβληµα της εύρεσης του βεβα-
i =1
ρυµένου ενδιάµεσου στοιχείου
(weighted median) είναι να βρεθεί ένα στοιχείο xk που ικανοποιεί τις σχέσεις:

 w £ 2 , και  w £ 2
1 1
i i
xi < xk xi > xk

Σηµειώστε ότι τα στοιχεία x1, …, xn δεν είναι διατεταγµένα. Αποδείξτε ότι:


• Το ενδιάµεσο στοιχείο των x1, …, xn είναι ίδιο µε το βεβαρυµένο ενδιάµεσο στοι-
χείο, όταν τα βάρη wi = 1/n, i = 1, 2, …, n.
• Το βεβαρυµένο ενδιάµεσο στοιχείο µπορεί να υπολογιστεί σε χρόνο O(n log n)
διατάσσοντας την ακολουθία x1, …, xn .
76 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂

• Το βεβαρυµένο ενδιάµεσο στοιχείο µπορεί να υπολογιστεί σε γραµµικό χρόνο


χρησιµοποιώντας έναν «διαίρει και βασίλευε» αλγόριθµο γραµµικού χρόνου για
τον υπολογισµό του ενδιάµεσου στοιχείου ενός πίνακα.

3.3 ¶ÔÏÏ·Ï·ÛÈ·ÛÌfi˜ ·ÚÈıÌÒÓ Î·È ÈӿΈÓ

Στις περισσότερες περιπτώσεις οι αριθµητικές πράξεις θεωρούνται στοιχειώδεις λει-


τουργίες, οι οποίες µπορούν να εκτελεστούν σε σταθερό χρόνο. Όταν όµως πρόκει-
ται για πολυψήφιους αριθµούς, οι αριθµητικές πράξεις δεν µπορούν πλέον να θεω-
ρηθούν στοιχειώδεις λειτουργίες, αφού διαφορετικοί αλγόριθµοι για την εκτέλεση
των πράξεων µπορεί να έχουν σηµαντικά διαφορετικό χρόνο απόκρισης. Σε αυτές
τις περιπτώσεις, µπορούµε να προσδιορίσουµε το χρόνο εκτέλεσης ενός αλγορίθ-
µου, που υλοποιεί κάποια αριθµητική πράξη µεταξύ δύο πολυψήφιων αριθµών, θεω-
ρώντας τις πράξεις µονοψήφιων αριθµών σαν στοιχειώδεις λειτουργίες. Προκειµέ-
νου για αριθµητικές πράξεις πολυψήφιων αριθµών, το µέγεθος της εισόδου είναι ίσο
µε το άθροισµα των ψηφίων των αριθµών, αφού η αύξηση των ψηφίων είναι το γεγο-
νός που αυξάνει τη δυσκολία του προβλήµατος.
Έστω ότι θέλουµε να υπολογίσουµε το άθροισµα δύο αριθµών αριθµού x και y, που
αποτελούνται από n δυαδικά ψηφία. Ο κλασικός αλγόριθµος της πρόσθεσης µε κρα-
τούµενο υπολογίζει το άθροισµα χρησιµοποιώντας Θ(n) στοιχειωδών προσθέσεων
µεταξύ δυαδικών ψηφίων.
Όσον αφορά στον πολλαπλασιασµό δύο n – ψηφίων αριθµών x και y, ο αλγόριθµος
που διδάσκεται στο δηµοτικό σχολείο απαιτεί Θ(n2) στοιχειώδεις πράξεις, αφού απαι-
τεί n προσθέσεις αριθµών που αποτελούνται από τουλάχιστον n δυαδικά ψηφία. Επί-
σης, ο αλγόριθµος πολλαπλασιασµού a la russe απαιτεί Θ(n2) στοιχειώδεις πράξεις,
αφού για κάθε υποδιπλασιασµό του πολλαπλασιαστή, πρέπει να διπλασιαστεί ο πολ-
λαπλασιαστέος. Κάθε διπλασιασµός κοστίζει Θ(n) και απαιτούνται n υποδιπλασια-
σµοί. Ανακύπτει λοιπόν το ερώτηµα αν υπάρχει αλγόριθµος πολλαπλασιασµού µε
ασυµπτωτικά καλύτερο χρόνο εκτέλεσης χειρότερης περίπτωσης.
Θα προσπαθήσουµε να σχεδιάσουµε έναν ασυµπτωτικά γρηγορότερο αλγόριθµο
εφαρµόζοντας τη µέθοδο «διαίρει και βασίλευε». Έστω ότι ο αριθµός των ψηφίων
n είναι ζυγός και x= xnxn– 1…x2x1, y=ynyn– 1…y2y1, όπου xi, yi Œ {0, 1}. Ο αριθµός x
µπορεί να γραφεί σαν x = XL + 2n/2 XH, όπου ο XH=xnxn–1…xn/2 + 2xn/2 + 1 αποτελείται
από τα n/2 πιο σηµαντικά δυαδικά ψηφία και ο XL=xn/2xn/2–1…x2x1 αποτελείται από
τα n/2 λιγότερο σηµαντικά δυαδικά ψηφία. Οµοίως, y = YL + 2n/2YH. Το γινόµενο xy
3.3 ¶√§§∞¶§∞™π∞™ª√™ ∞ƒπ£ªø¡ ∫∞π ¶π¡∞∫ø¡ 77

είναι ίσο µε 2nXHYH + 2n/2(XHYL + XLYH) + XLYL = 2nZ2 + 2n/2Z1 + Z0, όπου Ζ2 = ΧΗΥΗ,
Ζ1 = XHYL + XLYH και Ζ0 = XLYL. Σε αυτό τον τύπο, οι προσθέσεις µπορούν να εκτε-
λεσθούν σε χρόνο Θ(n) και τα επιµέρους γινόµενα µπορούν να υπολογισθούν µε τέσ-
σερις αναδροµικές κλήσεις του αλγορίθµου για αριθµούς µε n/2 δυαδικά ψηφία. Επο-
µένως, ο χρόνος εκτέλεσης Τ1(n) αυτού του αλγορίθµου δίνεται από την αναδροµι-
κή εξίσωση Τ1(n) = 4T1(n/2) + Θ(n). Εφαρµόζοντας το Θεώρηµα της Κυριαρχίας,
βρίσκουµε ότι T1(n) = Θ(n2).
Εποµένως, η απευθείας εφαρµογή της µεθόδους «διαίρει και βασίλευε» δεν αρκεί
για το πρόβληµα του πολλαπλασιασµού. Παρατηρείστε όµως ότι, αντί να υπολογί-
σουµε το Ζ1 απευθείας µε πολλαπλασιασµούς δύο ζευγαριών (n/2) – ψηφίων αριθ-
µών, µπορούµε να υπολογίσουµε πρώτα το ΖΤ = (XH + XL)(YH + YL) µε έναν πολλα-
πλασιασµό δύο (n/2 + 1) – ψηφίων αριθµών και, στη συνέχεια, να υπολογίσουµε το
Ζ1 από τον τύπο Ζ1 = ΖΤ – Ζ0 – Ζ2. Αυτή η διαδικασία χρειάζεται συνολικά µόνο τρεις
πολλαπλασιασµούς µεταξύ (n/2) – ψηφίων αριθµών. Χρειάζεται, βέβαια, τέσσερις
προσθέσεις περισσότερες, αλλά κάθε πρόσθεση µπορεί να εκτελεστεί σε Θ(n) χρόνο.
Ο χρόνος εκτέλεσης χειρότερης περίπτωσης T(n) για το νέο αλγόριθµο δίνεται από
την αναδροµική εξίσωση T(n) = 2T(n/2) + T(n/2 + 1) + Θ(n). Για να απλοποιήσου-
µε την εξίσωση παρατηρούµε ότι Τ(n/2 + 1) = T(n/2) + Θ(n). Έτσι, καταλήγουµε
στην εξίσωση Τ(n) = 3T(n/2) + Θ(n), η οποία µπορεί να λυθεί µε εφαρµογή του Θεω-
ρήµατος της Κυριαρχίας και έχει λύση T(n) = Θ(nlog 3) = Θ(n1.59).
Αυτή η έµµεση εφαρµογή της µεθόδου «διαίρει και βασίλευε» καταλήγει σε αλγό-
ριθµο µε σηµαντικά βελτιωµένο χρόνο εκτέλεσης. Ακόµα γρηγορότεροι αλγόριθµοι
πολλαπλασιασµού πολυψηφίων αριθµών είναι γνωστοί. Συγκεκριµένα, έχει παρου-
σιαστεί αλγόριθµος µε χρόνο εκτέλεσης χειρότερης περίπτωσης O(n log2 n), ενώ
υπάρχει και ο αλγόριθµος των Schonhage και Strassen µε χρόνο εκτέλεσης χειρότε-
ρης περίπτωσης Ο(n log n loglog n), ο οποίος όµως δεν χρησιµοποιείται στην πράξη
εξαιτίας της µεγάλης πολλαπλασιαστικής σταθεράς που «κρύβεται» από τον ασυ-
µπτωτικό συµβολισµό.

3.3.1 ¶ÔÏÏ·Ï·ÛÈ·ÛÌfi˜ ‰È‰È¿ÛÙ·ÙˆÓ ÈӿΈÓ

Έστω Α, Β δύο πίνακες µεγέθους n ¥ n των οποίων θέλουµε να υπολογίσουµε το


γινόµενο C = A ¥ B. Μια πρώτη προσέγγιση είναι να εφαρµόσουµε τον ορισµό:
n
Cij = ÂA B
k =1
ik kj , i = 1,..., n, j = 1,..., n .

Κάθε στοιχείο του πίνακα C µπορεί να υπολογιστεί µε βάση τον παραπάνω τύπο σε Θ(n)
78 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂

χρόνο, και αφού ο C έχει n2 στοιχεία, ο χρόνος εκτέλεσης του αλγορίθµου είναι Θ(n3).
Στα τέλη της δεκαετίας του 1960, ο V. Strassen παρουσίασε έναν αλγόριθµο για τον
πολλαπλασιασµό δύο πινάκων µε χρόνο εκτέλεσης O(nlog 7) = O(n2.81). Ο αλγόριθ-
µος αυτός χρησιµοποιεί τη µέθοδο «διαίρει και βασίλευε» µε έµµεσο τρόπο, όπως
και ο αλγόριθµος πολλαπλασιασµού πολυψηφίων αριθµών που παρουσιάστηκε στην
προηγούµενη ενότητα.
Υποθέτουµε ότι το n είναι ζυγός. Τότε ο καθένας από τους πίνακες Α, Β και C µπο-
ρεί να διαιρεθεί σε τέσσερις υποπίνακες µεγέθους n/2 ¥ n/2 ως εξής:

ÈA A12 ù È B11 B12 ù ÈC11 C12 ù


A = Í 11 ú , B=Í ú , kai C = Í ú ,
Î A21 A22 û Î B21 B22 û ÎC21 C22 û
όπου
C11 = A11B11 + A12 B21
C12 = A11B12 + A12 B22
C12 = A21B11 + A22 B21
C22 = A21B12 + A22 B22

Με αυτόν τον τρόπο, ο υπολογισµός του γινοµένου δύο πινάκων µεγέθους n ¥ n ανά-
γεται στον υπολογισµό των γινοµένων οκτώ ζευγαριών πινάκων µεγέθους n/2 ¥ n/2,
και σε τέσσερις προσθέσεις πινάκων µεγέθους n/2 ¥ n/2. Αφού η πρόσθεση δύο πινά-
κων µεγέθους n ¥ n µπορεί να εκτελεστεί σε χρόνο Θ(n2), ο χρόνος εκτέλεσης T1(n)
του παραπάνω αλγορίθµου πολλαπλασιασµού πινάκων δίνεται από την αναδροµική
εξίσωση T1(n) = 8T(n/2) + Θ(n2). Εφαρµόζοντας το Θεώρηµα της Κυριαρχίας βρί-
σκουµε T1(n) = Θ(n3).
Όπως στην περίπτωση του πολλαπλασιασµού πολυψηφίων αριθµών, µπορούµε να
βελτιώσουµε το χρόνο εκτέλεσης υπολογίζοντας τους υποπίνακες του γινοµένου C
µε έµµεσο τρόπο. Συγκεκριµένα, αρχικά υπολογίζουµε τους παρακάτω πίνακες µεγέ-
θους n/2 ¥ n/2:

M1 = ( A21 + A22 - A11 )( B22 - B12 + B11 )


M 2 = A11B11
M 3 = A12 B21
M 4 = ( A11 - A21 )( B22 - B12 )
M 5 = ( A21 + A22 )( B12 - B11 )
M 6 = ( A12 - A21 + A11 - A22 )B22
M 7 = A22 ( B11 + B22 - B12 - B21 )
3.4 ¶√§Àø¡Àª∞ ∫∞π FFT 79

Στη συνέχεια, υπολογίζουµε τους τέσσερις υποπίνακες του γινοµένου C από τους
τύπους:

C11 = M 2 + M 3
C12 = M1 + M 2 + M 5 + M 6
C21 = M1 + M 2 + M 4 - M 7
C22 = M1 + M 2 + M 4 + M 5

Η παραπάνω διαδικασία υπολογισµού είναι γνωστή σαν αλγόριθµος του Strassen


και απαιτεί την εκτέλεση µόνο επτά πολλαπλασιασµών πινάκων µεγέθους n/2 ¥ n/2.
Επίσης, απαιτεί την εκτέλεση ενός σταθερού αριθµού προσθέσεων πινάκων µεγέ-
θους n/2 ¥ n/2, οι οποίες χρειάζονται χρόνο Θ(n2). Ο χρόνος εκτέλεσης T(n) δίνεται
από την αναδροµική εξίσωση T(n) = 7T(n/2) + Θ(n2), η οποία µπορεί να λυθεί µε
εφαρµογή του Θεωρήµατος της Κυριαρχίας, και έχει λύση T(n) = Θ(nlog 7) = Ο(n2.81).
Η µεγάλη πολλαπλασιαστική σταθερά στο χρόνο εκτέλεση του αλγορίθµου του
Strassen καθιστά τον αλγόριθµο πρακτικά εφαρµόσιµο µόνο για πολύ µεγάλες τιµές
του n. Σήµερα είναι γνωστοί αλγόριθµοι πολλαπλασιασµού πινάκων µε χρόνο εκτέ-
λεσης O(n2.376), ενώ το µόνο γνωστό κάτω φράγµα στο χρόνο εκτέλεσης αλγορίθ-
µων πολλαπλασιασµού πινάκων είναι το Ω(n2), που προκύπτει από το γεγονός ότι
το γινόµενο έχει n2 στοιχεία.

3.4 ¶ÔÏ˘ÒÓ˘Ì· Î·È FFT

Σε αυτή την ενότητα θα περιγράψουµε αλγορίθµους για την εκτέλεση πράξεων


πολυωνύµων, όπως πρόσθεση, πολλαπλασιασµός και υπολογισµός τιµών.

 Â
n -1 n -1
Έστω A( x ) = ai x i και B( x ) = bi x i πολυώνυµα βαθµού (n – 1). Το
i =0 i =0

άθροισµα δύο πολυωνύµων A(x) και B(x) βαθµού (n – 1) είναι ένα πολυώνυµο βαθ-

Â
n -1
µού (n – 1) C ( x ) = ci x i , το οποίο έχει συντελεστές ci = αi + bi. Το γινόµενο
i =0

δύο πολυωνύµων A(x) και B(x) βαθµού (n – 1) είναι ένα πολυώνυµο βαθµού (2n –

 Â
2 n-2 i
2) C ( x ) = ci x i , το οποίο έχει συντελεστές ci = j =0
a j bi - j . Η τιµή ενός
i =0

πολυωνύµου στο σηµείο x0 προκύπτει αν όπου x αντικαταστήσουµε την τιµή x0, και
κάνουµε τις αριθµητικές πράξεις.
Ο απλούστερος τρόπος για να αναπαρασταθεί ένα πολυώνυµο είναι µε το διάνυσµα
των συντελεστών τουA=[α0, α1, …, αn–1]. Αυτή η µέθοδος ονοµάζεται αναπαράστα-
80 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂

ση µε τους συντελεστές (coefficient representation). Χρησιµοποιώντας την αναπα-


ράσταση µε τους συντελεστές, το άθροισµα δύο πολυωνύµων µπορεί να υπολογι-
σθεί σε Θ(n) χρόνο, ενώ το γινόµενό τους σε Θ(n2) χρόνο, απ’ ευθείας από τους ορι-
σµούς. Επίσης, ο υπολογισµός της τιµής ενός πολυωνύµου στη θέση x0 µπορεί να
γίνει µε τη µέθοδο Horner σε χρόνο Θ(n). Η µέθοδος υπολογισµού Horner, γνωστή
και ως µέθοδος φωλιάς, χρησιµοποιεί για τον υπολογισµό της τιµής ενός πολυωνύ-
µου τον παρακάτω τύπο.
A(x0) = α0 + x0(α1 + x0(α2 + … + x0(αn–2 + x0αn–1) …)) .
¢Ú·ÛÙËÚÈfiÙËÙ· 3.9

∆ώστε ψευδοκώδικα για τον υπολογισµό της τιµής ενός πολυωνύµου στη θέση x0
µε τη µέθοδο Horner. Αποδείξτε ότι ο χρόνος εκτέλεσης της µεθόδου είναι Θ(n).

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 3.5

Βασιζόµενοι στον αλγόριθµο πολλαπλασιασµού πολυψήφιων αριθµών, δώστε έναν


Θ(nlog3), «διαίρει και βασίλευε» αλγόριθµο πολλαπλασιασµού δύο πολυωνύµων
βαθµού (n – 1). Υποθέστε ότι το n είναι δύναµη του 2 και ότι τα πολυώνυµα ανα-
παρίστανται µε το διάνυσµα των συντελεστών.

Ένας διαφορετικός τρόπος αναπαράστασης ενός πολυωνύµου βαθµού (n – 1) είναι


µε n ζεύγη (x0,y0),(x1,y1), …, (xn–1,yn–1), όπου yi = A(xi) και τα xi είναι διαφορετικά
µεταξύ τους. Κάθε τέτοιο σύνολο n ζευγών αναπαριστά ένα µοναδικό πολυώνυµο
βαθµού (n – 1), αλλά ένα πολυώνυµο έχει πολλές τέτοιες αναπαραστάσεις, αφού
κάθε συνδυασµός n διαφορετικών σηµείων xi δίνει µια διαφορετική αναπαράσταση.
Αυτός ο τρόπος αναπαράστασης καλείται αναπαράσταση µε ζεύγη σηµείων – τιµών
(point – value representation).
Αν ένα πολυώνυµο Α(x) βαθµού (n – 1) αναπαρίσταται σαν (x0,y0),(x1,y1), …,
(xn–1,yn–1) και ένα πολυώνυµο B(x) βαθµού (n – 1) αναπαρίσταται σαν (x0,y¢0),(x1,y¢1),
…, (xn–1,y¢n–1), το άθροισµά τους A(x) + B(x) θα έχει αναπαράσταση (x0,y0 + y¢0),(x1,y1
+ y¢1), …, (xn–1,yn–1 + y¢n–1), η οποία µπορεί να υπολογιστεί σε Θ(n) χρόνο.

Το γινόµενο δύο πολυωνύµων µπορεί επίσης να υπολογισθεί σε γραµµικό χρόνο,


όταν αυτά αναπαρίστανται µε ζεύγη σηµείων – τιµών. Συγκεκριµένα, αν έχουµε τις
αναπαραστάσεις δύο πολυώνυµων A(x), B(x) βαθµού (n – 1) µε (2n – 1) ζεύγη σηµεί-
ων –τιµών (έστω αυτά (x0,y0), …, (x2n–2, y2n–2) και (x0,y¢0), –…, (x2n–2, y¢2n–2) αντί-
στοιχα), το γινόµενο A(x)B(x) θα έχει αναπαράσταση (x0, y0y¢0), …, (x2n–2,y2n–2y¢2n–2),
3.4 ¶√§Àø¡Àª∞ ∫∞π FFT 81

η οποία µπορεί εύκολα να υπολογισθεί σε Θ(n) χρόνο.


Αντίθετα, ο υπολογισµός της τιµής ενός πολυωνύµου που αναπαρίσταται µε ζεύγη σηµεί-
ων – τιµών απαιτεί µετατροπή σε αναπαράσταση του πολυωνύµου µε συντελεστές .
Βλέπουµε ότι κάθε µορφή αναπαράστασης έχει τα δικά της πλεονεκτήµατα και µει-
ονεκτήµατα, τα οποία θα µπορούσαν να συνδυαστούν, αν υπήρχε ένας αποδοτικός
αλγόριθµος για την µετατροπή της µίας αναπαράστασης στην άλλη.
∆εδοµένης της αναπαράστασης ενός πολυωνύµου µε το διάνυσµα των συντελεστών,
ο υπολογισµός της αναπαράστασης µε ζεύγη σηµείων – τιµών είναι γνωστός και σαν
πρόβληµα υπολογισµού τιµών σε n – σηµεία (n – point evaluation problem). Ο υπο-
λογισµός τιµών σε n – σηµεία, προφανώς, µπορεί να γίνει µε τη µέθοδο Horner σε
χρόνο Θ(n2). Στη συνέχεια, θα δούµε ότι, αν τα σηµεία xi επιλεγούν κατάλληλα, µπο-
ρεί να εφαρµοστεί η µέθοδος «διαίρει και βασίλευε» και ο υπολογισµός να γίνει σε
χρόνο Θ(n log n).
Το πρόβληµα του υπολογισµού του διανύσµατος των συντελεστών από την αναπα-
ράσταση ενός πολυωνύµου µε ζεύγη σηµείων τιµών ονοµάζεται πρόβληµα της
παρεµβολής σε n σηµεία (n – point interpolation problem). Στη συνέχεια, θα δούµε
πως το πρόβληµα της παρεµβολής σε n σηµεία µπορεί να λυθεί σε χρόνο Θ(n log n).
Έχοντας αλγορίθµους χρόνου Θ(n log n) για τα προβλήµατα υπολογισµού τιµών και
παρεµβολής σε n σηµεία, µπορούµε να εκτελέσουµε πολλαπλασιασµό πολυωνύµων,
τα οποία αναπαρίστανται µε συντελεστές, σε Θ(n log n) χρόνο. Τα βήµατα που ακο-
λουθούµε φαίνονται στο Σχήµα 3.3.

Πολλαπλασιασµός—
α0,α1...,αn–1 Θ(n2)
c0,c1...,cn–1 Aναπαράσταση—
b0,b1...,bn–1 µε συντελεστές

Yπολογισµός σε— Παρεµβολή σε—


(2n–1) σηµεία— (2n–1) σηµεία—
Θ(n log n) Θ(n log n)
™¯‹Ì· 3.3
Αλγόριθµος
A(zi),B(zi),— C(zi)=A(zi)B(zi),— Aναπαράσταση µε— πολλαπλασιασµού
0 £i £ 2n–2 0 £i £ 2n–2 ζεύγη σηµείων - τιµών πολυωνύµων σε
Πολλαπλασιασµός—
Θ(n) χρόνο Θ(n log n).

Για να πολλαπλασιάσουµε δύο πολυώνυµα σε Θ(n log n) χρόνο, αρχικά υπολογί-


ζουµε τις τιµές τους σε 2n σηµεία, στη συνέχεια εφαρµόζουµε το γραµµικό αλγό-
82 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂

ριθµο πολλαπλασιασµού για πολυώνυµα που αναπαρίστανται µε ζεύγη σηµείων –


τιµών και, τέλος, µε χρήση παρεµβολής σε 2n σηµεία, υπολογίζουµε το διάνυσµα
των συντελεστών του γινοµένου.

3.4.1 ¢È·ÎÚÈÙfi˜ ÌÂÙ·Û¯ËÌ·ÙÈÛÌfi˜ Fourier (DFT) Î·È FFT

Αρχικά, θα δούµε πώς η µέθοδος του «διαίρει και βασίλευε» µπορεί να εφαρµοστεί
στο πρόβληµα του υπολογισµού τιµών σε n σηµεία. Έστω Α(x) ένα πολυώνυµο βαθ-
µού (n – 1), όπου το n είναι δύναµη του 2. Το πολυώνυµο A(x) µπορεί να γραφεί σαν
A(x) = A[0] (x2) + xA[1](x2), όπου
A[0](x) = α0 + α2x + α4x2 + … + αn–2xn/2– 1 και A[1](x) = α1 + α3x + α5x2 + … + αn–1xn/2 – 1.
Υποθέστε ότι επιλέγουµε τα n σηµεία για υπολογίσουµε την τιµή του A(x) ως εξής:
1, – 1, 2, – 2, …, n/2, – n/2. Για τον υπολογισµό της τιµής του A(x), πρέπει να υπο-
λογίσουµε τις τιµές των A[0](x) και A[1](x) στα τετράγωνα αυτών σηµείων. Αλλά τα
τετράγωνα των 1 και –1, 2 και –2, κοκ., είναι ίδια, οπότε υπάρχουν µόνο n/2 διαφο-
ρετικά τετράγωνα. Εποµένως, το αρχικό πρόβληµα µεγέθους n έχει αναχθεί στη λύση
δύο επιµέρους προβληµάτων µεγέθους n/2 το καθένα, τα οποία µπορούν να λυθούν
αναδροµικά. Επιπλέον, οι λύσεις των επιµέρους προβληµάτων µπορούν να συνδυα-
στούν σε µία λύση του αρχικού προβλήµατος σε Θ(n) χρόνο. Με αυτό τον τρόπο
καταλήγουµε ότι ο χρόνος εκτέλεσης T(n) αυτής της αναδροµικής διαδικασίας δίνε-
ται από την αναδροµική εξίωση T(n) = 2T(n/2) + Θ(n), η οποία γνωρίζουµε ότι έχει
λύση T(n) = Θ(n log n).
Το µοναδικό πρόβληµα στην παραπάνω αναδροµική διαδικασία είναι ότι, για την
εφαρµογή της αναδροµής σε περισσότερα του ενός επίπεδα, τα σηµεία στα οποία θα
υπολογιστεί η τιµή του πολυωνύµου πρέπει να είναι µιγαδικοί αριθµοί.
Μιγαδικές Ρίζες της Μονάδας

ω28 i
ω38 ω18

ω48 ω08
–1 1
™¯‹Ì· 3.4
Οι µιγαδικές ρίζες ω78
ω58
της µονάδας ω68 –i
για n = 8.
3.4 ¶√§Àø¡Àª∞ ∫∞π FFT 83

Μία n – οστή µιγαδική ρίζα της µονάδας είναι ένας αριθµός ω, τέτοιος, ώστε ωn =
1. Υπάρχουν ακριβώς n µιγαδικές n – οστές ρίζες της µονάδας, οι οποίες είναι οι
αριθµοί e2πik/n, για k = 0, 1, …, n – 1, όπου e = 2,71… η βάση των φυσικών λογα-
ρίθµων, π = 3,14…, και i2 = – 1. Για να ερµηνεύσουµε αυτό τον τύπο, θεωρούµε τον
ορισµό του εκθέτη ενός µιγαδικού αριθµού:
eiu = cos(u) + i sin(u) .
Το Σχήµα 3.4. δείχνει ότι οι n µιγαδικές ρίζες της µονάδας κατανέµονται οµοιόµορ-
φα γύρω από έναν κύκλο που έχει µοναδιαία ακτίνα και κέντρο την αρχή των αξό-
νων του µιγαδικού επιπέδου.
Η τιµή ωn = e2πi/n ονοµάζεται κύρια n – οστή ρίζα της µονάδας και όλες οι υπόλοι-
πες n – οστές ρίζες µπορούν να γραφούν σαν δυνάµεις της ωn. Το σύνολο των n –
οστών ριζών της µονάδας είναι κλειστό ως προς τον πολλαπλασιασµό, δηλαδή το
γινόµενο δύο n – οστών ριζών της µονάδας είναι επίσης n – οστή ρίζα της µονάδας.
Συγκεκριµένα, ωj ωk = ωj + k = ω(j + k) mod n. Η βασική ιδιότητα των µιγαδικών ριζών
της µονάδας που θα χρησιµοποιήσουµε στη συνέχεια είναι ότι, αν το n είναι δύνα-
µη του 2, το σύνολο των τετραγώνων των n – οστών ριζών της µονάδας είναι το
σύνολο των (n/2) – οστών ριζών της µονάδας. Συγκεκριµένα, ισχύει:

{(w n0 )2 ,(w 1n )2 ,K,(w nn -1 )2 } = {w n0 / 2 ,K, w nn//22 -1 } .

Για να αποδείξουµε τον παραπάνω ισχυρισµό, παρατηρούµε ότι, για κάθε 0 £ k £ n/2
– 1, έχουµε (w n ) = (e
k 2
) = e 2 pik /( n / 2 ) = w nk / 2 .
2 pik / n 2

Επιπλέον,

(w nk + n / 2 )2 = w n2 k + n = w n2 k w nn = w n2 k = e 2 pi ( 2 k )/ n = e 2 pik /( n / 2 ) = w nk / 2 .

∆ιακριτός Μετασχηµατισµός Fourier

Ο ∆ιακριτός Μετασχηµατισµός Fourier (Discrete Fourier Transform – DFT) ενός


διανύσµατος A=[α0, α1, …, αn– 1] µεγέθους n είναι ένα διάνυσµα Y=[y0, y1, …, yn– 1]

Â
n -1
µεγέθους n, όπου, για κάθε k = 0, 1, …, n – 1, είναι y k = a jw nkj . ∆ηλαδή, το
j =0

διάνυσµα A µπορεί να θεωρηθεί σαν το διάνυσµα των συντελεστών ενός πολυωνύ-

Â
n -1
µου A( x ) = ai x i , και κάθε στοιχείο yk του διανύσµατος Y είναι η τιµή του
i =0

πολυωνύµου Α(x) στο σηµείο w nk , δηλαδή στην k στη σειρά n – οστή ρίζα της µονάδας.
84 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂

Γρήγορος Μετασχηµατισµός Fourier


Το καλό µε το DFT είναι ότι υπάρχει ένας Θ(n log n) αλγόριθµος, γνωστός σαν Γρή-
γορος Μετασχηµατισµός Fourier (Fast Fourier Transform – FFT), για τον υπολογισµό
του διανύσµατος Υ. O αλγόριθµος FFT µετατρέπει την αναπαράσταση ενός πολυωνύ-
µου από το διάνυσµα των συντελεστών σε αναπαράσταση µε ζεύγη σηµείων – τιµών,
αφού υπολογίζει τις τιµές ενός πολυωνύµου A(x), το οποίο αναπαρίσταται από το διά-
νυσµα A=[α0, α1, …, αn– 1] στα σηµεία των n – οστών ριζών της µονάδας.
Ο FFT βασίζεται στη µέθοδο «διαίρει και βασίλευε» και, συγκεκριµένα, χρησιµοποιεί
την ιδέα της διάσπασης ενός πολυωνύµου βαθµού (n – 1), όπου το n είναι δύναµη του
2, σε δύο πολυώνυµα Α[0](x) και A[1](x) βαθµού (n/2 – 1). Για να υπολογίζει τις τιµές
του A(x) στις n – οστές ρίζες της µονάδας, υπολογίζει αναδροµικά τις τιµές των Α[0](x)
και A[1](x) στα τετράγωνα των n – οστών ριζών, τα οποία δεν είναι άλλα από τις (n/2)
– οστές ρίζες της µονάδας, και χρησιµοποιεί τον τύπο A(x)= A[0] (x2) + xA[1] (x2).
FFT(A=[α0, α1, …, αn – 1]) {∆Ô n Â›Ó·È ‰‡Ó·ÌË ÙÔ˘ 2}
if n = 1 then return α0;

ωn ¨ e2πi/k ; ω ¨ 1;
A[0]=[α0, α2, …, αn – 2] ; A[1]= [α1, α3, …, αn – 1]
Y[0] ¨ FFT(A[0]); Y[1] ¨ FFT(A[1]);

for k ¨ 0 to (n/2 – 1) do
y k ¨ y[k0] + wy[k1]; y k + n /2 ¨ y[k0] - wy[k1]; w ¨ ww n;

return Y= [y0, y1, …, yn–1] ;


Έχουµε ήδη υπολογίσει το χρόνο εκτέλεσης της παραπάνω αναδροµικής διαδικα-
σίας, ο οποίος είναι T(n) = Θ(n log n).

Το Πρόβληµα της Παρεµβολής


Έχοντας λύσει το πρόβληµα υπολογισµού τιµών στις n – οστές ρίζες της µονάδας σε
Θ(n log n) χρόνο, αποµένει να λύσουµε το πρόβληµα της παρεµβολής στις n – οστές
ρίζες της µονάδας σε Θ(n log n) χρόνο, ώστε να ολοκληρώσουµε τον αλγόριθµο πολ-
λαπλασιασµού πολυωνύµων που περιγράφεται στο Σχήµα 3.3.

Για να υπολογίσουµε το διάνυσµα των συντελεστών A=[α0, α1, …, αn – 1] ενός πολυω-


νύµου A(x) από το διάνυσµα των τιµών του Y= [y0, y1, …, yn–1] στις n – οστές ρίζες
3.4 ¶√§Àø¡Àª∞ ∫∞π FFT 85

Â
n -1
της µονάδας, πρέπει να λύσουµε το σύστηµα εξισώσεων y k = A(w nk ) = a jw nkj ,
j =0

για κάθε k = 0, 1, …, n – 1. ∆ηλαδή, πρέπει να λύσουµε το σύστηµα n εξισώσεων


µε n αγνώστους Y = V ¥ A, όπου ο πίνακας V έχει µέγεθος n ¥ n και V [ k , j] = w nkj .
Συγκεκριµένα,

È y0 ù È1 1 1 1 K 1 ù È a0 ù
Í ú Í n -1 ú Í ú
Í y1 ú Í1 w n wn 2
w n3 K wn ú Í a1 ú
Í y2 ú Í1 w n2 w n4 w n6 K w n2 ( n -1) ú Í a2 ú
Í ú = Í ú Í ú
Í y3 ú Í1 w n
3
w n6 w n9 K w n3( n -1) ú Í a3 ú
ÍM ú ÍM M M M O M ú ÍM ú
Í ú Í 2 ( n -1) 3( n -1)
ú Í ú
ÍÎ y n -1 úû n -1
ÍÎ1 w n wn wn K w n( n -1)( n -1) úû ÍÎ an -1 úû

Για να υπολογίσουµε το διάνυσµα Α, πρέπει πρώτα να υπολογίσουµε τον αντίστρο-


φο V– 1 του πίνακα V. Θα δείξουµε ότι τα στοιχεία του αντίστροφου πίνακα V– 1 έχουν
τη µορφή V -1[ k , j] = w n- kj / n , για κάθε 0 £ k £ n –1 και 0 £ j £ n –1 .
Για να επιβεβαιώσουµε αυτόν τον ισχυρισµό, ελέγχουµε αν το γινόµενο του πίνακα
V µε τον V– 1 είναι ίσο µε το µοναδιαίο πίνακα. Το στοιχείο [k, j] του γινοµένου V ¥
V– 1 είναι ίσο µε:

n -1

Â
1
(VV -1 )[ k , j] = w nkmw n- jm
n m=0
n -1

Â
1
= w nm( k - j )
n m=0
n -1

Â
1
= (w nk - j )m
n m=0

Αν k = j, w nk - j = w n0 = 1 , οπότε το άθροισµα είναι ίσο µε 1/n, και (VV–1)[k, k]=1, για


κάθε 0 £ k £ n – 1. Αν k π j, αφού –(n – 1) < k – j < (n – 1), η ποσότητα (k – j) δεν
διαιρείται µε το n. Για κάθε τέτοιο ακέραιο q = k – j ισχύει ότι:
n -1
(w nq ) n - 1 (w nn ) q - 1 (1) q - 1
Â
m=0
(w nq )m =
w nq - 1
=
w nq - 1
= q
wn -1
= 0,

όπου χρησιµοποιήσαµε το γεγονός ότι το αρχικό άθροισµα αποτελείται από τους n


πρώτους όρους γεωµετρικής προόδου. Άρα, για κάθε k π j, (VV–1)[k, j]=0 και ο πίνα-
κας V– 1 µε στοιχεία V -1[ k , j] = w n- kj / n είναι όντως ο αντίστροφος πίνακας του V.
86 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂

Εποµένως, οι συντελεστές του πολυωνύµου A(x) δίνονται από τον τύπο

Â
n -1
ak = (1 / n ) y jw n- kj , για κάθε 0 £ k £ n – 1, ο οποίος µοιάζει πολύ µε αυτόν του
j =0

υπολογισµού των τιµών yk του πολυωνύµου στις θέσεις των ριζών της µονάδας.
Συνεπώς, αν αλλάξουµε αµοιβαία τους ρόλους των διανυσµάτων Α και Y και των
στοιχείων τους, αντικαταστήσουµε το ωn µε το ωn– 1 και διαιρέσουµε κάθε στοιχείο
του αποτελέσµατος µε το n, ο αλγόριθµος FFT µπορεί να χρησιµοποιηθεί για τον
υπολογισµό των συντελεστών του πολυωνύµου από τις τιµές του στις n – οστές ρίζες
της µονάδας.
Έτσι, χρησιµοποιώντας την ορθή και την αντίστροφη µορφή του FFT, µπορούµε να
µετατρέψουµε την αναπαράσταση µε συντελεστές ενός πολυωνύµου βαθµού (n – 1)
σε αναπαράσταση µε ζεύγη σηµείων – τιµών σε χρόνο Θ(n log n), και να υπολογί-
σουµε το γινόµενο δύο πολυωνύµων στον ίδιο χρόνο.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 3.6

Έστω A(x) = 3 – x και B(x) = 2 + 3x δύο πολυώνυµα πρώτου βαθµού. Περιγράψτε


αναλυτικά τον υπολογισµό του γινοµένου C(x) = A(x)B(x) ακολουθώντας τον αλγό-
ριθµο του Σχήµατος 3.3 και χρησιµοποιώντας τον FFT για τις µετατροπές των ανα-
παραστάσεων.
™YNOæH 87

™‡ÓÔ„Ë
Σε αυτό το κεφάλαιο παρουσιάστηκε αναλυτικά η µέθοδος «διαίρει και βασίλευε»
µέσα από παραδείγµατα αλγορίθµων.
Αρχικά, παρουσιάστηκε ο αλγόριθµος quicksort για τη διάταξη ενός πίνακα αριθµών.
Η quicksort επιλέγει ένα στοιχείο x του πίνακα και διαιρεί τον πίνακα εισόδου σε δύο
υποπίνακες, ώστε κανένα στοιχείο του ενός να µην ξεπερνά το x και κανένα στοιχείο
του δεύτερου να µην είναι µικρότερο από το x. Η βασική ντετερµινιστική εκδοχή της
quicksort έχει χρόνο εκτέλεσης Ω(n log n) και Ο(n2), ενώ η πιθανοτική εκδοχή της
quicksort έχει χρόνο εκτέλεσης µέσης περίπτωσης Θ(n log n).
Επίσης, αποδείξαµε ότι κάθε ντετερµινιστικός αλγόριθµος, του οποίου η λειτουργία
βασίζεται σε συγκρίσεις µεταξύ των στοιχείων εισόδου, χρειάζεται (στη χειρότερη
περίπτωση) χρόνο Ω(n log n) για να διατάξει έναν πίνακα n στοιχείων.
Στη συνέχεια, είδαµε έναν πιθανοτικό και έναν ντετερµινιστικό αλγόριθµο γραµµι-
κού χρόνου για το πρόβληµα της επιλογής. Η λειτουργία και των δύο αλγορίθµων
βασίζεται στην ιδέα της διαίρεσης του πίνακα εισόδου µε βάση ένα στοιχείο και στην
αναδροµική επίλυση του προβλήµατος στον έναν από τους δύο υποπίνακες. Οι αλγό-
ριθµοι διαφέρουν στον τρόπο επιλογής του στοιχείου γύρω από το οποίο οργανώνε-
ται η διαίρεση.
Η µέθοδος «διαίρει και βασίλευε» βρίσκει εφαρµογή στον πολλαπλασιασµό πολυ-
ψήφιων αριθµών, τον πολλαπλασιασµό πινάκων και στον πολλαπλασιασµό πολυω-
νύµων. Ειδικά για τα πολυώνυµα, είδαµε έναν αποδοτικό αλγόριθµο πολλαπλασια-
σµού που βασίζεται στη µετατροπή από της αναπαράσταση από διάνυσµα συντελε-
στών σε ζεύγη σηµείων – τιµών. Η µετατροπή γίνεται µε τον αλγόριθµο FFT, ο οποί-
ος βασίζεται στη µέθοδο «διαίρει και βασίλευε» και υπολογίζει το ∆ιακριτό Μετα-
σχηµατισµό Fourier ενός διανύσµατος σε χρόνο Θ(n log n).
88 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂

µÈ‚ÏÈÔÁÚ·Ê›·

Η µέθοδος «διαίρει και βασίλευε» καλύπτεται πολύ καλά στο:


[1] G. Brassard και P. Bratley. Algorithmics: Theory and Practice. Prentice – Hall,
1988.
Οι αλγόριθµοι διάταξης στοιχείων και επιλογής καλύπτεται πολύ καλά στα:
[2] T.H. Cormen, C.E. Leiserson, και R. L. Rivest. Introduction to Algorithms. MIT
Press, 1990.
[3] A.V. Aho, J.E. Hopcroft, και J.D. Ullman. Data Structures and Algorithms.
Addison – Wesley, 1988.
[4] K. Mehlhorn. Data Structures and Algorithms. Springer – Verlag, 1984.
Ο αλγόριθµος quicksort, οι αλγόριθµοι για το πρόβληµα της επιλογής και ο αλγό-
ριθµος FFT παρουσιάζονται στις παρακάτω εργασίες:
[5] C.A.R. Hoare. Quicksort. Computer Journal, 5(1):10 – 15, 1962.
[6] M. Blum, R.W. Floyd, V. Pratt, R.L. Rivest, και R.E. Tarjan. Time bounds for
selection. Journal of Computer and System Sciences, 7(4):448 – 461, 1973.
[7] C.A.R. Hoare. Algorithm 63 (partition) and algorithm 65 (find). Communications
of the ACM, 4(7):321 – 322, 1961.
[8] J.W. Cooley and J.W. Tukey. An algorithm for the machine calculation of complex
Fourier series. Mathematics of Computation, 19(90):297 – 301, 1965.
¢˘Ó·ÌÈÎfi˜ ¶ÚÔÁÚ·ÌÌ·ÙÈÛÌfi˜

™ÎÔfi˜
∫ ∂

4
Σκοπός αυτού του κεφαλαίου είναι η αναλυτική παρουσίαση της µεθόδου του δυνα-
µικού προγραµµατισµού. Η παρουσίαση εστιάζει στα ιδιαίτερα χαρακτηριστικά της
º

µεθόδου και στις ιδιότητες που καθιστούν ένα πρόβληµα κατάλληλο για επίλυση µε
δυναµικό προγραµµατισµό.
∞ § ∞ π √

¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·

Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση:

• Να αναγνωρίσει τις ιδιότητες των βέλτιστων επιµέρους δοµών και των επικαλυ-
πτόµενων επιµέρους προβληµάτων σε ένα πρόβληµα.

• Να διατυπώσει την αναδροµική εξίσωση που περιγράφει τη βέλτιστη λύση ενός


προβλήµατος µε την ιδιότητα των βέλτιστων επιµέρους δοµών.

• Να εφαρµόσει τη µέθοδο του δυναµικού προγραµµατισµού για την επίλυση προ-


βληµάτων µέτριου βαθµού δυσκολίας.

• Να εκτιµήσει τον αριθµό των θέσεων µνήµης που απαιτεί ένας αλγόριθµος δυνα-
µικού προγραµµατισµού.

ŒÓÓÔȘ ÎÏÂȉȿ
• δυναµικός προγραµµατισµός • ιδιότητα επικαλυπτόµενων επιµέρους
• πρόβληµα βελτιστοποίησης προβληµάτων
• ιδιότητα βέλτιστων επιµέρους δοµών • στρατηγικές top – down και bottom – up

∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Η µέθοδος του δυναµικού προγραµµατισµού (dynamic programming), όπως και η
µέθοδος «διαίρει και βασίλευε», επιλύει ένα πρόβληµα συνδυάζοντας τις λύσεις
κατάλληλα επιλεγµένων, επιµέρους προβληµάτων. Στην περίπτωση του δυναµικού
προγραµµατισµού, ο όρος «προγραµµατισµός» περιγράφει τη διαδικασία υπολογι-
σµού / συµπλήρωσης των στοιχείων ενός πίνακα, και όχι τη δηµιουργία ενός προ-
γράµµατος για εκτέλεση σε υπολογιστή.
90 K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™

Όπως είδαµε στο προηγούµενο κεφάλαιο, η µέθοδος «διαίρει και βασίλευε» διαιρεί το
πρόβληµα σε ανεξάρτητα επιµέρους προβλήµατα, επιλύει τα επιµέρους προβλήµατα
αναδροµικά και συνδυάζει τις λύσεις τους για να υπολογίσει µια λύση για το αρχικό
πρόβληµα. Η µέθοδος του δυναµικού προγραµµατισµού εφαρµόζεται όταν τα επιµέ-
ρους προβλήµατα που πρέπει να επιλυθούν δεν είναι ανεξάρτητα, αλλά τα ίδια περιέ-
χουν κοινά επιµέρους προβλήµατα. Αυτό το χαρακτηριστικό ονοµάζεται ιδιότητα των
επικαλυπτόµενων επιµέρους προβληµάτων (overlapping subproblems). Σε αυτά τα προ-
βλήµατα, ένας αλγόριθµος «διαίρει και βασίλευε» κάνει περισσότερη δουλειά από όση
χρειάζεται, αφού επιλύει πολλές φορές το ίδιο επιµέρους πρόβληµα. Αντίθετα, ένας
αλγόριθµος δυναµικού προγραµµατισµού είναι πιο αποδοτικός, επειδή επιλύει µία φορά
κάθε διαφορετικό επιµέρους πρόβληµα και αποθηκεύει τη λύση σε έναν πίνακα για µελ-
λοντική χρήση. Αυτό το χαρακτηριστικό κάνει τους αλγορίθµους δυναµικού προγραµ-
µατισµού ιδιαίτερα απαιτητικούς σε αποθηκευτικό χώρο / θέσεις µνήµης, οι οποίες χρη-
σιµοποιούνται για την αποθήκευση των λύσεων των επιµέρους προβληµάτων.
Η µέθοδος του δυναµικού προγραµµατισµού, συνήθως, εφαρµόζεται σε προβλήµατα
βελτιστοποίησης (optimization problems). Ένα πρόβληµα βελτιστοποίησης έχει πολ-
λές αποδεκτές λύσεις, σε καθεµία από τις οποίες αντιστοιχεί µία τιµή. Το ζητούµενο
είναι ο υπολογισµός της λύσης µε τη βέλτιστη (µέγιστη ή ελάχιστη) τιµή. Ο δυναµι-
κός προγραµµατισµός εφαρµόζεται σε προβλήµατα βελτιστοποίησης των οποίων οι
βέλτιστες λύσεις αποτελούνται από τις βέλτιστες λύσεις συγκεκριµένων επιµέρους
δοµών (optimal substructures).
Ο σχεδιασµός ενός αλγορίθµου δυναµικού προγραµµατισµού για κάποιο συγκεκρι-
µένο πρόβληµα βελτιστοποίησης, συνήθως, ακολουθεί τα παρακάτω βήµατα:
Μελέτη του προβλήµατος ως προς την ιδιότητα των βέλτιστων επιµέρους δοµών και
χαρακτηρισµός της δοµής µιας βέλτιστης λύσης.
∆ιατύπωση της αναδροµικής εξίσωσης που περιγράφει την τιµή µιας βέλτιστης λύσης.
Υπολογισµός της τιµής µιας βέλτιστης λύσης, προχωρώντας από τα µικρότερα στα
µεγαλύτερα επιµέρους προβλήµατα (bottom – up στρατηγική).
Υπολογισµός µιας βέλτιστης λύσης. Το βήµα αυτό µπορεί να παραληφθεί, αν ενδια-
φερόµαστε µόνο για την τιµή µιας βέλτιστης λύσης.
Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες:
4.1. Πολλαπλασιασµός Ακολουθίας Πινάκων
4.2. Χαρακτηριστικά ∆υναµικού Προγραµµατισµού
4.3. Μεγαλύτερη Κοινή Υπό – Ακολουθία
4.1 ¶√§§∞¶§∞™π∞™ª√™ ∞∫√§√À£π∞™ ¶π¡∞∫ø¡ 91

4.1 ¶ÔÏÏ·Ï·ÛÈ·ÛÌfi˜ ·ÎÔÏÔ˘ı›·˜ ÈӿΈÓ

Ας υποθέσουµε ότι θέλουµε να υπολογίσουµε το γινόµενο µιας ακολουθίας πινάκων


χρησιµοποιώντας τον αλγόριθµο που λειτουργεί βάση του ορισµού της πράξης του
πολλαπλασιασµού πινάκων (βλ. Ενότητα 3.3). Για τον πολλαπλασιασµό ενός πίνα-
κα A διάστασης p ¥ q µε έναν πίνακα B διάστασης q ¥ r, αυτός ο αλγόριθµος εκτε-
λεί ακριβώς pqr πολλαπλασιασµούς µεταξύ στοιχείων των πινάκων.
Έστω ότι δίνεται µια ακολουθία πινάκων Α1, Α2, …, An, όπου ο πίνακας Αi έχει διάστα-
ση di–1 ¥ di,i = 2, …, n, και θέλουµε να υπολογίσουµε το γινόµενο Α = Α1Α2…Αn. Η προ-
σεταιριστική ιδιότητα ισχύει για την πράξη του πολλαπλασιασµού πινάκων (δηλαδή,
Α1Α2Α3 = (Α1Α2)Α3 = Α1(Α2Α3)), εποµένως, το γινόµενο Α µπορεί να υπολογιστεί µε πολ-
λούς διαφορετικούς τρόπους. Για παράδειγµα, µπορούµε να υπολογίσουµε:
A=(…((A1A2)A3)…An) ή A=(A1(A2(A3…(An–1An)…))) ή ακόµα
A=((A1A2)(A3A4)…(An–1An)) κοκ.
Πριν τον υπολογισµό του γινοµένου, πρέπει λοιπόν να χρησιµοποιήσουµε παρενθέ-
σεις για να καθορίσουµε επακριβώς τη σειρά µε την οποία οι πίνακες θα πολλαπλα-
σιαστούν µεταξύ τους. Η σειρά υπολογισµού ενός γινοµένου πινάκων είναι πλήρως
ορισµένη όταν το γινόµενο αποτελείται από ένα µόνο πίνακα ή από δύο επιµέρους
γινόµενα, για καθένα από τα οποία η σειρά υπολογισµού είναι πλήρως ορισµένη.
Για παράδειγµα, θεωρούµε ότι έχουµε να υπολογίσουµε το γινόµενο Α1 Α 2 Α3 Α4,
όπου ο Α1 έχει διάσταση 13 ¥ 5, ο Α2 έχει διάσταση 5 ¥ 89, ο Α3 89 ¥ 3 και ο Α4 3 ¥
34. Υπάρχουν πέντε διαφορετικοί τρόποι να τοποθετήσουµε παρενθέσεις που καθο-
ρίζουν τη σειρά υπολογισµού αυτού του γινοµένου. Επιπλέον, κάθε διαφορετική
σειρά υπολογισµού απαιτεί την εκτέλεση διαφορετικού αριθµού πολλαπλασιασµών
µεταξύ στοιχείων των πινάκων. Αν θεωρήσουµε τον αριθµό των πολλαπλασιασµών
στοιχείων σαν µέτρο της ταχύτητας µε την οποία υπολογίζεται το γινόµενο, η σειρά
υπολογισµού καθορίζει σε σηµαντικό βαθµό την ταχύτητα. Στον παρακάτω πίνακα
βλέπουµε τις πέντε διαφορετικές σειρές υπολογισµού, δηλαδή τους πέντε διαφορε-
τικούς τρόπους µε τους οποίους µπορούν να τοποθετηθούν οι παρενθέσεις και τον
αριθµό πολλαπλασιασµών στοιχείων που απαιτεί η κάθε µία.
92 K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™

Σειρά υπολογισµού Αριθµός Πολλαπλασιασµών


(((Α1Α2)Α3)Α4) 13 ¥ 5 ¥ 89 + 13 ¥ 89 ¥ 3 +
13 ¥ 3 ¥ 34 =
10.582
((Α1Α2)(Α3Α4)) 54.201
((Α1(Α2Α3))Α4) 2.856
(Α1((Α2Α3)Α4)) 4.055
(Α1(Α2(Α3Α4))) 26.418

Το πρόβληµα του πολλαπλασιασµού µιας ακολουθίας πινάκων (matrix chain


multiplication) είναι, δεδοµένης µιας ακολουθίας n πινάκων (Α1, Α2, …, Αn), όπου ο
πίνακας Ai έχει διάσταση di–1 ¥ di, i = 2, …, n, να υπολογιστεί το γινόµενο Α1Α2…Αn
χρησιµοποιώντας τον µικρότερο δυνατό αριθµό πολλαπλασιασµών µεταξύ των στοι-
χείων των πινάκων. ∆ιαφορετικά, πρέπει να τοποθετηθούν παρενθέσεις, οι οποίες
καθορίζουν τη σειρά υπολογισµού του γινοµένου, ώστε να ελαχιστοποιηθεί ο αριθ-
µός των πολλαπλασιασµών µεταξύ στοιχείων που θα εκτελέσει ο αλγόριθµος που
βασίζεται στον ορισµό του γινοµένου πινάκων.

™∏ª∂πø™∏ (¶ƒ√µ§∏ª∞∆∞ µ∂§∆π™∆√¶√π∏™∏™)

Το πρόβληµα του πολλαπλασιασµού ακολουθίας πινάκων είναι διαφορετικό από αυτά


που έχουµε δει µέχρι τώρα. Κάθε στιγµιότυπο του προβλήµατος της διάταξης ή της
επιλογής είχε µία µοναδική λύση, η οποία έπρεπε να υπολογισθεί. Αντίθετα, κάθε
στιγµιότυπο του προβλήµατος του πολλαπλασιασµού ακολουθίας πινάκων επιδέχε-
ται πολλών διαφορετικών λύσεων (κάθε συντακτικά ορθή τοποθέτηση παρενθέσεων
αποτελεί µία έγκυρη λύση), και σε κάθε λύση αντιστοιχεί µια τιµή (ο αριθµός των
πολλαπλασιασµών στοιχείων για τη συγκεκριµένη σειρά υπολογισµού), η οποία ονο-
µάζεται αντικειµενική τιµή (objective value). Το ζητούµενο είναι ο υπολογισµός µιας
βέλτιστης λύσης (optimal solution), δηλαδή µιας λύσης µε βέλτιστη (ελάχιστη για το
συγκεκριµένο πρόβληµα) αντικειµενική τιµή. Τέτοιου είδους προβλήµατα ονοµάζο-
νται προβλήµατα βελτιστοποίησης (optimization problems). Ένα πρόβληµα βελτιστο-
ποίησης επιδέχεται πολλών λύσεων, καθεµία από τις οποίες έχει µία αντικειµενική
τιµή. Το ζητούµενο είναι ο υπολογισµός µιας λύσης που επιτυγχάνει τη βέλτιστη (µέγι-
στη ή ελάχιστη) αντικειµενική τιµή. Μερικές φορές, δεν ζητείται µια βέλτιστη λύση,
αλλά απλώς η βέλτιστη αντικειµενική τιµή, δηλαδή η τιµή που επιτυγχάνεται από µια
βέλτιστη λύση. Τα προβλήµατα στα οποία εφαρµόζεται η µέθοδος του δυναµικού προ-
γραµµατισµού είναι στην πλειοψηφία τους προβλήµατα βελτιστοποίησης.
4.1 ¶√§§∞¶§∞™π∞™ª√™ ∞∫√§√À£π∞™ ¶π¡∞∫ø¡ 93

Ένας προφανής αλγόριθµος για το πρόβληµα του πολλαπλασιασµού ακολουθίας


πινάκων είναι να υπολογίσουµε τον αριθµό των πολλαπλασιασµών στοιχείων για
όλες τις έγκυρες τοποθετήσεις παρενθέσεων και να διαλέξουµε αυτή µε την ελάχι-
στη τιµή. Έστω P(n) ο αριθµός των τοποθετήσεων παρενθέσεων που θα δοκιµάσει
αυτός ο αλγόριθµος για µία ακολουθία πινάκων µεγέθους n. Αφού µπορούµε να διαι-
ρέσουµε (τοποθετώντας παρενθέσεις) την ακολουθία µεταξύ των πινάκων i και i +
1, i = 1, 2, …, n – 1, και, στη συνέχεια, να τοποθετήσουµε παρενθέσεις στις δύο επι-
µέρους ακολουθίες ανεξάρτητα, είναι:
n -1
P (n ) = Â P (i )P (n - i ) ,
i =1

µε αρχική συνθήκη P(1) = 1. Μπορεί να αποδειχθεί ότι P(n) = C(n – 1), όπου C(n)
είναι ο n – οστός αριθµός Catalan:

1 Ê 2nˆ Ê 4n ˆ
C (n ) = Á ˜ = W Á 3/ 2 ˜
n +1 Ë n ¯ Ën ¯ .
Εποµένως, ο αλγόριθµος που εξετάζει όλες τις δυνατές τοποθετήσεις παρενθέσεων
δεν συνιστά µία αποδοτική λύση στο πρόβληµά µας. Μια εναλλακτική προσέγγιση
είναι η εφαρµογή της µεθόδου του δυναµικού προγραµµατισµού.
Στην προσπάθεια να σχεδιάσουµε έναν αλγόριθµο δυναµικού προγραµµατισµού, ξεκι-
νάµε µελετώντας τη δοµή µιας βέλτιστης λύσης. Ας συµβολίσουµε µε Αi..j το επιµέ-
ρους γινόµενο Αi…Aj. Κάθε βέλτιστη λύση θα διαιρεί την ακολουθία µεταξύ των πινά-
κων i και i + 1, για κάποιο 1 £ i < n, θα υπολογίζει τα επιµέρους γινόµενα Α1..i και Αi +
1..n και θα τα πολλαπλασιάζει για να υπολογίσει το γινόµενο Α1…n. Ο αριθµός των πολ-
λαπλασιασµών στοιχείων για τον υπολογισµό του γινοµένου Α1…n είναι ίσος µε d0 ¥ di
¥ dn συν τον αριθµό των πολλαπλασιασµών για τον υπολογισµό των Α1…i και Αi + 1…n
. Εποµένως, αν το Α1…n υπολογίζεται µε βέλτιστο τρόπο, και τα Α1…i και Αi + 1…n πρέ-
πει να υπολογίζονται µε βέλτιστο τρόπο. ∆ιαφορετικά, αν υπήρχε καλύτερος τρόπος
υπολογισµού για κάποιο από τα Α1…i και Αi + 1…n, θα χρησιµοποιούσαµε αυτόν τον τρόπο
για να βελτιώσουµε τον αριθµό των πολλαπλασιασµών στον υπολογισµό του Α1…n.
Για παράδειγµα, ας θεωρήσουµε πάλι το στιγµιότυπο που αποτελείται από τέσσερις
πίνακες Α1, Α2, Α3, και Α4, διαστάσεων 13 ¥ 5, 5 ¥ 89, 89 ¥ 3 και 3 ¥ 34. Είδαµε ότι
η βέλτιστη λύση για αυτό το στιγµιότυπο διαιρεί την ακολουθία στη θέση 3, υπολο-
γίζοντας πρώτα το Α1…3 και, στη συνέχεια, το Α1…3 Α4. Ο υπολογισµός του Α1…3 Α4
απαιτεί 1.326 πολλαπλασιασµούς στοιχείων, ενώ υπάρχουν δύο τρόποι να υπολογι-
σθεί το Α1…3. Ο πρώτος είναι Α1…2 Α3 και απαιτεί 9.256 πολλαπλασιασµούς στοιχεί-
94 K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™

ων, ενώ ο δεύτερος είναι Α1Α2…3 και απαιτεί 1.530 πολλαπλασιασµού στοιχείων. Η
λύση που χρησιµοποιεί τον πρώτο τρόπο υπολογίζει (Α1…2Α3)Α4 εκτελώντας 10.582
πολλαπλασιασµούς στοιχείων. Η βέλτιστη λύση χρησιµοποιεί τον βέλτιστο τρόπο
για τον υπολογισµό του Α1….3, ο οποίος είναι ο δεύτερος, και υπολογίζει το (Α1 Α2…3)Α4
εκτελώντας 2.856 πολλαπλασιασµούς στοιχείων.
Κάθε βέλτιστη λύση για ένα στιγµιότυπο περιέχει / αποτελείται από τις βέλτιστες
λύσεις συγκεκριµένων επιµέρους στιγµιότυπων. Αυτό ονοµάζεται ιδιότητα βέλτι-
στων επιµέρους δοµών (optimal substructure) ή αρχή των βέλτιστων επιµέρους λύσε-
ων (principle of optimality) και αποτελεί µια χαρακτηριστική ιδιότητα των προβλη-
µάτων στα οποία εφαρµόζεται ο δυναµικός προγραµµατισµός.
Το επόµενο βήµα είναι, εκµεταλλευόµενοι την ιδιότητα των βέλτιστων επιµέρους
δοµών, να διατυπώσουµε µια αναδροµική εξίσωση που θα περιγράφει τη βέλτιστη
λύση. Έστω m[i, j] ο ελάχιστος αριθµός πολλαπλασιασµών στοιχείων που απαιτού-
νται για τον υπολογισµό του γινοµένου Αi…j. Προφανώς, για κάθε 1 £ i £ n, m[i, i] =
0, αφού Αi…i = Ai που είναι ένας µεµονωµένος πίνακας. Η ιδιότητα των βέλτιστων
επιµέρους δοµών υποδεικνύει ότι ο βέλτιστος υπολογισµός του Αi..j γίνεται υπολο-
γίζοντας τα Ai…k και Ak + 1…j, για κάποιο i £ k < j, µε βέλτιστο τρόπο και πολλαπλα-
σιάζοντας τα επιµέρους γινόµενα Αi..kAk + 1…j. Εποµένως,
m[i,j] = m[j,k] + m[k + 1, j] + di–1dkdj .
Επειδή δεν γνωρίζουµε το σηµείο k στο οποίο πρέπει να διαιρέσουµε την ακολου-
θία πινάκων Ai, …, Aj, και υπάρχουν µόνο j – i πιθανές τιµές για το k (k = i, i + 1, …,
j – 1), µπορούµε να υπολογίσουµε το m[i, j] για όλες τις τιµές του k και να διαλέ-
ξουµε την καλύτερη. ∆ηλαδή, ο βέλτιστος αριθµός πολλαπλασιασµών στοιχείων m[i,
j] για τον υπολογισµό του Αi…j δίνεται από την αναδροµική εξίσωση:

ÏÔ0 αν i = j
m[i, j] = Ì
min{m[i, k ] + m[ k + 1, j] + di -1d k d j } αν i < j
ÔÓi £ k < j

Το ζητούµενο είναι ο υπολογισµός του m[1, n], δηλαδή του ελάχιστου αριθµού πολ-
λαπλασιασµών στοιχείων που απαιτούνται για τον υπολογισµό του γινοµένου Α1…n.
Ο υπολογισµός του m[1, n] απαιτεί τον υπολογισµό των ποσοτήτων m[i, j], για όλες
n(n +1)
τις τιµές 1 £ i < j £ n. ∆ηλαδή έχουµε να λύσουµε επιµέρους προβλήµατα,
2
καθένα από τα οποία µπορεί να λυθεί σε γραµµικό χρόνο.
Για να υπολογίσουµε το m[1, n] εφαρµόζουµε τη µέθοδο του δυναµικού προγραµ-
4.1 ¶√§§∞¶§∞™π∞™ª√™ ∞∫√§√À£π∞™ ¶π¡∞∫ø¡ 95

µατισµού. Λύνουµε πρώτα τα µικρότερα σε µέγεθος επιµέρους προβλήµατα και χρη-


σιµοποιούµε τις λύσεις τους για να επιλύσουµε όλο και µεγαλύτερα επιµέρους προ-
βλήµατα. Κάθε φορά που λύνουµε κάποιο επιµέρους πρόβληµα, αποθηκεύουµε τη
λύση του, ώστε να µη χρειαστεί να το λύσουµε πάλι στη συνέχεια. Αυτή η µέθοδος
υλοποιείται από τον παρακάτω ψευδοκώδικα:
MATRIX – CHAIN – MULT(d[0,...,n])
{ ∆√ ¢π∞¡À™ª∞ d ¶∂ƒπ∂Ã∂π ∆π™ ¢π∞™∆∞™∂π™ ∆ø¡ ¶π¡∞∫ø¡ }
for i ¨ 1 to n do
m[i, i] ¨ 0;
for p ¨ 2 to n do
for i ¨ 1 to n – p + 1 do
j ¨ i + p – 1;
m[i, j] ¨ • ;
for k ¨ i to j – 1 do
q ¨ m[i, k] + m[k + 1, j] + d[i – 1]d[k]d[j];
if q < m[i, j] then m[i, j] ¨ q;
return m[1, n];
Σε κάθε επανάληψη του βασικού for – βρόγχου, ο οποίος σχετίζεται µε τη µεταβλητή
p, ο παραπάνω ψευδοκώδικας υπολογίζει τις τιµές m[i, j] για όλα τα 1 £ i < j £ n που
διαφέρουν ακριβώς p – 1 µεταξύ τους (j – i = p – 1). Επειδή η τιµή του k κυµαίνεται
πάντα µεταξύ i και j – 1, σε κανένα σηµείο δεν χρησιµοποιούνται τιµές m[i, k] και m[k
+ 1, j] οι οποίες δεν έχουν υπολογιστεί σε προηγούµενες επαναλήψεις. Το σώµα του
n(n +1)
δεύτερου for – βρόγχου που σχετίζεται µε τη µεταβλητή i εκτελείται φορές,
2
ενώ ο χρόνος εκτέλεσής του είναι Ο(n). Εποµένως, ο χρόνος εκτέλεσης του παραπά-
νω αλγορίθµου είναι Ο(n3). Επίσης, ο αλγόριθµος χρησιµοποιεί Θ(n2) θέσεις µνήµης,
αφού υπολογίζει και αποθηκεύει τα στοιχεία m[i, j], για κάθε 1 £ i < j £ n.

¢Ú·ÛÙËÚÈfiÙËÙ· 4.1

Παρουσιάστε τη λειτουργία της διαδικασίας MATRIX – CHAIN – MULT για το διάνυ-


σµα διαστάσεων d = [30, 35, 15, 5, 10, 20, 25].
96 K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™

¢Ú·ÛÙËÚÈfiÙËÙ· 4.2

Περιγράψτε (σε µορφή ψευδοκώδικα) ένα αναδροµικό αλγόριθµο που υπολογίζει


το m[1, n] από την αναδροµική εξίσωση που περιγράφει τις τιµές m[i, j]. Ποιος
είναι ο χρόνος εκτέλεσης του αλγορίθµου;

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 4.1

Ο αλγόριθµος MATRIX – CHAIN – MULT επιστρέφει µόνο τη βέλτιστη τιµή m[1, n]


για τον αριθµό των πολλαπλασιασµών στοιχείων που απαιτούνται για τον υπολο-
γισµό του γινοµένου Α1..n. Να τροποποιήσετε τον αλγόριθµο ώστε να είναι δυνατή
η ανακατασκευή µίας βέλτιστης λύσης, και να γράψετε τον ψευδοκώδικα µιας δια-
δικασίας η οποία θα υπολογίζει το γινόµενο A1..n, χρησιµοποιώντας ακριβώς m[1,
n] πολλαπλασιασµούς µεταξύ στοιχείων των πινάκων.

4.2 ÷ڷÎÙËÚÈÛÙÈο ÙÔ˘ ‰˘Ó·ÌÈÎÔ‡ ÚÔÁÚ·ÌÌ·ÙÈÛÌÔ‡

Στην προηγούµενη ενότητα είδαµε ότι ένα από τα χαρακτηριστικά των προβληµά-
των στα οποία εφαρµόζεται ο δυναµικός προγραµµατισµός είναι η ιδιότητα των βέλ-
τιστων επιµέρους δοµών. Ο αναδροµική εξίσωση περιγραφής της βέλτιστης λύσης,
συνήθως, βασίζεται στην ιδιότητα των βέλτιστων επιµέρους δοµών. Έτσι, η ύπαρ-
ξη της ιδιότητας των βέλτιστων επιµέρους δοµών για ένα πρόβληµα αποτελεί ικα-
νοποιητική ένδειξη ότι ο δυναµικός προγραµµατισµός εφαρµόζεται σε αυτό.
Ένα άλλο χαρακτηριστικό των προβληµάτων στα οποία εφαρµόζεται ο δυναµικός
προγραµµατισµός, είναι ο σχετικά µικρός αριθµός των διαφορετικών επιµέρους προ-
βληµάτων, τα οποία εµφανίζονται κατά την εφαρµογή της µεθόδου. Με τον όρο
«σχετικά µικρός», συνήθως, εννοούµε έναν αριθµό επιµέρους προβληµάτων που
φράσσεται άνω από κάποιο πολυώνυµο του µεγέθους της εισόδου, δηλαδή είναι
Ο(nd), δια κάποια σταθερά d > 0. Όταν ένας αναδροµικός, «διαίρει και βασίλευε»
αλγόριθµος, αντί να δηµιουργεί συνεχώς νέα επιµέρους προβλήµατα, δηµιουργεί και
λύνει τα ίδια επιµέρους προβλήµατα, πολλές φορές, λέµε ότι το πρόβληµα περιέχει
επικαλυπτόµενα επιµέρους προβλήµατα (overlapping subproblems). Σε αντίθεση µε
τον αναδροµικό αλγόριθµο, ο δυναµικός προγραµµατισµός εκµεταλλεύεται την ιδιό-
τητα των επικαλυπτόµενων προβληµάτων, λύνοντας κάθε επιµέρους πρόβληµα ακρι-
βώς µία φορά και αποθηκεύοντας τις λύσεις για µελλοντική αναφορά. Εποµένως,
όταν ο αριθµός των διαφορετικών επιµέρους προβληµάτων είναι µικρός, και υπάρ-
χουν επικαλυπτόµενα επιµέρους προβλήµατα, τότε είναι πολύ πιθανόν η εφαρµογή
του δυναµικού προγραµµατισµού να δώσει έναν αποδοτικό αλγόριθµο.
4 . 2 à ∞ ƒ ∞ ∫ ∆ ∏ ƒ π ™ ∆ π ∫ ∞ ∆ √ À ¢ À ¡ ∞ ª π ∫ √ À ¶ ƒ √ ° ƒ∞ ª ª ∞ ∆ π ™ ª √ À 97

Το πρόβληµα του πολλαπλασιασµού ακολουθίας πινάκων έχει την ιδιότητα των επι-
καλυπτόµενων επιµέρους προβληµάτων. Το Σχήµα 4.1 δείχνει τις παραµέτρους i και
j των κλήσεων του αναδροµικού αλγορίθµου της ∆ραστηριότητας 4.2 για n = 4.
Παρατηρήστε ότι τα προβλήµατα που σηµειώνονται µε γκρίζο χρώµα έχουν ήδη
λυθεί σε προηγούµενες κλήσεις του αλγορίθµου. Στην περίπτωση του δυναµικού
προγραµµατισµού, αυτές οι κλήσεις αντικαθιστώνται από την απλή ανάγνωση µιας
θέσης στον πίνακα των επιµέρους λύσεων.
1...4

1...1 2...4 1...2 3...4 1...3 4...4

2...2 3...4 2...3 4...4 1...1 2...2 3...3 4...4 1...1 2...3 1...2 3...3

3...3 4...4 2...2 3...3 2...2 3...3 1...1 2...2

™¯‹Ì· 4.1
Είναι συχνά δυνατόν να συνδυαστεί η αποδοτικότητα του δυναµικού προγραµµατι-
Οι κλήσεις
σµού µε την ευκολία στο σχεδιασµό που προσφέρει η µέθοδος «διαίρει και βασί-
του αναδροµικού
λευε», η οποία προχωρεί από µεγαλύτερα προς ολοένα µικρότερα επιµέρους προ-
αλγορίθµου
βλήµατα (top – down στρατηγική). Η ιδέα είναι να χρησιµοποιήσουµε έναν πίνακα υπολογισµού
επιµέρους λύσεων, αλλά η στρατηγική για τη συµπλήρωση αυτού του πίνακα να του m[1, 4].
µιµείται την πορεία του αναδροµικού αλγορίθµου. Αρχικά, κάθε στοιχείο του πίνα-
κα περιέχει µία ειδική τιµή, η οποία δηλώνει ότι το αντίστοιχο επιµέρους πρόβληµα
δεν έχει επιλυθεί ακόµη. Όταν ο αναδροµικός αλγόριθµος δηµιουργήσει και επιλύ-
σει το επιµέρους πρόβληµα για πρώτη φορά, αποθηκεύουµε τη λύση στον πίνακα
των επιµέρους λύσεων. Κάθε φορά που εµφανίζεται το ίδιο επιµέρους πρόβληµα,
αντί να το λύσουµε πάλι, όπως θα έκανε ο αναδροµικός αλγόριθµος, ανατρέχουµε
στην αντίστοιχη εγγραφή του πίνακα των επιµέρους λύσεων, σύµφωνα µε τις επι-
ταγές του δυναµικού προγραµµατισµού. Αυτή η τεχνική ονοµάζεται memoization.
Οι παρακάτω διαδικασίες αποτελούν την εφαρµογή αυτής της τεχνικής στο πρό-
βληµα του πολλαπλασιασµού ακολουθίας πινάκων.
MEMOIZED_MATRIX_CHAIN(d[0,...,n])

for i ¨ 1 to n do
for j ¨ 1 to n do
m[i,j] ¨ •;
return LOOKUP_CHAIN(d[0,...,n], 1, n);
98 K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™

LOOKUP_CHAIN(d[i – 1,...,j], i, j)
if m[i,j] < • then return m[i,j];
if i = j then m[i, j] = 0;
else
for k ¨ i to j – 1 do
q ¨ LOOKUP_CHAIN(d[i – 1,...,k], i, k) +
LOOKUP_CHAIN(d[k,...j], k + 1,j) +
d[i – 1]d[k]d[j];
if q < m[i,j] then m[i,j] ¨ q;
return m[i,j];
Η διαδικασία MEMOIZED_MATRIX_CHAIN, όπως και η MATRIX_CHAIN_MULT, χρησιµο-
ποιεί έναν πίνακα επιµέρους λύσεων m[1…n, 1…n], το στοιχείο m[i, j] του οποίου
περιέχει τον ελάχιστο αριθµό πολλαπλασιασµών για τον υπολογισµό του γινοµένου
Αi..j. Η MEMOIZED_MATRIX_CHAIN αρχικοποιεί όλες τις εγγραφές του πίνακα m στην
ειδική τιµή •, και καλεί την αναδροµική διαδικασία LOOKUP_CHAIN, η οποία υπο-
λογίζει τα στοιχεία του πίνακα m. Η LOOKUP_CHAIN λειτουργεί µε τον ίδιο τρόπο
όπως ο αναδροµικός αλγόριθµος της ∆ραστηριότητας 4.2, εκτός τις περιπτώσεις που
εµφανίζονται επιµέρους προβλήµατα, που έχουν εµφανιστεί πάλι στο παρελθόν. Τότε,
η lookup_chain δεν λύνει το πρόβληµα, αλλά επιστρέφει την τιµή της λύσης που δια-
βάζει από την αντίστοιχη θέση του πίνακα επιµέρους λύσεων.
Ο χρόνος εκτέλεσης της διαδικασίας MEMOIZED_MATRIX_CHAIN είναι Ο(n3). Οι Θ(n2)
θέσεις του πίνακα m αρχικοποιούνται από τη διαδικασία MEMOIZED_MATRIX_CHAIN.
Κάθε θέση m[i, j], 1 £ i < j £ n συµπληρώνεται µε την τιµή της αντίστοιχης επιµέ-
ρους λύσης µόνο µία φορά, από την (πρώτη) κλήση της LOOKUP_CHAIN(d[i – 1,…,j],
i, j). Ο χρόνος εκτέλεσης αυτής της κλήσης της LOOKUP_CHAIN είναι Ο(n).

4.3 ªÂÁ·Ï‡ÙÂÚË ÎÔÈÓ‹ ˘·ÎÔÏÔ˘ı›·

Σε αυτή την ενότητα θα εφαρµόσουµε τη µέθοδο του δυναµικού προγραµµατισµού


για τον υπολογισµό της µεγαλύτερης κοινής υπακολουθίας (longest common
subsequence) δύο ακολουθιών.

∆εδοµένης µιας ακολουθίας Χ, κάθε ακολουθία Ζ που προκύπτει από τη διαγραφή


κανενός ή περισσοτέρων στοιχείων της Χ είναι υπακολουθία της Χ. Τυπικά, δεδο-
µένης µιας ακολουθίας Χ = <x1, x2, …, xn>, µια άλλη ακολουθία Z = <z1, z2, …, zk>
είναι υπακολουθία (subsequence) της Χ, αν υπάρχει µια γνήσια αύξουσα ακολουθία
4 . 3 ª ∂ °∞ § À ∆ ∂ ƒ ∏ ∫ √ π ¡ ∏ À ¶ ∞ ∫ √ § √ À £ π ∞ 99

<i1, i2, …, ik> δεικτών της Χ, τέτοια ώστε, για κάθε j = 1, 2, …, k, xi j = z j . Για παρά-
δειγµα, η ακολουθία Ζ = <Β, Γ, ∆, Β> αποτελεί υπακολουθία της Χ = <Α, Β, Γ, Β, ∆,
Α, Β> µε αντίστοιχη ακολουθία δεικτών <2, 3, 5, 7,>.
∆εδοµένων δύο ακολουθιών x και Υ, µια ακολουθία Ζ αποτελεί κοινή υπακολουθία
(common subsequence) των Χ και Υ, αν η Ζ είναι υπακολουθία τόσο της Χ όσο και
της Υ. Για παράδειγµα, αν Χ = <Α, Β, Γ, Β, ∆, Α, Β> και Υ = <Β, ∆, Γ, Α, Β, Α>, η ακο-
λουθία Ζ = <Β, Γ, Α> είναι µία κοινή υπακολουθία των Χ και Υ. Όµως, η ακολουθία
Ζ δεν είναι η µεγαλύτερη κοινή υπακολουθία των Χ και Υ, αφού έχει µήκος 3, ενώ η
ακολουθία Ζ¢ = <Β, Γ, Β, Α> είναι επίσης κοινή υπακολουθία των Χ και Υ και έχει
µήκος 4. Η ακολουθία Ζ¢ είναι η µεγαλύτερη κοινή υπακολουθία των Χ και Υ, αφού
δεν υπάρχει κοινή υπακολουθία των Χ και Υ µε µήκος µεγαλύτερο ή ίσο του 5.
Το πρόβληµα της µεγαλύτερης κοινής υπακολουθίας είναι, δεδοµένων δύο ακολου-
θιών Χ = <x1, x2, …, xn> και Υ = <y1, y2, …, ym>, να βρεθεί µια µεγίστου µήκους,
κοινή υπακολουθία των Χ και Υ. Η µεγαλύτερη κοινή υπακολουθία των x και Υ συµ-
βολίζεται µε LCS(X, Y), ενώ το µήκος της συµβολίζεται µε |LCS(X, Y)|. Από τον ορι-
σµό, γίνεται φανερό ότι το πρόβληµα της µεγαλύτερης κοινής υπακολουθίας είναι
ένα πρόβληµα βελτιστοποίησης.
Μία απλοϊκή προσέγγιση στο πρόβληµα είναι να παράγουµε, µε κάποιο συστηµατι-
κό τρόπο, όλες τις υπακολουθίες της Χ, να ελέγξουµε ποιες από αυτές είναι υπακο-
λουθίες της Υ και να επιστρέψουµε αυτή µε το µεγαλύτερο µήκος. Υπάρχουν ακρι-
βώς 2n υπακολουθίες της Χ, εποµένως, αυτή η προσέγγιση απαιτεί εκθετικό χρόνο.
Επιδιώκοντας να εφαρµόσουµε τη µέθοδο του δυναµικού προγραµµατισµού σε αυτό
το πρόβληµα, θα προσπαθήσουµε να χαρακτηρίσουµε τη δοµή µιας βέλτιστης λύσης.
Έστω Ζ = <z1, z2, …, zk> µία βέλτιστη κοινή υπακολουθία των x και Υ. Αν τα τελευ-
ταία στοιχεία των ακολουθιών x και Y ταυτίζονται, δηλαδή xn = ym, το τελευταίο στοι-
χείο της Ζ θα είναι zk = xn = ym και, ενώ τα υπόλοιπα στοιχεία της Ζ θα είναι τα στοι-
χεία της LCS(Χn – 1, Υm – 1), όπου Xn – 1 και Ym – 1 είναι τα προθέµατα µήκους n – 1 και
m – 1 των ακολουθιών x και Υ, αντίστοιχα.
Αν τα στοιχεία xn και ym είναι διαφορετικά, τότε το xn ή το ym δεν θα συµπεριληφθεί
στην κοινή υπακολουθία Ζ. Σε αυτή την περίπτωση, η κοινή υπακολουθία Ζ θα είναι
η µεγαλύτερη σε µήκος από τις LCS(Χn – 1, Υ), και LCS(X, Ym – 1). ∆ηλαδή, µη ξέρο-
ντας ποιο από τα xn και ym δεν θα συµπεριληφθεί στην Ζ, δοκιµάζουµε και τις δύο
περιπτώσεις και κρατάµε την καλύτερη.
Βλέπουµε ότι το πρόβληµα της µεγαλύτερης κοινής υπακολουθίας έχει την ιδιότη-
100 K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™

τα των βέλτιστων επιµέρους δοµών, αφού κάθε βέλτιστη λύση για το στιγµιότυπο
(Χ, Υ) περιέχει τη βέλτιστη λύση ενός από τα επιµέρους στιγµιότυπα (Xn – 1, Ym – 1),
(Χn – 1, Y) ή (X, Ym – 1).
Για παράδειγµα, έστω οι ακολουθίες Χ = <Α, Β, Γ, ∆, Ε> και Υ = <Β, ∆, Ε, Α>. Θα
προσπαθήσουµε να καταλήξουµε στη βέλτιστη λύση εφαρµόζοντας την ιδιότητα των
βέλτιστων επιµέρους δοµών. Τα τελευταία στοιχεία των Χ και Υ είναι διαφορετικά,
άρα, η βέλτιστη κοινή υπακολουθία τους θα είναι η µεγαλύτερη από τις βέλτιστες
κοινές υπακολουθίες των στιγµιότυπων (Χ4 = <Α, Β, Γ, ∆>, Υ) και (Χ, Υ3 = <Β, ∆,
Ε>.) Το τελευταίο στοιχείο του δεύτερου ζευγαριού είναι κοινό, άρα, η βέλτιστη
κοινή υπακολουθία των <Α, Β, Γ, ∆, Ε> και <Β, ∆, Ε> θα έχει τελευταίο στοιχείο το
Ε, και πρόθεµα τη βέλτιστη κοινή υπακολουθία των <Α, Β, Γ, ∆> και <Β, ∆>. Οι κοι-
νές υπακολουθίες των <Α, Β, Γ, ∆> και <Β, ∆> είναι οι < > (κενή), <Β>, <∆> και <Β,
∆>. Είναι προφανές ότι, επιλέγοντας κάποια από τις < >, <Β> ή <∆>, αποµακρυνό-
µαστε από την περίπτωση να καταλήξουµε σε βέλτιστη λύση για το αρχικό στιγµιό-
τυπο. Επιλέγοντας τη <Β, ∆>, η οποία είναι η βέλτιστη κοινή υπακολουθία για το
στιγµιότυπο (<Α, Β, Γ, ∆>, <Β, ∆>), καταλήγουµε στην <Β, ∆, Ε>, που είναι η βέλ-
τιστη κοινή υπακολουθία των <Α, Β, Γ, ∆, Ε> και <Β, ∆, Ε>. Η <Β, ∆, Ε> είναι και
η µεγαλύτερη κοινή υπακολουθία των Χ και Υ.
Με βάση τις παραπάνω παρατηρήσεις µπορούµε να διατυπώσουµε την αναδροµική
εξίσωση που δίνει το µήκος της µεγαλύτερης κοινής υπακολουθίας των x και Υ. Έστω
c[i, j] το µήκος της µεγαλύτερης κοινής υπακολουθίας των ακολουθιών Xi και Yj.
Προφανώς, αν κάποια από τις Xi,Yj είναι κενή, κάθε κοινή υπακολουθία τους θα είναι
κενή και c[i, j] = 0. Εποµένως, τα στοιχεία c[i, j], i = 1, 2, …, n, j = 1, 2, …, m, δίνο-
νται από την αναδροµική εξίσωση:

Ï0 αν i = 0 ή j = 0
Ô
c[i, j] = Ìc[i - 1, j - 1] + 1 αν i, j > 0 κ αι xi = y j
Ômax{ c[i, j - 1], c[i - 1, j]} αν i, j > 0 κ αι x π y
Ó i j

¢Ú·ÛÙËÚÈfiÙËÙ· 4.3

Περιέχει το πρόβληµα της µεγαλύτερης κοινής υπακολουθίας επικαλυπτόµενα επι-


µέρους προβλήµατα; Τεκµηριώστε την απάντησή σας.

Παρατηρούµε ότι, στην περίπτωση xi π yj, η τιµή της θέσης c[i, j] εξαρτάται από τις
τιµές των c[i, j – 1] και c[i – 1, j]. Ακόµη, αν xi π yj – 1και xi – 1 π yj, οι τιµές των θέσε-
ων c[i, j – 1] και c[i – 1, j] εξαρτώνται από την τιµή της θέσης c[i – 1, j – 1].
4 . 3 ª ∂ °∞ § À ∆ ∂ ƒ ∏ ∫ √ π ¡ ∏ À ¶ ∞ ∫ √ § √ À £ π ∞ 101

Έχοντας καταλήξει στην παραπάνω αναδροµική εξίσωση, µπορούµε να υπολογί-


σουµε το µήκος της µεγαλύτερης κοινής ακολουθίας c[n, m] υπολογίζοντας τα στοι-
χεία του πίνακα c[1..n, 1..m], αρχίζοντας από τα µικρότερα σε µέγεθος επιµέρους
προβλήµατα (bottom – up στρατηγική). Ο παρακάτω ψευδοκώδικας αποτελεί την
υλοποίηση ενός αλγορίθµου δυναµικού προγραµµατισµού για το πρόβληµα της µεγα-
λύτερης κοινής υπακολουθίας.
LCS – LENGTH(X, Y)
n ¨ length(X); m ¨ length(Y);
for i ¨ 1 to n do c[i, 0] ¨ 0;
for j ¨ 1 to m do c[0, j] ¨ 0;
for i ¨ 1 to n do
for j ¨ 1 to m do
if xi = yi then
c[i, j] ¨ c[i – 1, j – 1] + 1;
else
if c[i – 1, j] ≥ c[i, j – 1] then
c[i, j] = c[i – 1, j];
else
c[i, j] = c[i, j – 1];
return c[n, m];

¢Ú·ÛÙËÚÈfiÙËÙ· 4.4

Περιγράψτε τη λειτουργία της διαδικασίας LCS – LENGTH για τις ακολουθίες Χ =


<Α, Β, Γ, Β, ∆, Α, Β> και Υ = <Β, ∆, Γ, Α, Β, Α,>.

Η διαδικασία LCS – LENGTH επιστρέφει το µήκος της µεγαλύτερης κοινής υπό – ακο-
λουθίας δύο ακολουθιών Χ και Υ, µήκους n και m, αντίστοιχα. Ο χρόνος εκτέλεσης
της διαδικασίας LCS – LENGTH είναι Θ(nm), αφού ο πίνακας c[1 … n, 1 … m] έχει
nm στοιχεία, και κάθε στοιχείο του υπολογίζεται µόνο µία φορά, σε Θ(1) χρόνο.
Επίσης, ο αριθµός των θέσεων µνήµης που απαιτεί η διαδικασία LCS – LENGTH είναι
Θ(nm), αφού υπολογίζει όλα τα nm στοιχεία του πίνακα c[1 … n, 1 … m]. Παρατη-
ρούµε όµως ότι, καθώς η LCS – LENGTH υπολογίζει τα στοιχεία c[i, j] κατά γραµµές
(i = 1, 2, …, n), ο υπολογισµός κάθε στοιχείου c[i, j] χρησιµοποιεί στοιχεία είτε της
ίδιας (c[i, j – 1]), είτε της προηγούµενης γραµµής (c[i – 1, j] και c[i – 1, j – 1]). Επο-
µένως, προκειµένου για τον υπολογισµό του στοιχείου c[n, m], σε κάθε επανάληψη
102 K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™

i, ο αλγόριθµος χρειάζεται να αποθηκεύει µόνο τα στοιχεία των γραµµών i και i – 1.


Άρα, αν θεωρήσουµε ότι για την αρίθµηση των γραµµών του πίνακα c χρησιµοποι-
ούµε πάντα το µικρότερο από τα µήκη n και m, ο αριθµός των θέσεων µνήµης της
διαδικασίας LCS – LENGTH µπορεί να βελτιωθεί σε 2min{n, m} + O(1).
Ο αριθµός των θέσεων µνήµης που χρησιµοποιεί η LCS – LENGTH µπορεί να βελτιω-
θεί σε min{n, m} + O(1), παρατηρώντας ότι, σε κάθε επανάληψη i, µπορούµε να απο-
θηκεύουµε όλη την απαραίτητη πληροφορία σε µία µόνο γραµµή του πίνακα c και
µερικές προσωρινές θέσεις µνήµης. Για τον υπολογισµό του στοιχείου c[i, j] χρησι-
µοποιούνται µόνο οι τρεις γειτονικές θέσεις c[i – 1, j – 1], c[i – 1, j] και c[i, j – 1]. Μετά
τον υπολογισµό του c[i, j], η τιµή του c[i – 1, j – 1] δεν θα χρησιµοποιηθεί πάλι, οπότε
η τιµή c[i, j – 1] µπορεί να πάρει τη θέση της. Η τιµή c[i, j] µπορεί να αποθηκευθεί σε
µία προσωρινή θέση µνήµης (στη θέση που ήταν αποθηκευµένη η c[i, j – 1]) και να
περιµένει τον υπολογισµό της c[i + 1, j], για να πάρει τη θέση της c[i – 1, j].
Συµπερασµατικά, οι αλγόριθµοι δυναµικού προγραµµατισµού έχουν συχνά µεγάλες
απαιτήσεις σε αριθµό θέσεων µνήµης, αφού χρειάζεται να αποθηκεύουν τις λύσεις
όλων των διαφορετικών επιµέρους προβληµάτων. Όµως, η προσεκτική µελέτη της
δοµής της αναδροµικής εξίσωσης µπορεί να συντελέσει στη σηµαντική µείωση των
απαιτούµενων θέσεων µνήµης, ειδικά στην περίπτωση που υπολογίζεται µόνο η βέλ-
τιστη τιµή. Η βελτίωση του αριθµού των θέσεων µνήµης είναι συνήθως δυσκολότερο
να επιτευχθεί όταν πρέπει να υπολογιστεί µια βέλτιστη λύση, γιατί αυτό συνήθως απαι-
τεί την αποθήκευση των καλύτερων επιλογών για κάθε επανάληψη του αλγορίθµου.

¢Ú·ÛÙËÚÈfiÙËÙ· 4.5

Γράψτε µια διαδικασία η οποία, χρησιµοποιώντας τα στοιχεία του πίνακα c, τυπώ-


νει σε χρόνο Θ(n + m) µια βέλτιστη κοινή υπακολουθία δύο ακολουθιών x και Υ.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 4.2

Θεωρείστε το πρόβληµα της µεγαλύτερης κοινής υπακολουθίας για τρεις ακολου-


θίες εισόδου Χ = <x1, …, xn>, Υ = <y1, …, ym> και Z = <z1, …, zp>. Σε αυτή την
περίπτωση, θέλουµε να υπολογίσουµε το µήκος της µεγαλύτερης ακολουθίας W,
η οποία είναι υπακολουθία των Χ, Υ και Z. ∆ώστε έναν αλγόριθµο δυναµικού προ-
γραµµατισµού ο οποίος θα υπολογίζει το µήκος της µεγαλύτερης κοινής υπακο-
λουθίας τριών ακολουθιών µε top – down / memoized τρόπο. Ποιος είναι ο χρόνος
εκτέλεσης του αλγορίθµου;
™YNOæH 103

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 4.3

Έστω Χ[1…n] και Υ[1…m] δύο συµβολοσειρές. Η συµβολοσειρά Χ πρέπει να


µεταβληθεί ώστε να γίνει ίδια µε την Υ. Επιτρέπεται µόνο η µεταβολή της Χ µε τους
ακόλουθους τρόπους: διαγραφή χαρακτήρα (κόστος d), προσθήκη χαρακτήρα
(κόστος b) και αντικατάσταση χαρακτήρα (κόστος h). Περιγράψτε έναν αλγόριθ-
µο δυναµικού προγραµµατισµού για τον υπολογισµό του ελάχιστου κόστους µετα-
τροπής της συµβολοσειράς Χ στην Υ. Ποιος είναι ο χρόνος εκτέλεσης του αλγο-
ρίθµου και ποιος ο ελάχιστος αριθµός θέσεων µνήµης;

™‡ÓÔ„Ë
Σε αυτό το κεφάλαιο παρουσιάσαµε τη µέθοδο του δυναµικού προγραµµατισµού για
την επίλυση προβληµάτων βελτιστοποίησης. Ένα πρόβληµα βελτιστοποίησης δέχεται
πολλές διαφορετικές λύσεις, σε καθεµία από τις αντιστοιχεί µία τιµή. Το ζητούµενο
είναι ο υπολογισµός της λύσης µε την βέλτιστη τιµή.
Η µέθοδος του δυναµικού προγραµµατισµού επιλύει ένα πρόβληµα βελτιστοποίησης
συνδυάζοντας τις βέλτιστες λύσεις κατάλληλα επιλεγµένων επιµέρους προβληµάτων.
Ο δυναµικός προγραµµατισµός εφαρµόζεται σε προβλήµατα µε την ιδιότητα των βέλ-
τιστων επιµέρους δοµών, όπου κάθε βέλτιστη λύση περιέχει τις βέλτιστες λύσεις
συγκεκριµένων επιµέρους προβληµάτων. Αυτή η ιδιότητα επιτρέπει τη διατύπωση της
αναδροµικής εξίσωσης για το κόστος µιας βέλτιστης λύσης. Η αναδροµική εξίσωση
αποτελεί τη βάση του αλγορίθµου δυναµικού προγραµµατισµού.
Ο αλγόριθµος δυναµικού προγραµµατισµού υπολογίζει µε bottom – up τρόπο όλες
τις τιµές της συνάρτησης που περιγράφεται από την αναδροµική εξίσωση, µέχρι να
φτάσει στην τιµή που αντιστοιχεί στην βέλτιστη λύση. Ένας αλγόριθµος δυναµικού
προγραµµατισµού πλεονεκτεί σηµαντικά σε χρόνο εκτέλεσης ενός αλγορίθµου «διαί-
ρει και βασίλευε», ο οποίος υπολογίζει µε top – down τρόπο την ίδια συνάρτηση, όταν
το πρόβληµα έχει την ιδιότητα των επικαλυπτόµενων επιµέρους προβληµάτων. Σε
αυτή την περίπτωση, ο δυναµικός προγραµµατισµός επιλύει κάθε διαφορετικό επι-
µέρους πρόβληµα µία φορά και αποθηκεύει τη λύση για µελλοντική αναφορά, ενώ ο
αλγόριθµος «διαίρει και βασίλευε» επιλύει κάθε επιµέρους πρόβληµα πολλές φορές.
Μερικές φορές χρησιµοποιούµε memoized αλγόριθµους, οι οποίοι συνδυάζουν τον top
– down τρόπο υπολογισµού µιας αναδροµικής εξίσωσης µε την αποθήκευση των λύσε-
ων των επιµέρους προβληµάτων, ώστε κάθε πρόβληµα να λυθεί µία και µόνη φορά.
104 K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™

Σε αυτό το κεφάλαιο είδαµε παραδείγµατα εφαρµογής δυναµικού προγραµµατισµού


για την επίλυση των προβληµάτων:
Πολλαπλασιασµού ακολουθίας πινάκων, όπου ψάχνουµε τη σειρά µε την οποία πρέ-
πει να υπολογιστεί το γινόµενο µιας ακολουθίας πινάκων, ώστε να ελαχιστοποιηθεί
ο αριθµός των πολλαπλασιασµών µεταξύ των στοιχείων τους.
Μεγαλύτερης κοινής υπακολουθίας, όπου δεδοµένων δύο ακολουθιών Χ και Υ,
ψάχνουµε την µεγαλύτερη σε µήκος ακολουθία Ζ, η οποία είναι υπακολουθία τόσο
της Χ όσο και της Υ.

µÈ‚ÏÈÔÁÚ·Ê›·

Η µέθοδος του δυναµικού προγραµµατισµού παρουσιάζεται πολύ καλά στο:


[1] T.H. Cormen, C.E. Leiserson και R. L. Rivest. Introduction to Algorithms. MIT
Press, 1990.
Μία εκτενής παρουσίαση της µεθόδου γίνεται στο:
[2] R. Bellman. Dynamic Programming. Princeton University Press, 1957.
ÕÏËÛÙÔÈ ∞ÏÁfiÚÈıÌÔÈ

™ÎÔfi˜
∫ ∂

Σκοπός αυτού του κεφαλαίου είναι η παρουσίαση της µεθόδου της απληστίας για το
σχεδιασµό αποδοτικών αλγορίθµων επίλυσης προβληµάτων βελτιστοποίησης. Η
παρουσίαση βασίζεται σε παραδείγµατα άπληστων αλγορίθµων, και η έµφαση δίνε-
ται στα χαρακτηριστικά των προβληµάτων βελτιστοποίησης που επιτρέπουν την επι-
5
º ∞ § ∞ π √

τυχηµένη εφαρµογή της µεθόδου της απληστίας και στην τεχνική µε την οποία απο-
δεικνύεται η ορθότητα των άπληστων αλγορίθµων.

¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·

Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση:

• Να σχεδιάσει έναν άπληστο αλγόριθµο για κάποιο πρόβληµα βελτιστοποίησης.

• Να αποδείξει ότι ένα πρόβληµα έχει την ιδιότητα της άπληστης επιλογής.

• Να αποδείξει ότι ένας άπληστος αλγόριθµος υπολογίζει τη βέλτιστη λύση ενός προ-
βλήµατος.

ŒÓÓÔȘ ÎÏÂȉȿ
• µέθοδος απληστίας • απόδειξη ορθότητας
• ιδιότητα άπληστης επιλογής • Κκώδικας Huffman

∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Οι αλγόριθµοι για προβλήµατα βελτιστοποίησης συνήθως λειτουργούν σε βήµατα, κάνο-
ντας ορισµένες επιλογές που σχετίζονται µε τη µορφή της βέλτιστης λύσης σε κάθε βήµα.
Στο δυναµικό προγραµµατισµό οι επιλογές βασίζονται στις βέλτιστες λύσεις επιµέρους
στιγµιότυπων, γι΄ αυτό και µερικές φορές καταναλώνεται πολύ περισσότερος υπολογι-
στικός χρόνος από όσον πραγµατικά απαιτείται για να γίνουν οι βέλτιστες επιλογές.
Ένας άπληστος αλγόριθµος (greedy algorithm) πάντα επιλέγει αυτό, που µε βάση την
τρέχουσα κατάσταση, δείχνει καλύτερο. ∆ηλαδή, ένας άπληστος αλγόριθµος κάνει
τοπικά βέλτιστες επιλογές, ελπίζοντας ότι αυτή η στρατηγική θα οδηγήσει σε µια συνο-
λικά βέλτιστη λύση.
106 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π

Αν και για µερικά προβλήµατα είναι επιτυχηµένη, η στρατηγική των τοπικά βέλτιστων
επιλογών δεν οδηγεί στις βέλτιστες λύσεις για αρκετά προβλήµατα. Η επιτυχία της
εφαρµογής της µεθόδου της απληστίας βασίζεται στην ύπαρξη των ιδιοτήτων της
άπληστης επιλογής (greedy – choice property) και των βέλτιστων επιµέρους δοµών
(optimal substructure). Η ιδιότητα της άπληστης επιλογής εξασφαλίζει ότι οι τοπικά
βέλτιστες επιλογές µπορούν να οδηγήσουν σε µια βέλτιστη λύση, ενώ η ιδιότητα των
βέλτιστων επιµέρους δοµών πρέπει να ισχύει για τα επιµέρους προβλήµατα που δηµι-
ουργούνται από τις τοπικά βέλτιστες επιλογές.
Οι άπληστοι αλγόριθµοι είναι συνήθως απλοί στη σύλληψη, εύκολοι στο σχεδιασµό
και ιδιαίτερα αποδοτικοί από πλευράς υπολογιστικών απαιτήσεων (π.χ. χρόνος εκτέ-
λεσης, αριθµός θέσεων µνήµης). Το δυσκολότερο κοµµάτι της ανάλυσης είναι η από-
δειξη ότι ο άπληστος αλγόριθµος πραγµατικά καταλήγει σε µία βέλτιστη λύση.
Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες:
5.1. Επιλογή ανταγωνιστικών δραστηριοτήτων
5.2. Χαρακτηριστικά µεθόδου της απληστίας
5.3. Συµπίεση δεδοµένων – κώδικας Huffman
5 . 1 ∂ ¶ π § √ ° ∏ ∞ ¡ ∆∞ ° ø ¡ π ™ ∆ π ∫ ø ¡ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 107

5.1 ∂ÈÏÔÁ‹ ·ÓÙ·ÁˆÓÈÛÙÈÎÒÓ ‰Ú·ÛÙËÚÈÔًوÓ

Θα ξεκινήσουµε παρουσιάζοντας µια εφαρµογή της µεθόδου της απληστίας για την
επίλυση ενός απλού προβλήµατος επιλογής / δροµολόγησης δραστηριοτήτων, οι
οποίες ανταγωνίζονται για την πρόσβαση σε έναν κοινόχρηστο πόρο.
Στην απλούστερή του µορφή, ένα πρόβληµα επιλογής δραστηριοτήτων (activity
selection problem) αποτελείται από ένα σύνολο δραστηριοτήτων Α = {1, 2, …, n},
όπου κάθε δραστηριότητα i αρχίζει τη χρονική στιγµή si και ολοκληρώνεται τη χρο-
νική στιγµή fi, fi ≥ si ≥ 0. Όλες οι δραστηριότητες του συνόλου Α απαιτούν τη χρήση
ενός κοινόχρηστου πόρου (π.χ. επεξεργαστή για υπολογιστικές διεργασίες, αίθου-
σας διδασκαλίας για µαθήµατα) για να εκτελεστούν. Άρα, το πολύ µία δραστηριό-
τητα µπορεί να βρίσκεται σε εξέλιξη κάθε χρονική στιγµή. Θεωρούµε ότι κάθε δρα-
στηριότητα i έχει αρχίσει τη χρονική στιγµή si, και έχει ολοκληρωθεί µέχρι τη χρο-
νική στιγµή fi, δηλαδή απαιτεί δέσµευση του πόρου κατά το ανοικτό δεξιά, χρονικό
διάστηµα [ si, fi). ∆ύο δραστηριότητες i και j καλούνται συµβατές (compatible) όταν
τα διαστήµατα [ si, fi) και [ sj, fj) δεν επικαλύπτονται, δηλαδή ισχύει si ≥ fj ή sj ≥ fi.
Στο πρόβληµα επιλογής δραστηριοτήτων που θα µελετήσουµε, θέλουµε να υπολο-
γίσουµε ένα σύνολο αµοιβαία συµβατών δραστηριοτήτων µεγίστου µεγέθους, δηλα-
δή, δεδοµένου του µοναδικού κοινόχρηστου πόρου, θέλουµε να µεγιστοποιήσουµε
το σύνολο των δραστηριοτήτων που θα εκτελεσθεί.
Ένας τυπικός άπληστος αλγόριθµος για το πρόβληµα επιλογής δραστηριοτήτων θα
λειτουργεί σε βήµατα, επιλέγοντας / δροµολογώντας µία δραστηριότητα σε κάθε
βήµα. Ο αλγόριθµος θα διατηρεί ένα σύνολο C µε τις δραστηριότητες που έχουν επι-
λεγεί, το οποίο αρχικά θα είναι κενό. Σε κάθε βήµα, θα επιλέγει από το A / C µια δρα-
στηριότητα που είναι συµβατή µε όλες τις δραστηριότητες του C και µοιάζει καλύ-
τερη µε βάση την τρέχουσα κατάσταση. Η επιλεγµένη δραστηριότητα θα προστίθε-
ται στο C και ο αλγόριθµος θα συνεχίζει ενόσω το A / C περιέχει δραστηριότητες
που είναι συµβατές µε αυτές του C.
Αν και υπάρχουν διάφορα κριτήρια µε τα οποία ο άπληστος αλγόριθµος µπορεί να
επιλέξει την «καλύτερη» δραστηριότητα, ο αντικειµενικός σκοπός είναι η δραστη-
ριότητα που θα επιλεγεί να µην κάνει κατάχρηση του κοινόχρηστου πόρου, ώστε να
επιτρέπει και σε άλλες δραστηριότητες να εκτελεσθούν. Με βάση αυτόν τον στόχο,
κάποιος µπορεί να επιλέγει τη δραστηριότητα µε τη µικρότερη διάρκεια (fi – si),
κάποιος άλλος αυτή που ξεκινάει νωρίτερα (µικρότερος χρόνος έναρξης si), ενώ
κάποιος τρίτος τη δραστηριότητα που απελευθερώνει τον κοινόχρηστο πόρο νωρί-
τερα, δηλαδή έχει το µικρότερο χρόνο ολοκλήρωσης fi. Ένα άλλο κριτήριο θα µπο-
108 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π

ρούσε να είναι η ελαχιστοποίηση του αριθµού των δραστηριοτήτων µε τις οποίες


επικαλύπτεται αυτή που θα επιλεγεί.
Αρχικά, θεωρούµε ότι οι δραστηριότητες είναι διατεταγµένες σε αύξουσα σειρά ως
προς τους χρόνους ολοκλήρωσης τους, δηλαδή είναι f1 £ f2 £ …£ fn, και ότι ο αλγό-
ριθµος επιλέγει σε κάθε βήµα µια δραστηριότητα η οποία είναι συµβατή µε τις υπό-
λοιπες δραστηριότητες του C και έχει το µικρότερο χρόνο ολοκλήρωσης. Ο παρα-
κάτω ψευδοκώδικας υλοποιεί αυτόν τον αλγόριθµο.
GREEDY – SELECTION(A = [(s1, f1),...,(sn, fn)])
{ £ÂˆÚԇ̠fiÙÈ f1 £ f2 £ ... £ fn }
C ¨ {1}; j ¨ 1;
for i ¨ 2 to n do
if si ≥ fj then C ¨ C » {i}; j ¨ i;
return C;
Ο αλγόριθµος GREEDY – SELECTION διατηρεί στη µεταβλητή j την τελευταία δρα-
στηριότητα που επιλέχθηκε στο C, δηλαδή τη δραστηριότητα του C µε το µεγαλύ-
τερο χρόνο ολοκλήρωσης. Στη συνέχεια, ψάχνει στο A / C για την επόµενη δραστη-
ριότητα i, i > j, που µπορεί να προστεθεί στο C, δηλαδή έχει si ≥ fj. Αφού οι δρα-
στηριότητες του A είναι διατεταγµένες σε αύξουσα σειρά ως προς τους χρόνους ολο-
κλήρωσης, η δραστηριότητα i έχει το µικρότερο fi από όλες αυτές που µπορούν να
προστεθούν στο C.
Ο χρόνος εκτέλεσης του αλγορίθµου GREEDY – SELECTION είναι Θ(n) όταν οι δρα-
στηριότητες είναι διατεταγµένες σε αύξουσα σειρά των fi. ∆ιαφορετικά, χρειάζεται
ένα ακόµη βήµα µε χρόνο εκτέλεσης Θ(n log n) για τη διάταξη των δραστηριοτήτων.
Για παράδειγµα, ας θεωρήσουµε τη λειτουργία του αλγορίθµου GREEDY – SELECTION
στο στιγµιότυπο του ακόλουθου πίνακα.

i 1 2 3 4 5 6 7 8 9 10 11
si 1 3 0 5 3 5 6 8 8 2 12
fi 4 5 6 7 8 9 10 11 12 13 14

Ο αλγόριθµος αρχικά δροµολογεί τη δραστηριότητα 1, οπότε αποκλείονται οι δρα-


στηριότητες 2 και 3. Στη συνέχεια, δροµολογούνται οι δραστηριότητες 4 (s4 = 5 > f1 =
4), 8 (s8 = 8 > f4 = 7) και 11 (s11 = 12 > f8 = 11). Η επιλογή της δραστηριότητας 4 απο-
κλείει τις δραστηριότητες 5, 6 και 7, η επιλογή της 8 αποκλείει τις 9 και 10, ενώ η δρα-
στηριότητα 11 επικαλύπτεται χρονικά µόνο µε τη δραστηριότητα 10. Το αποτέλεσµα
5 . 1 ∂ ¶ π § √ ° ∏ ∞ ¡ ∆∞ ° ø ¡ π ™ ∆ π ∫ ø ¡ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 109

του αλγορίθµου είναι η επιλογή ενός συνόλου τεσσάρων αµοιβαία συµβατών δρα-
στηριοτήτων, οι οποίες µπορούν να δροµολογηθούν όπως φαίνεται στο Σχήµα 5.1.
™¯‹Ì· 5.1
Η δροµολόγηση
1 4 8 11 που παράγει ο
Xρόνος αλγόριθµος
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Greedy – election.

Παρατηρούµε επίσης ότι το σύνολο {1, 4, 8, 11} αποτελεί µία βέλτιστη λύση για
αυτό το στιγµιότυπο, αφού δεν υπάρχει κανένα υποσύνολο πέντε ή περισσότερων
αµοιβαία συµβατών δραστηριοτήτων. Μία διαφορετική βέλτιστη λύση είναι το σύνο-
λο {2, 4, 8, 11}. Παρατηρούµε ότι η δραστηριότητα 2 µπορεί να αντικατασταθεί από
την 1 χωρίς να επηρεαστούν οι υπόλοιπες δραστηριότητες, αφού f1 £ f2. Αντικαθι-
στώντας τη δραστηριότητα 9 µε την 8, και την 2 µε την 1, από την επίσης βέλτιστη
λύση {2, 4, 9, 11} µπορούµε να πάρουµε τη λύση {1, 4, 8, 11} που εντόπισε ο
GREEDY – SELECTION.

¢Ú·ÛÙËÚÈfiÙËÙ· 5.1

∆ώστε παραδείγµατα στιγµιότυπων όπου οι άπληστοι αλγόριθµοι που επιλέγουν


σε κάθε βήµα τη δραστηριότητα µε τη µικρότερη διάρκεια, τη δραστηριότητα µε
το µικρότερο χρόνο έναρξης και τη δραστηριότητα που επικαλύπτεται µε τον
µικρότερο αριθµό άλλων δραστηριοτήτων του A / C αποτυγχάνουν να βρουν τη
βέλτιστη λύση.

5.1.1 ∞fi‰ÂÈÍË ÔÚıfiÙËÙ·˜

Από τις τέσσερις παραλλαγές άπληστων αλγορίθµων για το πρόβληµα της επιλογής
δραστηριοτήτων, είδαµε (∆ραστηριότητα 5.1) ότι οι τρεις δεν πετυχαίνουν πάντα στον
υπολογισµό µιας βέλτιστης λύσης. Γενικότερα, υπάρχουν πολλά παραδείγµατα άπλη-
στων αλγορίθµων που δεν εγγυώνται τον υπολογισµό µιας βέλτιστης λύσης. Έτσι,
όταν πιστεύουµε ότι ένας άπληστος αλγόριθµος καταφέρνει, για κάθε στιγµιότυπο
εισόδου, να υπολογίσει µια βέλτιστη λύση πρέπει να τεκµηριώνουµε αυτό το γεγο-
νός µε µία µαθηµατική απόδειξη, η οποία συχνά καλείται απόδειξη ορθότητας.
Στη συνέχεια, θα αποδείξουµε ότι ο αλγόριθµος GREEDY – SELECTION, ο οποίος σε
κάθε βήµα επιλέγει τη δραστηριότητα µε τον µικρότερο χρόνο ολοκλήρωσης, υπο-
λογίζει πάντα µία βέλτιστη λύση για το πρόβληµα επιλογής δραστηριοτήτων.
110 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π

Θεώρηµα 5.1: Ο αλγόριθµος GREEDY – SELECTION πάντα υπολογίζει µία βέλτι-


στη λύση για το πρόβληµα επιλογής δραστηριοτήτων.
Απόδειξη: Αφού υποθέσαµε ότι οι δραστηριότητες είναι διατεταγµένες σε
αύξουσα σειρά των χρόνων ολοκλήρωσης, η δραστηριότητα 1
είναι αυτή που ολοκληρώνεται πρώτη. Αρχικά, θα δείξουµε ότι
πάντα υπάρχει µία βέλτιστη λύση που περιέχει τη δραστηριότητα
1, δηλαδή την τοπικά βέλτιστη δραστηριότητα που επιλέγεται από
τον άπληστο αλγόριθµο.
Έστω C* Õ A µία βέλτιστη λύση και έστω ότι 1 œ C*. Επίσης,
έστω k η δραστηριότητα του C* µε το µικρότερο χρόνο ολοκλή-
ρωσης, δηλαδή fk = min iŒC* {fi}. Η δραστηριότητα 1 είναι αµοι-
βαία συµβατή µε όλες τις δραστηριότητες του C* / {k}, αφού f1 £
fk και, για κάθε i Œ C* \ {k}, si ≥ fk. Εποµένως, το σύνολο C = (C*
\ {k}) » {1} είναι επίσης µία βέλτιστη λύση, αφού αποτελείται
από αµοιβαία συµβατές δραστηριότητες και έχει τον ίδιο αριθµό
δραστηριοτήτων µε το C*.
Έστω λοιπόν µία βέλτιστη λύση C* που περιέχει τη δραστηριό-
τητα 1. Το C* / {1} αποτελεί µία βέλτιστη λύση στο πρόβληµα της
επιλογής για το σύνολο Α1 των δραστηριοτήτων που είναι συµ-
βατές µε την 1, Α1 = {i Œ A: si ≥ f1}. ∆ιαφορετικά, αν µία βέλτι-
στη λύση C1* για το στιγµιότυπο Α1 περιείχε περισσότερες δρα-
στηριότητες από το C* / {1}, τότε το C1* » {1} θα ήταν µία λύση
για το αρχικό στιγµιότυπο Α, η οποία θα περιείχε περισσότερες
δραστηριότητες από το C*. Αυτό αντίκειται στην επιλογή του C*
σαν µία βέλτιστη λύση για το στιγµιότυπο Α.
Άρα, αποδείξαµε ότι, µετά την επιλογή της τοπικά βέλτιστης δρα-
στηριότητας, ο αλγόριθµος πρέπει να λύσει ένα επιµέρους πρό-
βληµα βελτιστοποίησης της ίδιας µορφής µε το αρχικό. Εφαρµό-
ζοντας επαγωγικά στα επιµέρους προβλήµατα το γεγονός ότι κάθε
βέλτιστη λύση για το πρόβληµα της επιλογής δραστηριοτήτων
περιέχει τη δραστηριότητα µε το µικρότερο χρόνο ολοκλήρωσης,
αποδεικνύουµε ότι ο Greedy – Selection πάντα υπολογίζει µία
βέλτιστη λύση.
5 . 1 ∂ ¶ π § √ ° ∏ ∞ ¡ ∆∞ ° ø ¡ π ™ ∆ π ∫ ø ¡ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 111

Η παραπάνω επαγωγική µορφή απόδειξης είναι τυπική για τις αποδείξεις ορθότητας
άπληστων αλγορίθµων. Αρχικά, αποδεικνύουµε ότι πάντα υπάρχει µία βέλτιστη λύση
η οποία περιέχει το τοπικά βέλτιστο στοιχείο που επιλέγει ο άπληστος αλγόριθµος
(ιδιότητα άπληστης επιλογής). Στη συνέχεια, δείχνουµε ότι, δεδοµένης της άπληστης
επιλογής, ο αλγόριθµος αποµένει να υπολογίσει τη βέλτιστη λύση ενός επιµέρους στιγ-
µιότυπου του ίδιου προβλήµατος (ιδιότητα βέλτιστων επιµέρους δοµών). Η απόδειξη
ολοκληρώνεται µε επαγωγική εφαρµογή της ιδιότητας της βέλτιστης επιλογής στα επι-
µέρους στιγµιότυπα που προκύπτουν από κάθε βήµα του άπληστου αλγορίθµου.
Μερικές φορές είναι ευκολότερο οι αποδείξεις ορθότητας να διατυπώνονται συγκρί-
νοντας τα στοιχεία µιας βέλτιστης λύσης µε τη λύση που υπολογίζει ο άπληστος
αλγόριθµος. Συγκεκριµένα, έστω µία βέλτιστη λύση C* και έστω C η λύση που υπο-
λογίζει ο άπληστος αλγόριθµος. Θεωρούµε ότι τα στοιχεία των C*, C είναι διατε-
ταγµένα µε βάση το κριτήριο της άπληστης επιλογής (π.χ. αύξουσα σειρά χρόνων
ολοκλήρωσης). Έστω ότι τα C*, C είναι ίδια ως προς τα πρώτα (i – 1) στοιχεία τους,
και το i – οστό στοιχείο τους είναι διαφορετικό, 1 £ i £ |C|, και έστω x το i – οστό
στοιχείο του C* και y το i – οστό στοιχείο του C.
Αρχικά, παρατηρούµε ότι το C πρέπει να περιέχει τουλάχιστον i στοιχεία, αφού δια-
φορετικά ο άπληστος αλγόριθµος θα συµπεριλάµβανε το στοιχείο x στο C. Η από-
δειξη ολοκληρώνεται δείχνοντας ότι το (C* \ {x}) » {y} είναι επίσης µία βέλτιστη
λύση, δηλαδή το στοιχείο y µπορεί να αντικαταστήσει το x στη βέλτιστη λύση C*.
Στην περίπτωση της επιλογής δραστηριοτήτων, το y µπορεί να αντικαταστήσει το x,
αφού fx £ fy και, για κάθε j > i, το j – οστό στοιχείο του C* έχει χρόνο έναρξης sj ≥ fy
≥ fx. Άρα, ακόµα και αν C* π C, µπορούµε πάντα να κατασκευάσουµε µία βέλτιστη
λύση που θα συµφωνεί µε το C.

¢Ú·ÛÙËÚÈfiÙËÙ· 5.2

Σχεδιάστε έναν αλγόριθµο δυναµικού προγραµµατισµού για το πρόβληµα επιλο-


γής δραστηριοτήτων. Μπορείτε να υποθέσετε ότι οι δραστηριότητες είναι διατε-
ταγµένες σε αύξουσα σειρά ως προς τους χρόνους ολοκλήρωσης, f1 £ f2 £ … £ fn.
112 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 5.1

Έστω ένα σύνολο Α από n δραστηριότητες, όπου κάθε δραστηριότητα i, 1 £ i £ n,


έχει ένα χρόνο έναρξης si ≥ 0 και ένα χρόνο ολοκλήρωσης fi ≥ 0. Θέλουµε να δρο-
µολογήσουµε όλες τις δραστηριότητες χρησιµοποιώντας τον ελάχιστο αριθµό από
κοινόχρηστους πόρους (π.χ. αίθουσες διδασκαλίας, αν οι δραστηριότητες είναι
µαθήµατα). Σχεδιάστε και αναλύστε έναν άπληστο αλγόριθµο που θα υπολογίζει
µία δροµολόγηση των δραστηριοτήτων χρησιµοποιώντας των ελάχιστο αριθµό κοι-
νόχρηστων πόρων.

5.2 ÷ڷÎÙËÚÈÛÙÈο Ù˘ ÌÂıfi‰Ô˘ Ù˘ ·ÏËÛÙ›·˜

Στο παράδειγµα της επιλογής δραστηριοτήτων είδαµε ότι οι άπληστοι αλγόριθµοι


είναι απλοί στο σχεδιασµό, εύκολοι στην υλοποίηση και αποδοτικοί όσον αφορά στις
απαιτήσεις σε υπολογιστικούς πόρους. Όµως, µερικές φορές, οι άπληστοι αλγόριθ-
µοι αποτυγχάνουν να καταλήξουν σε βέλτιστες λύσεις, γι’ αυτό η ανάλυσή τους πρέ-
πει να συνοδεύεται από µία µαθηµατική απόδειξη ορθότητας, η οποία τεκµηριώνει
ότι η λύση που υπολογίζεται από τον αλγόριθµο είναι πράγµατι βέλτιστη. Η από-
δειξη ορθότητας, συνήθως, βασίζεται στις ιδιότητες της άπληστης επιλογής και των
βέλτιστων επιµέρους δοµών.

5.2.1 π‰ÈfiÙËÙ· Ù˘ ¿ÏËÛÙ˘ ÂÈÏÔÁ‹˜

Ένα πρόβληµα έχει την ιδιότητα της άπληστης επιλογής (greedy choice property) όταν
µια ακολουθία επιλογών, οι οποίες είναι τοπικά βέλτιστες (άπληστες) ως προς κάποιο
κριτήριο, µπορεί να αποτελέσει µία βέλτιστη λύση.
Εδώ εντοπίζεται η βασική διαφορά του δυναµικού προγραµµατισµού από τη µέθο-
δο της απληστίας. Στο δυναµικό προγραµµατισµό, ο αλγόριθµος κάνει µια επιλογή
σε κάθε βήµα, αλλά η επιλογή βασίζεται στις τιµές των βέλτιστων λύσεων κάποιων
επιµέρους προβληµάτων. ∆ηλαδή, ένας αλγόριθµος δυναµικού προγραµµατισµού
πρώτα επιλύει όλα τα διαφορετικά επιµέρους προβλήµατα και, στη συνέχεια, κάνει
τις επιλογές του συγκρίνοντας αυτές τις λύσεις.
Αντίθετα, ένας άπληστος αλγόριθµος πρώτα διαλέγει αυτό που φαίνεται καλύτερο
µε βάση την τρέχουσα κατάσταση και κάποιο συγκεκριµένο κριτήριο και, στη συνέ-
χεια, επιλύει το επιµέρους πρόβληµα που προκύπτει από την επιλογή του. Μια επι-
λογή ενός άπληστου αλγορίθµου µπορεί να εξαρτάται από τις µέχρι τώρα επιλογές,
οι οποίες διαµορφώνουν την τρέχουσα κατάσταση, αλλά δεν µπορεί να εξαρτάται
από τις επιλογές ή τις λύσεις των επιµέρους προβληµάτων που θα προκύψουν στο
5 . 2 à ∞ ƒ∞ ∫ ∆ ∏ ƒ π ™ ∆ π ∫ ∞ ∆ ∏ ™ ª ∂ £ √ ¢ √ À ∆ ∏ ™ ∞ ¶ § ∏ ™ ∆ π ∞ ™ 113

µέλλον. Εποµένως, σε αντίθεση µε το δυναµικό προγραµµατισµό που ακολουθεί


bottom – up στρατηγική, ένας άπληστος αλγόριθµος ακολουθεί top – down στρατη-
γική στην επίλυση ενός προβλήµατος, αφού, κάνοντας µια τοπικά βέλτιστη επιλο-
γή, δηµιουργεί ένα επιµέρους στιγµιότυπο του ίδιου προβλήµατος, το οποίο επιλύει
εφαρµόζοντας τον εαυτό του.
Όταν ισχύει, η ιδιότητα της άπληστης επιλογής εγγυάται ότι αυτή η στρατηγική θα
καταλήξει σε µία βέλτιστη λύση. Εποµένως, όπως και στην περίπτωση του Θεωρή-
µατος 5.1, η απόδειξη ορθότητας ενός άπληστου αλγορίθµου πρέπει να επιβεβαιώ-
νει την ιδιότητα της άπληστης επιλογής. Για το πρόβληµα της επιλογής δραστηριο-
τήτων, η ιδιότητα επιβεβαιώθηκε δείχνοντας ότι πάντα υπάρχει µία βέλτιστη λύση
που περιέχει την δραστηριότητα που ολοκληρώνεται πρώτη.

5.2.2 π‰ÈfiÙËÙ· ‚¤ÏÙÈÛÙˆÓ ÂÈ̤ÚÔ˘˜ ‰ÔÌÒÓ

Στο προηγούµενο κεφάλαιο είδαµε ότι η ιδιότητα των βέλτιστων επιµέρους δοµών
(optimal substructure property) ισχύει όταν η βέλτιστη λύση ενός στιγµιότυπου περιέ-
χει τις βέλτιστες λύσεις συγκεκριµένων επιµέρους στιγµιότυπων. Όπως και στην
περίπτωση του δυναµικού προγραµµατισµού, η ιδιότητα των βέλτιστων επιµέρους
δοµών είναι απαραίτητο συστατικό για την επιτυχία της άπληστης στρατηγικής, αφού
ο άπληστος αλγόριθµος εφαρµόζει τον εαυτό του για να λύσει τα επιµέρους στιγ-
µιότυπα που προκύπτουν σε κάθε βήµα από την τοπικά βέλτιστη επιλογή.
Για παράδειγµα, στην περίπτωση του Θεωρήµατος 5.1, αποδείξαµε ότι αν C* είναι
µία βέλτιστη λύση που περιέχει τη δραστηριότητα 1 µε το µικρότερο χρόνο ολο-
κλήρωσης f1, τότε το C* \ {1} είναι µία βέλτιστη λύση στο στιγµιότυπο A1 = {i Œ A:
si ≥ f1} που αποτελείται από όλες τις δραστηριότητες που είναι συµβατές µε την 1.

5.2.3 ª¤ıÔ‰Ô˜ ·ÏËÛÙ›·˜ Î·È ‰˘Ó·ÌÈÎfi˜ ÚÔÁÚ·ÌÌ·ÙÈÛÌfi˜

Επειδή τόσο ο δυναµικός προγραµµατισµός όσο και η µέθοδος της απληστίας εκµε-
ταλλεύονται την ιδιότητα των βέλτιστων επιµέρους δοµών για την επίλυση ενός προ-
βλήµατος, υπάρχουν περιπτώσεις που λανθασµένα µπορεί να θεωρήσουµε ότι είτε
χρειάζεται δυναµικός προγραµµατισµός για την επίλυση ενός προβλήµατος που λύνε-
ται και από έναν αποδοτικότερο άπληστο αλγόριθµο (βλέπε ∆ραστηριότητα 5.2),
είτε ένας άπληστος αλγόριθµος αρκεί για την επίλυση ενός προβλήµατος που απαι-
τεί την εφαρµογή δυναµικού προγραµµατισµού. Σε τέτοιες περιπτώσεις, η ιδιότητα
της άπληστης επιλογής διευκολύνει στην επιλογή µεταξύ δυναµικού προγραµµατι-
σµού και απληστίας.
114 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π

Για παράδειγµα, ας θεωρήσουµε δύο παραλλαγές του προβλήµατος του σακιδίου


(knapsack problem). Στο πρόβληµα του σακιδίου, δεδοµένων ενός σακιδίου µεγέ-
θους Β και n αντικειµένων, καθένα από τα οποία έχει µέγεθος si > 0 και αξία pi > 0,
i = 1, 2, …, n, θέλουµε να υπολογίσουµε µία µέγιστης συνολικής αξίας συλλογή αντι-
κειµένων Α, τα οποία µπορούν να χωρέσουν στο σακίδιο (δηλαδή Â i ŒA
si £ B ).
Αυτή η µορφή λέγεται και 0 – 1 πρόβληµα του σακιδίου (0 – 1
knapsack problem), γιατί κάθε αντικείµενο µπορεί να επιλεγεί καµία ή µία φορά.

Στο κλασµατικό πρόβληµα του σακιδίου (fractional knapsack problem), τα δεδοµένα


είναι τα ίδια, αλλά στη συλλογή αντικειµένων Α µπορεί να συµπεριληφθεί οποιοδήπο-
τε ποσοστό fi, 0 £ fi £ 1, ενός αντικειµένου i, 1 £ i £ n. Σε αυτή την περίπτωση, η αξία

 Â
n n
της συλλογής είναι p( A) = f i pi , ενώ το µέγεθός της είναι s( A) = f i si , και
i =1 i =1

πρέπει s(A) £ B.

Έστω ότι µία βέλτιστη λύση A0*-1 για την 0 – 1 παραλλαγή του προβλήµατος, και
έστω κάποιο αντικείµενο j Œ A0*-1 , 1 £ j £ n, που έχει συµπεριληφθεί στο σακίδιο
από αυτή τη βέλτιστη λύση. Αν αποµακρύνουµε το αντικείµενο j, το σύνολο
A0*-1 /{ j} θα είναι µία βέλτιστη λύση για το επιµέρους στιγµιότυπο που αποτελεί-
ται από σακίδιο µεγέθους B – sj και τα n – 1 αντικείµενα που αποµένουν µετά την
αποµάκρυνση του j.
*
Επίσης, έστω µία βέλτιστη λύση Af για το κλασµατικό πρόβληµα του σακιδίου, και
έστω fj το ποσοστό συµµετοχής ενός αντικειµένου j, 1 £ j £ n, στο σακίδιο που αντι-
*
στοιχεί στην Af . Αν αποµακρύνουµε τις fjsj µονάδες του αντικειµένου j, το
A*f /{ j} αποτελεί µία βέλτιστη λύση για το επιµέρους στιγµιότυπο που αποτελεί-
ται από σακίδιο µεγέθους B – fjsj, τα n – 1 αντικείµενα που αποµένουν µετά την απο-
µάκρυνση του j, και, στη θέση του j, ένα αντικείµενο µεγέθους (1 – fj)sj και αξίας
(1 – fj)pj.
Εποµένως, και οι δύο παραλλαγές του προβλήµατος του σακιδίου έχουν την ιδιότη-
τα των βέλτιστων επιµέρους δοµών, αφού κάθε βέλτιστη λύση περιέχει τις βέλτιστες
λύσεις συγκεκριµένων επιµέρους στιγµιότυπων. Από τις δύο παραλλαγές, το κλα-
σµατικό πρόβληµα του σακιδίου µπορεί να λυθεί από έναν απλό, άπληστο αλγόριθ-
µο, ο οποίος βασίζει τις επιλογές του στο λόγο αξίας προς µέγεθος (pi / si) κάθε αντι-
5 . 2 à ∞ ƒ∞ ∫ ∆ ∏ ƒ π ™ ∆ π ∫ ∞ ∆ ∏ ™ ª ∂ £ √ ¢ √ À ∆ ∏ ™ ∞ ¶ § ∏ ™ ∆ π ∞ ™ 115

κειµένου i. Αρχικά, ο αλγόριθµος υπολογίζει, για κάθε αντικείµενο i, 1 £ i £ n, το


λόγο ri = pi / si, και διατάσσει τα αντικείµενα σε φθίνουσα σειρά ως προς τα ri, r1 ≥ r2
≥ … ≥ rn. Στη συνέχεια, ο αλγόριθµος επιλέγει να συµπεριλάβει στο σακίδιο τη µεγα-
λύτερη δυνατή ποσότητα από τα αντικείµενα µε το µεγαλύτερο λόγο αξίας προς µέγε-
θος. Συγκεκριµένα, ο αλγόριθµος λειτουργεί σε βήµατα και σε κάθε βήµα j, j = 1, …,
n, συµπεριλαµβάνει στο σακίδιο όσες από τις sj µονάδες του αντικειµένου j µπορούν
να χωρέσουν. Όταν το σακίδιο γεµίσει, ο αλγόριθµος τερµατίζει. Προφανώς, απαι-
τείται Θ(n log n) χρόνος για τη διάταξη των αντικειµένων σε φθίνουσα σειρά ως προς
τα ri, και Ο(n) χρόνος για την επιλογή των αντικειµένων που θα συµπεριληφθούν στο
σακίδιο. Άρα, ο χρόνος εκτέλεσης του αλγορίθµου είναι Θ(n log n).

¢Ú·ÛÙËÚÈfiÙËÙ· 5.3

Γράψτε τον ψευδοκώδικα του άπληστου αλγορίθµου για το κλασµατικό πρόβλη-


µα σακιδίου και αποδείξτε ότι πάντα υπολογίζει µία βέλτιστη λύση. Έχει το κλα-
σµατικό πρόβληµα του σακιδίου την ιδιότητα της άπληστης επιλογής;

Αντίθετα µε την κλασµατική παραλλαγή, το 0 – 1 πρόβληµα του σακιδίου δεν έχει


την ιδιότητα της άπληστης επιλογής και, εποµένως, ο παραπάνω άπληστος αλγό-
ριθµος δεν εγγυάται τον υπολογισµό µιας βέλτιστης λύσης. Για παράδειγµα, θεω-
ρούµε το στιγµιότυπο που αποτελείται από ένα σακίδιο µεγέθους 50 και τρία αντι-
κείµενα µε µεγέθη 10, 20 και 30, και αξίες 60, 100 και 120, αντίστοιχα. Οι λόγοι
αξίας προς µέγεθος είναι r1 = 6, r2 = 5 και r3 = 4. Η βέλτιστη λύση για την κλασµα-
τική παραλλαγή του προβλήµατος υπολογίζεται από τον άπληστο αλγόριθµο και
συµπεριλαµβάνει στο σακίδιο ολόκληρα το πρώτο και δεύτερο αντικείµενο (f1 = f2
= 1) και τα 2/3 του τρίτου αντικειµένου (f3 = 2/3). Όπως κάθε βέλτιστη λύση για το
κλασµατικό πρόβληµα του σακιδίου, αυτή η λύση γεµίζει πλήρως το σακίδιο (µέγε-
θος 50) και έχει συνολική αξία 240.
Αν εφαρµοστεί για την 0 – 1 παραλλαγή του προβλήµατος, ο άπληστος αλγόριθµος
θα συµπεριλάβει στο σακίδιο µόνο το πρώτο και το δεύτερο αντικείµενο (µέγεθος
30, αξία 160), ενώ η βέλτιστη λύση συµπεριλαµβάνει στο σακίδιο το δεύτερο και το
τρίτο αντικείµενο (µέγεθος 50, αξία 220). Η άπληστη επιλογή του πρώτου αντικει-
µένου δεν είναι βέλτιστη για την 0 – 1 παραλλαγή, γιατί καθιστά αδύνατο το πλή-
ρες γέµισµα του σακιδίου, αφού τα αντικείµενα 1 και 2 έχουν συνολικό µέγεθος 30
και τα αντικείµενα 1 και 3 έχουν συνολικό µέγεθος 40. Αντίθετα, η βέλτιστη λύση
αποτελείται από τα αντικείµενα 2 και 3, που έχουν µικρότερο λόγο αξίας προς µέγε-
θος, αλλά πετυχαίνουν την πλήρωση του σακιδίου.
116 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π

Συνεπώς, όταν ένα αλγόριθµος για τη 0 – 1 παραλλαγή αποφασίζει αν θα συµπερι-


λάβει ένα αντικείµενο i στο σακίδιο, πρέπει να συγκρίνει τις βέλτιστες λύσεις των
δύο επιµέρους στιγµιότυπων που αντιστοιχούν στην περίπτωση που το i συµπερι-
λαµβάνεται στο σακίδιο και στην περίπτωση που το i δεν συµπεριλαµβάνεται στο
σακίδιο. Αυτή η αντιµετώπιση δηµιουργεί πολλά επικαλυπτόµενα επιµέρους προ-
βλήµατα και απαιτεί την εφαρµογή της µεθόδου του δυναµικού προγραµµατισµού.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 5.2

Περιγράψτε και αναλύστε έναν άπληστο αλγόριθµο, ο οποίος δεδοµένου ενός συνό-
λου Χ = {x1, x2, …, xn} πραγµατικών αριθµών, υπολογίζει µια ελαχίστου πληθικού
αριθµού συλλογή κλειστών διαστηµάτων µοναδιαίου µήκους, των οποίων η ένωση
περιέχει όλα τα στοιχεία του Χ.

5.3 ™˘Ì›ÂÛË ‰Â‰ÔÌ¤ÓˆÓ – ÎÒ‰Èη˜ Huffman


Ένα από τα βασικότερα προβλήµατα στη συµπίεση δεδοµένων (data compression)
είναι αυτό της αναπαράστασης µιας ακολουθίας χαρακτήρων µε τον ελάχιστο αριθ-
µό δυαδικών ψηφίων. Συγκεκριµένα, στο πρόβληµα της κωδικοποίησης (encoding
problem) θεωρούµε µια ακολουθία χαρακτήρων (π.χ. ένα αρχείο κειµένου) µήκους
L, η οποία αποτελείται από ένα σύνολο n χαρακτήρων C, και κάθε χαρακτήρας c Œ
C, εµφανίζεται µε συχνότητα f(c), 0 < f(c) < 1. Το ζητούµενο είναι ένας δυαδικός
κώδικας (binary code) ο οποίος αντιστοιχεί σε κάθε χαρακτήρα c µία µοναδική ακο-
λουθία d(c) δυαδικών ψηφίων και ελαχιστοποιεί την ποσότητα Â cŒC
f ( c )d ( c ) , η

οποία, πολλαπλασιασµένη µε το µήκος της ακολουθίας L, δίνει τον αριθµό των δυα-
δικών ψηφίων που απαιτούνται για την κωδικοποίηση της ακολουθίας. Η δυαδική ακο-
λουθία που αντιστοιχεί στον χαρακτήρα c ονοµάζεται κωδικός (code word) του c.

Οι λύσεις στο πρόβληµα της κωδικοποίησης χωρίζονται στους κώδικες σταθερού


µήκους (fixed length codes), όπου σε καθένα από τους n χαρακτήρες αντιστοιχεί ένας
µοναδικός κωδικός µήκους È log nù , και στους κώδικες µεταβλητού µήκους (variable
length code), όπου ο αριθµός των δυαδικών ψηφίων για την κωδικοποίηση του χαρα-
κτήρα c είναι ανάλογος της συχνότητας εµφάνισης f(c). Ένας κώδικας σταθερού ή
µεταβλητού µήκους ονοµάζεται κώδικας χωρίς κοινά προθέµατα (ή κώδικας προθε-
µάτων, prefix code) όταν ο κωδικός κάποιου χαρακτήρα c δεν αποτελεί πρόθεµα του
κωδικού κανενός άλλου χαρακτήρα c¢, c¢ π c.
5.3 ™Àª¶π∂™∏ ¢∂¢√ª∂¡ø¡ – ∫ø¢π∫∞™ HUFFMAN 117

Οι κώδικες προθεµάτων έχουν την ιδιότητα της απλής αποκωδικοποίησης, αφού όταν
διαβάσουµε τον κωδικό ενός χαρακτήρα c, καταλαβαίνουµε αµέσως ότι πρόκειται
για τον c, επειδή κανένας κωδικός δεν αποτελεί πρόθεµα κάποιου άλλου κωδικού.
Εποµένως, ο αλγόριθµος αποκωδικοποίησης διαβάζει τα δυαδικά ψηφία της κωδι-
κοποιηµένης ακολουθίας, µέχρι να σχηµατιστεί ένας κωδικός. Στη συνέχεια, τυπώ-
νει τον χαρακτήρα που αντιστοιχεί στον κωδικό, αφαιρεί τα ψηφία του κωδικού από
την ακολουθία και συνεχίζει µέχρι να σχηµατιστεί κάποιος άλλος κωδικός.
Έχει αποδειχθεί ότι, για κάθε ακολουθία χαρακτήρων, υπάρχει ένας βέλτιστος κώδι-
κας προθεµάτων. Εποµένως, χωρίς βλάβη της γενικότητας, σε αυτή την ενότητα θα
περιοριστούµε στην κατασκευή κωδίκων προθεµάτων.
Για παράδειγµα, ας θεωρήσουµε µία ακολουθία µήκους 100.000 χαρακτήρων που
αποτελείται από τους χαρακτήρες α, β, γ, δ, ε και ζ, µε συχνότητες εµφάνισης 0,45,
0,13, 0,12, 0,16, 0,09, και 0,05 αντίστοιχα. Στον παρακάτω πίνακα βλέπουµε δύο
κώδικες προθεµάτων, έναν σταθερού µήκους και έναν µεταβλητού µήκους.

¶›Ó·Î·˜ 5.1
Ένα παράδειγµα κωδίκων σταθερού και µεταβλητού µήκους.
α β γ δ ε ζ
Συχνότητα εµφάνισης 0,45 0,13 0,12 0,16 0,09 0,05
Κώδικας σταθερού µήκους 000 001 010 011 100 101
Κώδικας µεταβλητού µήκους 0 101 100 111 1101 1100

Όλοι οι κωδικοί του κώδικα σταθερού µήκους αποτελούνται από 3 δυαδικά ψηφία,
και χρειάζονται 300.000 δυαδικά ψηφία για την κωδικοποίηση όλης της ακολουθίας.
Αντίστοιχα, ο κώδικας µεταβλητού µήκους εξοικονοµεί περίπου το 25% των δυαδι-
κών ψηφίων, αφού χρησιµοποιεί µόνο 1.000 (45◊1 + 13◊3 + 12◊3 + 16◊3 + 9◊4 + 5◊4)
= 224.000 δυαδικά ψηφία. Στην πραγµατικότητα, αυτός ο κώδικας µεταβλητού
µήκους είναι ένας βέλτιστος κώδικας γι΄ αυτή την ακολουθία.
Ένας κώδικας προθεµάτων µπορεί να αναπαρασταθεί σαν ένα δυαδικό δέντρο, το
οποίο έχει ένα φύλλο για κάθε χαρακτήρα. Ο κωδικός κάθε χαρακτήρα δίνεται από
το µονοπάτι που οδηγεί από τη ρίζα στο αντίστοιχο φύλλο, όπου η επιλογή του αρι-
στερού κλάδου αντιστοιχεί στο 0, και η επιλογή του δεξιού κλάδου αντιστοιχεί στο
1. Στο Σχήµα 5.2 βλέπουµε τα δυαδικά δέντρα που αντιστοιχούν στους κώδικες του
Πίνακα 5.1.
118 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π

1,00
0 1

0,86 0,14
0 1 0

0,58 0,28 0,14


0 1 0 1 0 1

α:0,45 β:0,13 γ:0,12 δ:0,16 ε:0,09 ζ:0,05

1,00
0 1

α:0,45 0,55
0 1

0,25 0,30
0 1 0 1
™¯‹Ì· 5.2
Τα δυαδικά δέντρα γ:0,12 β:0,13 0,14 δ:0,16
που αναπαριστούν 0 1
τους κώδικες του
Πίνακα 5.1. ζ:0,05 ε:0,09

Ένας κώδικας σταθερού µήκους αναπαρίσταται από ένα δυαδικό δέντρο του οποί-
ου όλα τα φύλλα βρίσκονται στην ίδια απόσταση από τη ρίζα (ύψος). Ένας βέλτι-
στος κώδικας αναπαρίσταται από ένα πλήρες δυαδικό δέντρο, δηλαδή από ένα δυα-
δικό δέντρο του οποίου κάθε κόµβος είτε είναι φύλλο είτε έχει ακριβώς δύο απογό-
νους. Στο Σχήµα 5.2, το δέντρο που αντιστοιχεί στον κώδικα σταθερού µήκους δεν
είναι πλήρες, αφού κανένας κωδικός δεν έχει πρόθεµα 11. Αντίθετα, το δέντρο που
αντιστοιχεί στον βέλτιστο κώδικα µεταβλητού µήκους είναι πλήρες.

¢Ú·ÛÙËÚÈfiÙËÙ· 5.4

Αποδείξτε ότι ένα δυαδικό δέντρο που δεν είναι πλήρες, δεν µπορεί να αντιστοιχεί
σε ένα βέλτιστο κώδικα.
5.3 ™Àª¶π∂™∏ ¢∂¢√ª∂¡ø¡ – ∫ø¢π∫∞™ HUFFMAN 119

Έστω ένα πλήρες δυαδικό δέντρο Τ το οποίο αναπαριστά έναν κώδικα για ένα σύνο-
λο χαρακτήρων C. Για κάθε χαρακτήρα c Œ C, συµβολίζουµε µε f(c), 0 < f(c) < 1, τη
συχνότητα εµφάνισης του c στην ακολουθία χαρακτήρων και µε dT(c) την απόσταση
του φύλλου που αντιστοιχεί στο c από τη ρίζα του Τ, δηλαδή το µήκους του κωδικού
που αντιστοιχεί στο c. Στο πρόβληµα της κωδικοποίησης θέλουµε να υπολογίσουµε
ένα πλήρες δυαδικό δέντρο Τ το οποία περιέχει ακριβώς |C| φύλλα και ελαχιστοποιεί
την ποσότητα B(T ) = Â cŒC
f ( c )dT ( c ) . Το Β(Τ) ονοµάζεται και κόστος του δέντρου Τ.

5.3.1 √ ∫Ò‰Èη˜ Huffman

Το 1952, ο David Huffman παρουσίασε έναν άπληστο αλγόριθµο για τον υπολογι-
σµό ενός βέλτιστου κώδικα προθεµάτων, ο οποίος ονοµάζεται κώδικας Huffman.
Ο αλγόριθµος του Huffman υπολογίζει το δέντρο Τ που αντιστοιχεί σε έναν βέλτι-
στο κώδικα προχωρώντας από τα φύλλα προς τη ρίζα. Ο αλγόριθµος ξεκινά από ένα
σύνολο C αποµονωµένων φύλλων, τα οποία ενώνει σε ένα πλήρες δυαδικό µε την
εισαγωγή ακριβώς |C| – 1 εσωτερικών κόµβων. Σε κάθε εσωτερικό κόµβο αντι-
στοιχούµε συχνότητα ίση µε το άθροισµα των συχνοτήτων όλων των χαρακτήρων /
φύλλων του υποδέντρου. Σε κάθε βήµα, τα δύο υποδέντρα µε τις µικρότερες συχνό-
τητες ενώνονται και αντικαθιστώνται από ένα υποδέντρο που δηµιουργείται µε την
προσθήκη ενός νέου εσωτερικού κόµβου. Στο νέο κόµβο αντιστοιχούµε συχνότητα
ίση µε το άθροισµα των συχνοτήτων των ριζών των δύο υποδέντρων. Ο αλγόριθµος
ολοκληρώνεται όταν αποµείνει µόνο ένα δέντρο που περιέχει όλους τους χαρακτή-
ρες του C σαν φύλλα.
Ο αλγόριθµος του Huffman µπορεί να υλοποιηθεί χρησιµοποιώντας µία ουρά προτε-
ραιότητας (priority queue) Q, το κορυφαίο στοιχείο της οποίας αντιστοιχεί πάντα στο
υποδέντρο µε τη µικρότερη συχνότητα. Για παράδειγµα, η δοµή heap υλοποιεί µια
ουρά προτεραιότητας n στοιχείων µε χρόνο O(log n) για εισαγωγή και διαγραφή ενός
στοιχείου, και χρόνο υπολογισµού του στοιχείου µε τη µικρότερη συχνότητα O(1).
Αφού ο αλγόριθµος Huffman εκτελεί |C| – 1 επαναλήψεις, κάθε µία από τις οποίες
απαιτεί χρόνο O(log |C|), ο χρόνος εκτέλεσης του αλγορίθµου είναι O(|C| log |C|).
120 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π

(1) ζ:0,05 ε:0,09 γ:0,12 β:0,13 δ:0,16 α:0,45

(2) γ:0,12 β:0,13 0,14 δ:0,16 α:0,45


0 1
ε:0,09 ζ:0,05

(3) 0,14 δ:0,16 0,25 α:0,45


0 1 0 1
ε:0,09 ζ:0,05 γ:0,12 β:0,13

(4) 0,25 0,30 α:0,45


0 1 0 1
γ:0,12 β:0,13 0,14 δ:0,16
0 1
ζ:0,05 ε:0,09

(5) α:0,45 0,55


0 1
0,25 0,30
0 1 0 1
γ:0,12 β:0,13 0,14 δ:0,16
0 1
ζ:0,05 ε:0,09

(6) 1,00
0 1

α:0,45 0,55
0 1

0,25 0,30
™¯‹Ì· 5.3 0 1 0 1
Παράδειγµα
γ:0,12 β:0,13 0,14 δ:0,16
λειτουργίας του
0 1
αλγορίθµου
Huffman. ζ:0,05 ε:0,09
5.3 ™Àª¶π∂™∏ ¢∂¢√ª∂¡ø¡ – ∫ø¢π∫∞™ HUFFMAN 121

HUFFMAN(C)
Q ¨ CREATEPRIORITYQUEUE(C);
for i ¨ 1 to |C| – 1 do
z ¨ CREATENODE();
x ¨ left(z) ¨ MIN(Q); DELETEMIN(Q);
y ¨ right(z) ¨ MIN(Q); DELETEMIN(Q);
f(z) ¨ f(x) + f(y);
INSERT(Q, z);
return MIN(Q);
Το Σχήµα 5.3 απεικονίζει τη λειτουργία του αλγορίθµου Huffman για το στιγµιότυ-
πο του Πίνακα 5.1. Ο αριθµός στη ρίζα κάθε υποδέντρου είναι η συχνότητα του υπο-
δέντρου και είναι ίσος µε το άθροισµα των συχνοτήτων όλων των χαρακτήρων / φύλ-
λων του υποδέντρου. Στο τέλος του αλγορίθµου, η συχνότητα της ρίζας θα είναι 1,00,
αφού όλοι οι χαρακτήρες θα έχουν ενσωµατωθεί σε ένα και µόνο δέντρο.
Όπως για κάθε άπληστο αλγόριθµο, για να αποδείξουµε ότι ο αλγόριθµος Huffman
υπολογίζει ένα βέλτιστο κώδικα, θα δείξουµε ότι το πρόβληµα της κωδικοποίησης
έχει την ιδιότητα της άπληστης επιλογής (Λήµµα 5.1) και την ιδιότητα των βέλτι-
στων επιµέρους δοµών (Λήµµα 5.2).

Λήµµα 5.1: Έστω C ένα σύνολο χαρακτήρων και x, y οι δύο χαρακτήρες του C
µε τις µικρότερες συχνότητες εµφάνισης. Υπάρχει ένας βέλτιστος
κώδικας για το C, τέτοιος, ώστε οι κωδικοί για τα x και y έχουν το
ίδιο µήκος και διαφέρουν µόνο στο τελευταίο δυαδικό ψηφίο,
δηλαδή ο κόµβος – πατέρας των x και y στο δυαδικό δέντρο ανα-
παράστασης του κώδικα είναι κοινός.
Απόδειξη: Έστω Τ το δέντρο αναπαράστασης ενός οποιουδήποτε βέλτιστου
κώδικα για το C, και έστω b, c δύο φύλλα – αδέλφια στο Τ που βρί-
σκονται σε µέγιστη απόσταση από τη ρίζα. Χωρίς βλάβη της γενι-
κότητας, µπορούµε να υποθέσουµε ότι f(b) £ f(c) και f(x) £ f(y).
Επίσης, αφού τα x και y έχουν τις µικρότερες συχνότητες εµφάνι-
σης, µπορούµε να θεωρήσουµε ότι f(x) £ f(b) και f(y) £ f(c). Όπως
φαίνεται στο Σχήµα 5.3, η αµοιβαία ανταλλαγή θέσης των x και b
δηµιουργεί ένα νέο δέντρο Τ1 και, στη συνέχεια, η αµοιβαία ανταλ-
λαγή θέσης των y και c δηµιουργεί ένα νέο δέντρο Τ2. Η διαφορά
στο κόστος των δέντρων T και T1 είναι:
122 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π

B(T ) - B(T1 ) = Â f ( c )d ( c ) - Â f ( c )d
cŒC
T
cŒC
T1 ( c )

= f ( x )dT ( x ) + f ( b )dT ( b ) - f ( x )dT1 ( x ) - f ( b )dT1 ( b )


= f ( x )dT ( x ) + f ( b )dT ( b ) - f ( x )dT ( b ) - f ( b )dT ( x )
= ( f ( b ) - f ( x ))( dT ( b ) - dT ( x ))
≥0 ,

αφού οι ποσότητες f(b) – f(x) ≥ 0 και dT(b) – dT(x) ≥ 0. Η διαφορά


dT(b) – dT(x) είναι µη αρνητική, επειδή το b επιλέχτηκε να έχει τη
µέγιστη απόσταση dT(b) από τη ρίζα στο δέντρο Τ. Οµοίως, απο-
δεικνύουµε ότι το κόστος του δέντρου Τ2 που προκύπτει από το Τ1
µε αµοιβαία ανταλλαγή θέσης των y και c έχει κόστος B(T2) £ B(T1)
£ B(T). Εποµένως, έχοντας υποθέσει ότι το δέντρο Τ αντιστοιχεί
σε ένα βέλτιστο κώδικα, έχουµε B(T2) = B(T). ∆ηλαδή, υπάρχει ένα
δέντρο αναπαράστασης ενός βέλτιστου κώδικα, όπου οι χαρακτή-
ρες x και y µε τις µικρότερες συχνότητες εµφάνισης είναι φύλλα –
αδέλφια µε τη µέγιστη απόσταση από τη ρίζα.

Το Λήµµα 5.1 δείχνει ότι η διαδικασία συνενώσεων για τη δηµιουργία ενός βέλτι-
στου κώδικα µπορεί να ξεκινήσει µε την άπληστη επιλογή της ένωσης των δύο χαρα-
κτήρων µε τις µικρότερες συχνότητες εµφάνισης. Η επιλογή αυτή χαρακτηρίζεται
ως άπληστη γιατί το άθροισµα των συχνοτήτων των κόµβων που ενώνονται σε ένα
κοινό υποδέντρο µπορεί να θεωρηθεί σαν το κόστος της συνένωσης. Μάλιστα, µπο-
ρεί να αποδειχθεί ότι το συνολικό κόστος του δέντρου είναι ίσο µε το άθροισµα του
κόστους όλων των συνενώσεων.

¢Ú·ÛÙËÚÈfiÙËÙ· 5.5

Αποδείξτε ότι το συνολικό κόστος Β(Τ) ενός δέντρου Τ είναι ίσο µε το άθροισµα
του κόστους όλων των συνενώσεων για τη δηµιουργία του Τ, όπου το κόστος κάθε
συνένωσης είναι ίσο µε το άθροισµα των συχνοτήτων των κόµβων – ριζών των
υποδέντρων που ενώνονται.
5.3 ™Àª¶π∂™∏ ¢∂¢√ª∂¡ø¡ – ∫ø¢π∫∞™ HUFFMAN 123

Λήµµα 5.2: Έστω Τ το δέντρο αναπαράστασης ενός βέλτιστου κώδικα για


κάποιο σύνολο χαρακτήρων C. Επίσης, έστω x, y δύο χαρακτήρες
του C που εµφανίζονται σαν φύλλα – αδέλφια στο Τ, και z ο κοι-
νός κόµβος – πατέρας των x και y. Αν θεωρήσουµε το z σαν ένα
χαρακτήρα µε συχνότητα εµφάνισης f(z) = f(x) + f(y), το δέντρο Τ¢
= Τ – {x, y} αναπαριστά ένα βέλτιστο κώδικα για το σύνολο χαρα-
κτήρων C¢ = C – {x, y} » {z}.
Απόδειξη: Αρχικά, θα συσχετίσουµε το κόστος των δέντρων Τ και Τ¢. Για κάθε
χαρακτήρα c Œ C – {x, y}, είναι dT(c) = dT΄(c) και f(c)dT(c) =
f(c)dT΄(c). Εποµένως, η όποια διαφορά των ποσοτήτων Β(Τ) και
Β(Τ΄) προκύπτει από την αντικατάσταση των φύλλων x και y από
το φύλλο z. Αφού το z είναι ο κοινός κόµβος – πατέρας των x και
y στο Τ, ισχύει ότι dT(x) = dT(y) = dT΄(z) + 1. Άρα,

B(T ) - B(T ' ) = f ( x )dT ( x ) + f ( y )dT ( y ) - f ( z )dT ' ( z )


= ( dT ' ( z ) + 1)( f ( x ) + f ( y )) - dT ' ( z )( f ( x ) + f ( y ))
= f ( x ) + f ( y ).

Ας υποθέσουµε ότι το Τ¢ δεν αναπαριστά ένα βέλτιστο κώδικα για


το σύνολο χαρακτήρων C≤ = C – {x, y} » {z}. Τότε, θα υπάρχει
ένα άλλο δέντρο Τ≤ κόστους Β(Τ≤) < Β(Τ¢) το οποίο θα αναπαρι-
στά έναν βέλτιστο κώδικα για το σύνολο C¢. Αφού το z θεωρείται
χαρακτήρας, θα εµφανίζεται σαν φύλλο στο δέντρο Τ≤. Προσθέ-
τοντας δύο φύλλα – παιδιά στο z, τα οποία αντιστοιχούν στους
χαρακτήρες x και y, παίρνουµε ένα δέντρο µε κόστος B(T≤) + f(x)
+ f(y) < Β(Τ¢) + f(x) + f(y) = B(Τ), το οποίο αναπαριστά έναν κώδι-
κα για το σύνολο C µε κόστος µικρότερο από αυτόν που αναπαρι-
στά το δέντρο Τ. Το γεγονός αυτός δεν µπορεί να συµβαίνει, γιατί
έχουµε υποθέσει ότι το δέντρο Τ αναπαριστά έναν βέλτιστο κώδι-
κα για το σύνολο C. Άρα, το δέντρο Τ¢ αναπαριστά έναν βέλτιστο
κώδικα για το σύνολο C¢ = C – {x, y} » {z}.

Τα Λήµµατα 5.1 και 5.2 δείχνουν ότι ο αλγόριθµος Huffman, ο οποίος σε κάθε βήµα
συνενώνει τους κόµβους µε τις µικρότερες συχνότητες και, στη συνέχεια, εφαρµό-
ζει τον εαυτό του για την επίλυση του στιγµιότυπου που προκύπτει από αυτή την
άπληστη επιλογή, όντως υπολογίζει ένα βέλτιστο κώδικα προθεµάτων για το σύνο-
λο χαρακτήρων C.
124 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π

¢Ú·ÛÙËÚÈfiÙËÙ· 5.6

Αποδείξτε ότι για κάθε βέλτιστο κώδικα, αν οι χαρακτήρες είναι διατεταγµένοι σε


αύξουσα σειρά ως προς τις συχνότητες εµφάνισης, τα µήκη των αντίστοιχων κωδι-
κών είναι επίσης διατεταγµένα σε αύξουσα σειρά.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 5.3

Έστω ότι έχουµε στη διάθεσή µας κέρµατα αξίας µίας, πέντε και είκοσι δραχµών,
και θέλουµε να δώσουµε ρέστα αξίας Χ δραχµών, χρησιµοποιώντας τον ελάχιστο
αριθµό κερµάτων. Περιγράψτε ένα άπληστο αλγόριθµο και αποδείξτε ότι αυτός
υπολογίζει µία βέλτιστη λύση. ∆ώστε ένα παράδειγµα συνόλου κερµάτων για τα
οποία ο άπληστος αλγόριθµος δεν εγγυάται τον υπολογισµό µιας βέλτιστης λύσης.

™‡ÓÔ„Ë
Σε αυτό το κεφάλαιο παρουσιάστηκε η µέθοδος της απληστίας για την επίλυση προ-
βληµάτων βελτιστοποίησης. Ένας άπληστος αλγόριθµος λειτουργεί σε βήµατα, ακο-
λουθώντας την επιλογή που φαίνεται καλύτερη σε κάθε βήµα. Όταν το πρόβληµα έχει
τις ιδιότητες της άπληστης επιλογής και των βέλτιστων επιµέρους δοµών, µπορούµε
να αποδείξουµε ότι η άπληστη στρατηγική των τοπικά βέλτιστων επιλογών, πράγµα-
τι, καταλήγει σε µία συνολικά βέλτιστη λύση.
Το πρώτο παράδειγµα άπληστου αλγορίθµου αφορούσε στην επίλυση ενός προβλή-
µατος επιλογής δραστηριοτήτων, οι οποίες έχουν συγκεκριµένους χρόνους έναρξης
και λήξης και ανταγωνίζονται για τη δέσµευση ενός κοινόχρηστου πόρου. Αποδείξα-
µε ότι ο άπληστος αλγόριθµος που κάθε φορά επιλέγει τη δραστηριότητα που ολο-
κληρώνεται πρώτη υπολογίζει ένα µέγιστου πληθικού αριθµού σύνολο αµοιβαία συµ-
βατών δραστηριοτήτων.
Στη συνέχεια, µελετήσαµε δύο παραλλαγές του προβλήµατος του σακιδίου, αµφότε-
ρες οι οποίες έχουν την ιδιότητα των βέλτιστων επιµέρους δοµών. Η 0 – 1 παραλλα-
γή δεν έχει την ιδιότητα της άπληστης επιλογής και απαιτεί την εφαρµογή δυναµικού
προγραµµατισµού για τον υπολογισµό µιας βέλτιστης λύσης, ενώ η κλασµατική παραλ-
λαγή επιλύεται βέλτιστα από έναν απλό, άπληστο αλγόριθµο που βασίζεται στο λόγο
αξίας προς µέγεθος κάθε αντικειµένου.
Ένα άλλο παράδειγµα εφαρµογής της µεθόδου της απληστίας είναι ο αλγόριθµος του
Huffman για τον υπολογισµό ενός βέλτιστου κώδικα µεταβλητού µήκους για ένα σύνο-
λο χαρακτήρων C.
B I B § I O ° PA º I A 125

µÈ‚ÏÈÔÁÚ·Ê›·

Η µέθοδος της απληστίας παρουσιάζεται πολύ καλά στα:


[1] T.H. Cormen, C.E. Leiserson και R. L. Rivest. Introduction to Algorithms. MIT
Press, 1990.
[2] G. Brassard και P. Bratley. Algorithmics: Theory and Practice. Prentice – Hall,
1988.
Η βασική ιδέα και η ανάλυση του αλγόριθµου για την επιλογή ανταγωνιστικών δρα-
στηριοτήτων είναι από:
[3] F. Gavril. Algorithms for minimum coloring, maximum clique, minimum covering
by cliques, and maximum independent set of a chordal graph. SIAM Journal on
Computing, 1(2):180 – 187, 1972.
Ο κώδικας Huffman παρουσιάστηκε για πρώτη φορά στο:
[4] D.A. Huffman. A method for the construction of minimum redundancy codes.
Proceedings of the IRE, 40(9):1098 – 1101, 1952.
∞ÏÁfiÚÈıÌÔÈ ∂ÍÂÚ‡ÓËÛ˘ °Ú·ÊËÌ¿ÙˆÓ

™ÎÔfi˜
∫ ∂

Σκοπός αυτού του κεφαλαίου είναι η εισαγωγή στους αλγόριθµους που επεξεργάζο-
νται γραφήµατα. Τους βασικούς ορισµούς ακολουθεί η παρουσίαση δύο εναλλακτι-
κών τρόπων αναπαράστασης ενός γραφήµατος ώστε να µπορεί να επεξεργαστεί από
6
º

έναν αλγόριθµο. Στη συνέχεια, παρουσιάζονται και αναλύονται οι αλγόριθµοι Ψαξί-


∞ § ∞ π √

µατος Πρώτα σε Πλάτος και Ψαξίµατος Πρώτα σε Βάθος, οι οποίοι χρησιµοποιού-


νται για την εξερεύνηση και την ανίχνευση πολλών θεµελιωδών ιδιοτήτων ενός γρα-
φήµατος.

¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·

Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση:

• Να αναπαριστά ένα γράφηµα µε την λίστα γειτονικότητας και τον πίνακα γειτονι-
κότητας.

• Να εφαρµόζει την τεχνική του Ψαξίµατος Πρώτα σε Βάθος για την εξερεύνηση
ενός γραφήµατος.

• Να εφαρµόζει την τεχνική του Ψαξίµατος Πρώτα σε Πλάτος και να αναφέρει τις
ιδιότητές της.

• Να εφαρµόζει τις τεχνικές του Ψαξίµατος Πρώτα σε Βάθος και Ψαξίµατος Πρώτα
σε Πλάτος για την επίλυση απλών προβληµάτων.

ŒÓÓÔȘ ÎÏÂȉȿ
• γράφηµα τονικότητας
• κατευθυντικό και µη κατευθυντικό • ψάξιµο πρώτα σε βάθος
γράφηµα • ψάξιµο πρώτα σε πλάτος
• λίστα γειτονικότητας και πίνακας γει- • συνεκτικό γράφηµα

∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Ένα γράφηµα είναι ένα σύνολο κορυφών, κάποιες από τις οποίες ενώνονται µε ακµές
/ γραµµές. Αυτή η πολύ απλή µαθηµατική οντότητα επιτρέπει την κοµψή µοντελο-
ποίηση πολλών και σηµαντικών υπολογιστικών προβληµάτων. Επιπλέον, το γράφη-
128 K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡

µα έχει µελετηθεί εκτενώς σαν µαθηµατική οντότητα στα πλαίσια της Θεωρίας Γρα-
φηµάτων, τα αποτελέσµατα της οποίας µας οδηγούν συχνά στο σχεδιασµό κοµψών
και αποδοτικών αλγόριθµων για πολλά υπολογιστικά προβλήµατα που µοντελοποι-
ούνται µε τη βοήθεια γραφηµάτων.
Όµως, για να γίνει δυνατή η αποδοτική επεξεργασία ενός γραφήµατος από έναν αλγό-
ριθµο, πρέπει το γράφηµα να αναπαρασταθεί σε µία κατάλληλη δοµή δεδοµένων. Σε
αυτό το κεφάλαιο θα παρουσιάσουµε της µορφές αναπαράστασης ενός γραφήµατος
µε τη Λίστα Γειτονικότητας και τον Πίνακα Γειτονικότητας των κορυφών του. Αυτές
οι µορφές αναπαράστασης είναι οι πλέον συνηθισµένες και χρησιµοποιούνται από
την συντριπτική πλειοψηφία των γνωστών αλγόριθµων.
Από τους αλγόριθµους που επεξεργάζονται γραφήµατα, οι πλέον στοιχειώδεις είναι
οι αλγόριθµοι εξερεύνησης γραφηµάτων. Με τον όρο εξερεύνηση δηλώνεται η συστη-
µατική επίσκεψη των κορυφών του γραφήµατος ακολουθώντας τις ακµές που υπάρ-
χουν µεταξύ τους. Όπως θα δούµε, οι αλγόριθµοι εξερεύνησης γραφηµάτων µπορούν
να ανιχνεύσουν πολλές βασικές ιδιότητες ενός γραφήµατος και να εφαρµοστούν για
τη λύση πολλών προβληµάτων.
Για παράδειγµα, ένα δίκτυο υπολογιστών µπορεί να αναπαρασταθεί από ένα γράφηµα,
όπου οι κορυφές αναπαριστούν υπολογιστές και άλλες ενεργές συσκευές, και οι ακµές
τις δικτυακές συνδέσεις. Το θεµελιώδες πρόβληµα της αξιοπιστίας ενός δικτύου ανά-
γεται στον έλεγχο συνεκτικότητας ενός τέτοιου γραφήµατος όταν κάποιες ακµές τεθούν
εκτός λειτουργίας. Η συνεκτικότητα είναι µία θεµελιώδης ιδιότητα ενός γραφήµατος η
οποία µπορεί εύκολα να ανιχνευθεί µε την εφαρµογή ενός αλγόριθµου εξερεύνησης.
Επιπλέον, οι αλγόριθµοι εξερεύνησης παρέχουν χρήσιµη πληροφορία για τη δοµή
ενός γραφήµατος. Έτσι, πολλοί αλγόριθµοι γραφηµάτων ξεκινούν τη λειτουργία τους
µε την εφαρµογή ενός αλγόριθµου εξερεύνησης για να αποκτήσουν τέτοιου είδους
πληροφορία που είναι απαραίτητη για τα επόµενα στάδια της λειτουργίας τους.
Σε αυτό το κεφάλαιο, θα παρουσιαστούν οι αλγόριθµοι του Ψαξίµατος Πρώτα σε
Πλάτος (Breadth First Search) και του Ψαξίµατος Πρώτα σε Βάθος (Depth First
Search) για την εξερεύνηση ενός γραφήµατος, και θα µελετηθούν οι σηµαντικότερες
από τις ιδιότητές τους.
Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες:
6.1. Ορισµοί και Αναπαράσταση Γραφηµάτων
6.2. Ψάξιµο Πρώτα σε Πλάτος
6.3. Ψάξιµο Πρώτα σε Βάθος
6 . 1 √ ƒ π ™ ª √ π ∫ ∞ π ∞ ¡ ∞ ¶ ∞ ƒ∞ ™ ∆∞ ™ ∏ ° ƒ∞ º ∏ ª ∞∆ ø ¡ 129

6.1 √ÚÈÛÌÔ› Î·È ·Ó··Ú¿ÛÙ·ÛË ÁÚ·ÊËÌ¿ÙˆÓ

Ένα γράφηµα G = (V, E) ή απλούστερα, G(V, E) είναι ένα διατεταγµένο ζεύγος το


οποίο αποτελείται από το σύνολο των κορυφών (vertices, ή κόµβων – nodes) V και
από το σύνολο των ακµών (edges) Ε. Οι ακµές ενός γραφήµατος µπορεί να είναι
κατευθυνόµενες, οπότε το γράφηµα ονοµάζεται κατευθυντικό (directed graph, ή
digraph) ή µη κατευθυνόµενες, οπότε το γράφηµα ονοµάζεται µη κατευθυντικό
(undirected graph).
Το σύνολο Ε των ακµών ενός κατευθυντικού γραφήµατος είναι υποσύνολο του καρ-
τεσιανού γινοµένου V ¥ V (E Õ V ¥ V). Εποµένως, αν v, w είναι δύο κορυφές ενός
κατευθυντικού γραφήµατος, η ακµή (v, w) είναι διαφορετική από την ακµή (w, v).
Οι ακµές ενός κατευθυντικού γραφήµατος αναπαρίσταται µε βέλη, µε τη φορά του
βέλους προς τη δεύτερη κορυφή του διατεταγµένου ζεύγους (Σχήµα 6.1(α)).
Το σύνολο Ε των ακµών ενός µη κατευθυντικού γραφήµατος αποτελείται από µη
διατεταγµένα ζεύγη κορυφών. Στην περίπτωση ενός µη κατευθυντικού γραφήµατος,
η ακµή {v, w} είναι ίδια µε την ακµή {w, v}, γεγονός που υποδηλώνεται συµβολί-
ζοντας τις ακµές µε απλές γραµµές (Σχήµα 6.1.(β)). Μερικές φορές, καταχρηστικά
συµβολίζουµε µία µη κατευθυνόµενη ακµή µεταξύ των κορυφών v και w µε (v, w).

1 3 5 1 3 5

2 4 6 2 4 6

(α) (β)

1 3 5

™¯‹Ì· 6.1
Παραδείγµατα
2 4 6
κατευθυντικών και
µη κατευθυντικών
(γ) γραφηµάτων.

Μία ακµή (v, w) ενός κατευθυντικού γραφήµατος λέµε ότι ξεκινάει από την κορυφή
v και καταλήγει στην κορυφή w. Μία ακµή {v, w} ενός κατευθυντικού γραφήµατος
λέµε ότι συντρέχει στις κορυφές v και w.
130 K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡

∆ύο κορυφές που συνδέονται από µία µη κατευθυνόµενη ακµή {v, w} λέµε ότι είναι
γειτονικές. Για δύο κορυφές που συνδέονται από µία κατευθυνόµενη ακµή (v, w),
λέµε ότι η κορυφή w είναι γειτονική της κορυφής v. Στα µη κατευθυντικά γραφήµα-
τα, η σχέση γειτονικότητας των κορυφών είναι συµµετρική, δηλαδή όταν η κορυφή
w είναι γειτονική της κορυφής v, τότε και η v είναι γειτονική της w. Προφανώς, αυτό
δεν ισχύει απαραίτητα στα κατευθυντικά γραφήµατα.
Στις ακµές ενός γραφήµατος G(V, E) µπορούµε να αντιστοιχίσουµε βάρη µέσω µίας
συνάρτησης w : E Æ ΙR. Σε αυτή την περίπτωση, το γράφηµα ονοµάζεται βεβαρη-
µένο γράφηµα (weighted graph) και, µερικές φορές, συµβολίζεται µε G(V, E, w).
Επίσης, σε µερικές περιπτώσεις τα βάρη ερµηνεύονται σαν µήκη των ακµών.
Ο βαθµός µίας κορυφής v ενός µη κατευθυντικού γραφήµατος είναι ο αριθµός των
ακµών που συντρέχουν στην v. Για παράδειγµα, στο Σχήµα 6.1.(β), η κορυφή 2 έχει
βαθµό 2, ενώ η κορυφή 5 έχει βαθµό 1. Στα κατευθυντικά γραφήµατα διακρίνουµε
τον αριθµό των ακµών που ξεκινούν από µία κορυφή v, ο οποίος ονοµάζεται βαθ-
µός εξόδου της v, και τον αριθµό των ακµών που καταλήγουν σε µία κορυφή v, ο
οποίος ονοµάζεται βαθµός εισόδου της v. Για παράδειγµα, στο Σχήµα 6.1.(α), ο βαθ-
µός εξόδου της κορυφής 3 είναι 3, ενώ ο βαθµός εισόδου της ίδιας κορυφής είναι 1.

¢Ú·ÛÙËÚÈfiÙËÙ· 6.1

Έστω G(V, E) ένα µη κατευθυντικό γράφηµα. Αποδείξτε ότι το άθροισµα των βαθ-
µών όλων των κορυφών είναι ίσο µε το διπλάσιο του αριθµού των ακµών. ∆ηλα-
δή, αν deg(v) ο βαθµός κάθε κορυφής v, αποδείξτε ότι Â v ŒV
deg( v ) = 2 | E | .

Ένα µονοπάτι (path) µήκους k από µία κορυφή v σε µία κορυφή v¢ ενός γραφήµατος
G(V, E) είναι µία ακολουθία <v0, v1, …, vk – 1, vk> κορυφών, όπου v = v0, v¢ = vk, και
(vi – 1, vi) Œ E, για κάθε i = 1, …, k. Το µονοπάτι περιέχει τις κορυφές v0, v1, …, vk, και
τις ακµές (v0, v1), (v1, v2), …, (vk – 1, vk). Αν στις ακµές του γραφήµατος G έχουν αντι-
στοιχηθεί µήκη, τότε το µήκος του µονοπατιού είναι ίσο µε το άθροισµα των µηκών
των ακµών που περιέχει. Αν υπάρχει ένα µονοπάτι από µία κορυφή v0 σε µία άλλη
κορυφή vk, λέµε ότι η vk είναι προσπελάσιµη (reachable) από τη v0. Ένα µονοπάτι p
είναι απλό (simple), αν όλες οι κορυφές που περιέχει το p είναι διαφορετικές µεταξύ
τους. Για παράδειγµα, στο Σχήµα 6.1.(α), το µονοπάτι <1, 3, 4, 6> είναι απλό, ενώ το
µονοπάτι <2, 1, 3, 2, 4> δεν είναι απλό, επειδή περιέχει δύο φορές την κορυφή 2.
Αν µία κορυφή v΄ είναι προσπελάσιµη από µία κορυφή v, τότε η απόσταση της v΄
6 . 1 √ ƒ π ™ ª √ π ∫ ∞ π ∞ ¡ ∞ ¶ ∞ ƒ∞ ™ ∆∞ ™ ∏ ° ƒ∞ º ∏ ª ∞∆ ø ¡ 131

από τη v είναι το µήκος το συντοµότερου µονοπατιού (shortest path), δηλαδή ενός


µονοπατιού ελάχιστου µήκους, από τη v στη v¢. Στην περίπτωση που όλες οι ακµές
του γραφήµατος έχουν µοναδιαίο µήκος, το συντοµότερο µονοπάτι είναι απλά ένα
µονοπάτι που περιέχει τον ελάχιστο αριθµό ακµών.
Ένας κύκλος (cycle) είναι ένα µονοπάτι του οποίου η πρώτη και η τελευταία κορυ-
φή ταυτίζονται και έχει µήκος τουλάχιστον 1. Ένας κύκλος µήκους 1 ονοµάζεται
βρόγχος (self – loop) και είναι µία ακµή που αρχίζει και τελειώνει στην ίδια κορυφή
(Σχήµα 6.1.(α), κορυφή 6). Ένα γράφηµα ονοµάζεται απλό όταν δεν έχει βρόγχους.
Ένας κύκλος ονοµάζεται απλός όταν όλες οι κορυφές, εκτός της πρώτης, είναι δια-
φορετικές. Για παράδειγµα, στο Σχήµα 6.1.(α), ο κύκλος <1, 3, 2, 1> είναι απλός,
ενώ ο κύκλος <1, 3, 2, 4, 2, 1> δεν είναι, αφού περιέχει την κορυφή 2 περισσότερες
από µία φορές. ∆ύο κύκλοι <v0, v1, …, vk, v0> και <w0, w1, …, wk, w0> είναι ίδιοι
όταν επισκέπτονται τις ίδιες κορυφές στην ίδια σειρά ή τυπικά, υπάρχει ένας ακέ-
ραιος j, τέτοιος, ώστε vi = w(i + j) mod k, για κάθε i = 0, 1, …, k. Ένα γράφηµα χωρίς
κύκλους ονοµάζεται ακυκλικό (acyclic).
Ένα γράφηµα G¢(V¢, Ε¢) είναι υπογράφηµα (subgraph) ενός γραφήµατος G(V, E) όταν
V¢ Õ V και Ε¢ Õ E. ∆εδοµένου ενός υποσυνόλου κορυφών V¢ Õ V, το υπογράφηµα
του G που ορίζεται από το V¢ (induced subgraph) είναι το γράφηµα G¢(V¢, E¢), όπου
Ε¢ = {(v, w) Œ E: v, w Œ V¢ }.
Ένα µη κατευθυντικό γράφηµα ονοµάζεται συνεκτικό (connected), όταν για κάθε
ζευγάρι κορυφών, υπάρχει ένα µονοπάτι µεταξύ τους. Όταν ένα γράφηµα G(V, E)
δεν είναι συνεκτικό, µπορεί να διαιρεθεί σε συνεκτικές συνιστώσες (connected
components), οι οποίες είναι συνεκτικά υπογραφήµατα του G, που ορίζονται από µία
διαµέριση των κορυφών του V. Για παράδειγµα, το γράφηµα του Σχήµατος 6.1.(β)
είναι συνεκτικό, ενώ το γράφηµα του Σχήµατος 6.1.(γ) έχει δύο συνεκτικές συνι-
στώσες που ορίζονται από τα υποσύνολα κορυφών {1, 2, 3, 4} και {5, 6}. Οι συνε-
κτικές συνιστώσες ενός γραφήµατος είναι οι κλάσεις ισοδυναµίας στις οποίες διαι-
ρείται το σύνολο των κορυφών από τη σχέση «η κορυφή u είναι προσπελάσιµη από
την κορυφή v».
Ένα κατευθυντικό γράφηµα ονοµάζεται ισχυρά συνεκτικό (strongly connected), όταν
οποιεσδήποτε δύο κορυφές u, v είναι αµοιβαία προσπελάσιµες, δηλαδή τόσο η v είναι
προσπελάσιµη από τη u, όσο και η u είναι προσπελάσιµη από τη v. Όταν ένα κατευ-
θυντικό γράφηµα G(V, E) δεν είναι ισχυρά συνεκτικό, τότε µπορεί να διαιρεθεί σε
ισχυρά συνεκτικές συνιστώσες (strongly connected components), οι οποίες είναι ισχυ-
ρά συνεκτικά υπογραφήµατα του G, που ορίζονται από µία διαµέριση των κορυφών
132 K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡

του V. Για παράδειγµα, το γράφηµα του Σχήµατος 6.1.(α) αποτελείται από τρεις ισχυ-
ρά συνεκτικές συνιστώσες που ορίζονται από τα σύνολα κορυφών {1, 2, 4, 5}, {3},
και {6}. Οι ισχυρά συνεκτικές συνιστώσες ενός γραφήµατος είναι οι κλάσεις ισο-
δυναµίας στις οποίες διαιρείται το σύνολο των κορυφών από τη σχέση «οι κορυφές
u, v είναι αµοιβαία προσπελάσιµες».
™¯‹Ì· 6.2
1 3 5
Ένα παράδειγµα
άκυκλου,
συνεκτικού
γραφήµατος –
δέντρου. 2 4 6

Ανάλογα µε τις ιδιότητές τους, µπορούµε να διακρίνουµε διάφορα είδη γραφηµά-


των. Μία από τις σηµαντικότερες κατηγορίες γραφηµάτων είναι τα δέντρα, τα οποία
έχουµε ήδη χρησιµοποιήσει σε αρκετές περιπτώσεις (π.χ. για την αναπαράσταση του
αναπτύγµατος αναδροµικών εξισώσεων, της λειτουργίας «διαίρει και βασίλευε»
αλγορίθµων, κωδίκων προθεµάτων κλπ.). ∆έντρο (tree) ονοµάζεται κάθε άκυκλο,
συνεκτικό γράφηµα (Σχήµα 6.2). Γραφήµατα τα οποία είναι άκυκλα, αλλά όχι συνε-
κτικά, ονοµάζονται δάση (forests).
Οι σηµαντικότερες ιδιότητες των δέντρων συνοψίζονται στο παρακάτω θεώρηµα, το
οποίο παρατίθεται χωρίς απόδειξη.

Θεώρηµα 6.1 Έστω G(V, E) ένα µη κατευθυντικό γράφηµα. Οι ακόλουθες προ-


τάσεις είναι ισοδύναµες:
(1) Το γράφηµα G είναι δέντρο.
(2) Οποιεσδήποτε δύο κορυφές το G ενώνονται µέσω ενός µοναδικού, απλού
µονοπατιού.
(3) Το γράφηµα G είναι συνεκτικό, αλλά αν µία οποιαδήποτε ακµή του Ε αφαι-
ρεθεί, το γράφηµα που προκύπτει δεν είναι συνεκτικό.
(4) Το γράφηµα G είναι συνεκτικό και έχει ακριβώς |V| – 1 ακµές.
(5) Το γράφηµα G είναι άκυκλο και έχει ακριβώς |V| – 1 ακµές.
(6) Το γράφηµα G είναι άκυκλο, αλλά αν µία οποιαδήποτε ακµή προστεθεί στο
Ε, το γράφηµα που προκύπτει περιέχει κύκλο.
6 . 1 √ ƒ π ™ ª √ π ∫ ∞ π ∞ ¡ ∞ ¶ ∞ ƒ∞ ™ ∆∞ ™ ∏ ° ƒ∞ º ∏ ª ∞∆ ø ¡ 133

¢Ú·ÛÙËÚÈfiÙËÙ· 6.2

Αποδείξτε ότι ένα γράφηµα G(V, E) είναι δέντρο αν και µόνο αν οποιεσδήποτε δύο
κορυφές του G ενώνονται µε ένα µοναδικό µονοπάτι.

6.1.1 ∞Ó··Ú¿ÛÙ·ÛË ÁÚ·ÊËÌ¿ÙˆÓ

Η επεξεργασία ενός γραφήµατος από έναν αλγόριθµο απαιτεί την αναπαράσταση


του γραφήµατος µέσω µιας κατάλληλης δοµής δεδοµένων. Οι πιο συνηθισµένοι τρό-
ποι αναπαράστασης ενός γραφήµατος είναι µέσω της λίστας γειτονικότητας
(adjacency list) και µέσω του πίνακα γειτονικότητας (adjacency matrix).
Η λίστα γειτονικότητας για ένα γράφηµα G(V, E) αποτελείται από έναν πίνακα Α, ο
οποίος περιέχει |V| λίστες, µία για κάθε κορυφή του γραφήµατος G. Για κάθε κορυ-
φή v Œ V, η λίστα Α[v] αποτελείται από όλες τις κορυφές που είναι γειτονικές της
κορυφής v. Αν το γράφηµα G είναι βεβαρηµένο, µαζί µε κάθε γειτονική κορυφή της
v αποθηκεύεται και το βάρος της αντίστοιχης ακµής. Προφανώς, το µέγεθος της
λίστας A[v] είναι ίσο µε το βαθµό της v (το βαθµό εξόδου για κατευθυντικά γραφή-
µατα), και ο αριθµός των θέσεων µνήµης που απαιτούνται για την αναπαράσταση
του γραφήµατος G είναι O(|V| + |E|).
Για την αναπαράσταση ενός γραφήµατος G(V, E) µε τον πίνακα γειτονικότητας, υπο-
θέτουµε ότι στις κορυφές του συνόλου V έχουν αντιστοιχηθεί οι αριθµοί 1, 2, …, |V|.
Ο πίνακας γειτονικότητας Α έχει µέγεθος |V| ¥ |V| και το στοιχείο A[i, j] είναι 1, αν
(i, j) Œ E, και 0, διαφορετικά. Στην περίπτωση που το γράφηµα G είναι βεβαρηµέ-
νο, το στοιχείο A[i, j] είναι ίσο µε το βάρος w(i, j) της ακµής (i, j) ή έχει µία ειδική
τιµή, όταν η ακµή (i, j) δεν υπάρχει. Προφανώς, ο αριθµός των θέσεων µνήµης που
απαιτεί η αναπαράσταση µε πίνακα γειτονικότητας είναι Θ(|V|2). Όταν το γράφηµα ™¯‹Ì· 6.3
G είναι µη κατευθυντικό, µπορούµε να µειώσουµε τον αριθµό των θέσεων µνήµης Παράδειγµα
στο µισό, αποθηκεύοντας µόνο τα στοιχεία Α[i, j], όπου 1 £ i < j £ |V|, αφού η σχέση αναπαράστασης
γειτονικότητας είναι συµµετρική για τα µη κατευθυντικά γραφήµατα. κατευθυντικού
γραφήµατος.
1 3 /
1 2 3 4 5 6
1 3 5
2 1 4 / 1 0 0 1 0 0 0
3 2 4 5 / 2 1 0 0 1 0 0
3 0 1 0 1 1 0
4 2 4 / 4 0 1 0 0 0 1
5 6 / 5 0 0 0 0 0 1
2 4 6
6 0 0 0 0 0 1
6 6 /
134 K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡

Στο Σχήµα 6.3 απεικονίζεται ένα παράδειγµα αναπαράστασης ενός κατευθυντικού


γραφήµατος µε λίστα γειτονικότητας και πίνακα γειτονικότητας, ενώ στο Σχήµα 6.4
απεικονίζεται ένα παράδειγµα αναπαράστασης ενός µη κατευθυντικού γραφήµατος.
Όταν το γράφηµα G είναι αραιό (sparse), δηλαδή έχει αριθµό ακµών ασυµπτωτικά
µικρότερο από |V|2, |Ε| = ο(|V|2), η αναπαράσταση µε λίστα γειτονικότητας χρησι-
µοποιεί ασυµπτωτικά λιγότερες θέσεις µνήµης από αυτή µε πίνακα γειτονικότητας.
Αντίθετα, όταν το γράφηµα G είναι πυκνό (dense), δηλαδή όταν |E| = Θ(|V|2), ο αριθ-
µός των θέσεων µνήµης που χρησιµοποιείται από τις δύο αναπαραστάσεις δεν δια-
φέρει σηµαντικά. Από την άλλη πλευρά, η αναπαράσταση µε πίνακα γειτονικότητας
™¯‹Ì· 6.4
πλεονεκτεί γιατί, δεδοµένων δύο κορυφών v, w Œ V, η ύπαρξη της ακµής (v, w) µπο-
Παράδειγµα
ρεί να διαπιστωθεί σε σταθερό χρόνο εξετάζοντας το αντίστοιχο στοιχείο του πίνα-
αναπαράστασης
κα, ενώ στην περίπτωση της λίστας γειτονικότητας πρέπει να εξετάσουµε όλα τα
µη κατευθυντικού
γραφήµατος. στοιχεία της λίστας A[v], τα οποία µπορεί να είναι µέχρι και |V|.

1 2 3 /
1 2 3 4 5 6
1 3 5
2 1 3 / 1 0 1 1 0 0 0
3 1 2 4 5 / 2 1 0 1 0 0 0
3 1 1 0 1 1 0
4 3 6 / 4 0 0 1 0 0 1
5 3 / 5 0 0 1 0 0 0
2 4 6
6 0 0 0 1 0 0
6 4 /

Στους αλγόριθµους που ακολουθούν, θα θεωρούµε ότι το γράφηµα εισόδου αναπα-


ρίσταται µε λίστα γειτονικότητας, εκτός αν ρητά αναφέρεται κάτι διαφορετικό.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 6.1

Το τετράγωνο ενός γραφήµατος G(V, E) είναι το γράφηµα G2(V, E2), το οποίο


περιέχει µία ακµή (u, w) Œ E2 αν και µόνο αν (u, w) Œ E ή υπάρχει κορυφή v Œ V
τέτοια, ώστε αµφότερες οι (u, v) και (v, w) είναι ακµές του G. ∆ηλαδή, το G2 περιέ-
χει µία ακµή (u, w), όταν το G περιέχει ένα µονοπάτι από τη u στη w µήκους µικρό-
τερου ή ίσου του 2. Περιγράψτε αποδοτικούς αλγορίθµους για τον υπολογισµό του
G2 στις περιπτώσεις που το G αναπαρίσταται µε λίστα γειτονικότητας, και µε πίνα-
κα γειτονικότητας.
6 . 2 æ ∞ • π ª √ ¶ ƒ ø ∆∞ ™ ∂ ¶ § ∞∆ √ ™ 135

6.2 æ¿ÍÈÌÔ ÚÒÙ· ÛÂ Ï¿ÙÔ˜

Το Ψάξιµο Πρώτα σε Πλάτος (ΨΠΠ – Breadth First Search) είναι ένας από τους
απλούστερους αλγόριθµους για την εξέταση ενός γραφήµατος, ενώ η βασική του
ιδέα βρίσκει εφαρµογή και σε αλγόριθµους για άλλα προβλήµατα (π.χ., υπολογισµός
συντοµότερων µονοπατιών, ελάχιστου γενετικού δέντρου).
∆εδοµένου ενός γραφήµατος G(V, E) και µιας αρχικής κορυφής s Œ V, ο αλγόριθµος
του Ψαξίµατος Πρώτα σε Πλάτος διερευνά τις ακµές του G, προσπαθώντας να ανακα-
λύψει / επισκεφθεί όλες τις κορυφές που είναι προσπελάσιµες από την s. Ο αλγόριθµος
ΨΠΠ λειτουργεί τόσο σε κατευθυντικά όσο και σε µη κατευθυντικά γραφήµατα.
Ο αλγόριθµος ΨΠΠ εξερευνά τις κορυφές µε σειρά που καθορίζεται από τη λίστα
γειτονικότητας του G. Αρχικά, επισκέπτεται όλες τις γειτονικές κορυφές της s. Για
κάθε κορυφή v γειτονική της s (κάθε τέτοια κορυφή v βρίσκεται σε απόσταση 1 από
την s), ο αλγόριθµος ΨΠΠ επισκέπτεται όλες τις κορυφές που είναι γειτονικές της v
και δεν έχει επισκεφθεί / ανακαλύψει προηγουµένως (αυτές οι κορυφές βρίσκονται
σε απόσταση ακριβώς 2 από την s). Στη συνέχεια, για κάθε κορυφή v που βρίσκεται
σε απόσταση ακριβώς 2 από την s, το ΨΠΠ επισκέπτεται όλες τις κορυφές που είναι
γειτονικές της v και δεν έχει ανακαλύψει προηγουµένως. Γενικότερα, στην k – οστή
επανάληψη, ο αλγόριθµος ΨΠΠ ανακαλύπτει όλες τις κορυφές που βρίσκονται σε
απόσταση ακριβώς k από την s. Το όνοµα του ΨΠΠ προέρχεται ακριβώς από το γεγο-
νός ότι επισκέπτεται όλες τις κορυφές σε απόσταση k, πριν επισκεφθεί οποιαδήπο-
τε κορυφή σε απόσταση k + 1. ∆ηλαδή, το ΨΠΠ λειτουργεί επεκτείνοντας οµοιό-
µορφα και κατά πλάτος το νοητό όριο µεταξύ των κορυφών που έχει επισκεφθεί και
αυτών που δεν έχει επισκεφθεί (βλ. Σχήµα 6.5).
Από την περιγραφή της στρατηγικής του ΨΠΠ, µπορούµε να διακρίνουµε τρία είδη
κορυφών: Τις κορυφές που το ΨΠΠ δεν έχει ακόµη επισκεφθεί, τις κορυφές που το
ΨΠΠ έχει επισκεφθεί, αλλά πιθανόν υπάρχουν κάποιες γειτονικές κορυφές τους που
δεν έχουν ανακαλυφθεί από το ΨΠΠ, και τις κορυφές που, τόσο αυτές όσο και όλες
οι γειτονικές τους, έχουν ανακαλυφθεί από το ΨΠΠ.
Για να διευκολύνουµε την περιγραφή του αλγορίθµου, αντιστοιχούµε στις τρεις παρα-
πάνω κατηγορίες κορυφών τα χρώµατα λευκό, γκρίζο και µαύρο. Αρχικά, όλες οι
κορυφές είναι λευκές, αφού καµία δε έχει ακόµη ανακαλυφθεί από το ΨΠΠ. Την
πρώτη φορά που το ΨΠΠ επισκέπτεται µία λευκή κορυφή, αυτή βάφεται γκρίζα. Οι
γκρίζες κορυφές µπορεί να έχουν κάποιες γειτονικές λευκές κορυφές, δηλαδή γειτο-
νικές κορυφές που το ΨΠΠ δεν έχει επισκεφθεί ακόµη. Μία γκρίζα κορυφή βάφεται
µαύρη, όταν το ΨΠΠ επισκεφθεί όλες τις γειτονικές κορυφές της. Για να βαφτεί µαύρη
µία κορυφή v, πρέπει πρώτα να έχουν βαφτεί γκρίζες ή µαύρες όλες οι γειτονικές της.
136 K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡

Για να εξασφαλίζεται η κατά πλάτος διεύρυνση του συνόλου των κορυφών που το
ΨΠΠ έχει επισκεφθεί, η σειρά µε την οποία οι γκρίζες κορυφές βάφονται µαύρες
είναι ίδια µε τη σειρά που οι λευκές κορυφές βάφονται γκρίζες. Γι’ αυτό ο αλγόριθ-
µος διατηρεί µία FIFO ουρά Q, στο τέλος της οποίας τοποθετείται κάθε κορυφή που
µόλις άλλαξε χρώµα από λευκό σε γκρίζο. Η επόµενη κορυφή που θα αλλάξει χρώµα
από γκρίζο σε µαύρο είναι πάντα η πρώτη κορυφή της ουράς Q.
Επιπλέον, το ΨΠΠ διατηρεί έναν πίνακα p, ο οποίος έχει µία εγγραφή για κάθε κορυ-
φή v Œ V, και το στοιχείο p[v] έχει την τιµή της κορυφής από την οποία το ΨΠΠ επι-
σκέφθηκε την v. ∆ηλαδή, αν p[v] = u, το ΨΠΠ χρησιµοποίησε την ακµή (u, v) για
να επισκεφθεί την v.
Στη συνέχεια, παρατίθεται ο ψευδοκώδικας του ΨΠΠ. Στον παρακάτω ψευδοκώδι-
κα, η εντολή «u ¨ head[Q];» δηλώνει στη µεταβλητή u εκχωρείται η τιµή του πρώ-
του στοιχείου της ουράς Q, ενώ ταυτόχρονα αυτό το στοιχείο αφαιρείται από την
ουρά, ενώ η εντολή «tail[Q] ¨ v;» δηλώνει ότι στην ουρά Q προστίθεται ένα ακόµη
στοιχείο που έχει την τιµή v.
涶(G(V, E), s)
for all v ΠV Р{s} do
color[v] ¨ §∂À∫√; p[v] ¨ NIL;

color[s] ¨ °∫ƒπ∑√; tail[Q] ¨ s; p[s] ¨ NIL;

while Q π ∆ do
u ¨ head[Q]; Q ¨ Q – {u};
for all v ΠA[u] do
if color[v] = §∂À∫√ then
color[v] ¨ °∫ƒπ∑√; tail[Q] ¨ v; p[v] ¨ u;
color[u] ¨ ª∞Àƒ√;
Κάθε κορυφή αλλάζει µία φορά χρώµα από λευκό σε γκρίζο, και µία φορά χρώµα
από γκρίζο σε µαύρο. Στην πρώτη αλλαγή χρώµατος, η κορυφή προστίθεται στο
τέλος της ουράς Q, ενώ στη δεύτερη αλλαγή χρώµατος η κορυφή αφαιρείται από την
αρχή της Q. Αφού η Q είναι µία απλή FIFO ουρά, οι παραπάνω λειτουργίες εκτε-
λούνται σε χρόνο Θ(|V|). Επίσης, ο αλγόριθµος εξετάζει τη λίστα των γειτόνων κάθε
κορυφής, όταν αυτή αλλάζει χρώµα από γκρίζο σε µαύρο. Το άθροισµα των γειτό-
νων όλων των κορυφών είναι Θ(|Ε|). Εποµένως, ο χρόνος εκτέλεσης του ΨΠΠ είναι
Ο(|V| + |E|) ή διαφορετικά το ΨΠΠ χρειάζεται χρόνο γραµµικό στο µέγεθος της
λίστας γειτονικότητας ενός γραφήµατος G(V, E).
6 . 2 æ ∞ • π ª √ ¶ ƒ ø ∆∞ ™ ∂ ¶ § ∞∆ √ ™ 137

s s
1 3 5 7 1 3 5 7

2 4 6 8 2 4 6 8
Q 4 1
s s
1 3 5 7 1 3 5 7

2 4 6 8 2 4 6 8
Q 1 5 6 Q 5 6 2
s s
1 3 5 7 1 3 5 7

2 4 6 8 2 4 6 8
Q 6 2 7 Q 2 7 8
™¯‹Ì· 6.5
s s
1 3 5 7 1 3 5 7 Παράδειγµα εφαρ-
µογής Ψαξίµατος
Πρώτα σε Πλάτος.
2 4 6 8 2 4 6 8 Οι διακεκοµµένες
ακµές έχουν χρησι-
Q 7 8 Q 8
µοποιηθεί για την
s s ανακάλυψη νέων
1 3 5 7 1 3 5 7 κορυφών, και συµ-
µετέχουν στο δέντρο
του ΨΠΠ, που απει-
2 4 6 8 2 4 6 8 κονίζεται τελευταίο

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 6.2

Ένα γράφηµα G(V, E) ονοµάζεται διµερές (bipartite), όταν οι κορυφές του µπο-
ρούν να διαµεριστούν σε δύο σύνολα V1 και V2, τέτοια, ώστε κάθε ακµή του Ε να
έχει το ένα άκρο της στο σύνολο V1 και το άλλο άκρο της στο V2. Περιγράψτε έναν
αποδοτικό αλγόριθµο που αποφασίζει αν ένα γράφηµα είναι διµερές ή όχι.
138 K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡

6.3 æ¿ÍÈÌÔ ÚÒÙ· ÛÂ ‚¿ıÔ˜

Σε αντίθεση µε το ΨΠΠ που επισκέπτεται όλες τι κορυφές σε απόσταση k πριν επι-


σκεφθεί οποιαδήποτε κορυφή σε απόσταση k + 1, το Ψάξιµο Πρώτα σε Βάθος (ΨΠΒ
– Depth First Search) προχωράει όσο το δυνατόν µακρύτερα από την αρχική κορυ-
φή s. Το ΨΠΒ χρησιµοποιεί όλες τις εξερχόµενες ακµές της κορυφής v που επισκέ-
φτηκε τελευταία. Όταν η τελευταία κορυφή v δεν έχει άλλες αχρησιµοποίητες ακµές,
το ΨΠΒ επιστρέφει στην κορυφή που επισκέφθηκε αµέσως προηγουµένως, για να
χρησιµοποιήσει τις ακµές της. Η διαδικασία αυτή συνεχίζεται µέχρι να ανακαλυ-
φθούν όλες οι κορυφές που είναι προσπελάσιµες από την αρχική κορυφή s. Αν σε
αυτό το σηµείο υπάρχουν κορυφές τις οποίες το ΨΠΒ δεν έχει επισκεφθεί ακόµη,
µία από αυτές επιλέγεται σαν αρχική, και η αναζήτηση συνεχίζεται. Το ΨΠΒ ολο-
κληρώνεται όταν έχει επισκεφθεί όλες τις κορυφές του γραφήµατος.
Όπως και στο ΨΠΠ, χρησιµοποιούµε τον πίνακα των κορυφών – προγόνων p[1, ...,
|V|] για να καταγράφουµε τις ακµές µέσω των οποίων το ΨΠΒ επισκέφθηκε κάθε
κορυφή. Όταν το ΨΠΒ επισκεφθεί µία κορυφή v χρησιµοποιώντας µία ακµή (u, v),
θέτουµε p[v] = u. Σε αυτή την περίπτωση, η κορυφή u καλείται πρόγονος
(predecessor) της v, και η κορυφή v απόγονος (successor) της u.
Το υπογράφηµα G(V, Ep) περιλαµβάνει όλες τις ακµές που χρησιµοποίησε το ΨΠΒ
για να επισκεφθεί τις κορυφές του V. ∆ηλαδή, είναι Ep = {(p[v], v): v Œ V και p[v] π
NIL}. Επειδή το ΨΠΒ επισκέπτεται όλες τις κορυφές του V και, όχι µόνο αυτές που
είναι προσπελάσιµες από την αρχική κορυφή, το γράφηµα Gp µπορεί να περιλαµ-
βάνει περισσότερα του ενός δέντρα, δηλαδή να είναι ένα δάσος (forest). Κάθε φορά
που το ΨΠΒ ξεκινάει την αναζήτηση από νέα αρχική κορυφή, ένα νέο δέντρο προ-
στίθεται στο δάσος. Το δάσος Gp ονοµάζεται δάσος του ΨΠΒ, και οι ακµές του Ep
ονοµάζονται ακµές των δέντρων του ΨΠΒ (tree edges).
Όπως και στο ΨΠΠ, οι κορυφές χωρίζονται στις λευκές, τις οποίες το ΨΠΒ δεν έχει
επισκεφθεί ακόµη, στις γκρίζες, τις οποίες το ΨΠΒ έχει επισκεφθεί, αλλά πιθανόν
δεν έχει ακόµη επισκεφθεί όλες τις γειτονικές κορυφές τους και στις µαύρες, που το
ΨΠΒ έχει επισκεφθεί τόσο τις ίδιες όσο και όλες τις γειτονικές τους. Αρχικά, όλες
οι κορυφές είναι λευκές. Την πρώτη φορά που το ΨΠΒ επισκέπτεται µία λευκή κορυ-
φή, αυτή βάφεται γκρίζα. Όταν το ΨΠΒ ολοκληρώσει την εξέταση όλων των γειτο-
νικών κορυφών µίας γκρίζας κορυφής, αυτή βάφεται µαύρη. Παρατηρούµε ότι, για
να βαφτεί µαύρη µία κορυφή v, πρέπει πρώτα να βαφτούν µαύρες όλες οι γειτονικές
της, εκτός, ίσως, από την p[v].
Για να διευκολυνθούµε στην περιγραφή των βασικών ιδιοτήτων του ΨΠΒ, χρησι-
6 . 3 æ ∞ • π ª √ ¶ ƒ ø ∆∞ ™ ∂ µ ∞ £ √ ™ 139

µοποιούµε τους πίνακες d[1, …, |V|] και f[1, …, |V|], στους οποίους αποθηκεύουµε
τις χρονικές στιγµές στις οποίες κάθε κορυφή αλλάζει χρώµα. Οι χρονικές στιγµές
είναι ακέραιοι αριθµοί µεταξύ 1 και 2|V| και δηλώνουν την ακολουθία των γεγονό-
των αλλαγής χρώµατος των κορυφών. Για κάθε κορυφή v, το d[v] δηλώνει τη χρο-
νική στιγµή στην οποία η v έγινε γκρίζα (διαφορετικά, το χρόνο της πρώτης επίσκε-
ψης του ΨΠΒ στη v), ενώ το f[v] δηλώνει τη στιγµή στην οποία η v έγινε µαύρη (δια-
φορετικά, το χρόνο που το ΨΠΒ εγκατέλειψε τη v). Επειδή κάθε κορυφή v πρέπει
να γίνει γκρίζα πριν γίνει µαύρη, είναι d[v] < f[v].
Στη συνέχεια, παραθέτουµε µία αναδροµική υλοποίηση του ΨΠΒ, ενώ στο Σχήµα
6.6, φαίνεται ένα παράδειγµα λειτουργίας του.
time ¨ 0; {Global ÌÂÙ·‚ÏËÙ‹ ÁÈ· ÙȘ ¯ÚÔÓÈΤ˜ ÛÙÈÁ̤˜ }
涵(G(V, E))
for all v ΠV do
color[v] ¨ §∂À∫√; p[v] ¨ NIL;
for all v ΠV do
if color[v] = §∂À∫√ then 涵 – ∂¶π™∫∂æ∏(v);

涵 – ∂¶π™∫∂æ∏(v)
time ¨ time + 1; color[v] ¨ °∫ƒπ∑√; d[v] ¨ time;
for all u ΠA[v] do
if color[u] = §∂À∫√ then
p[u] ¨ v; 涵 – ∂¶π™∫∂æ∏(u);
time ¨ time + 1; color[v] ¨ ª∞Àƒ√; f[v] ¨ time;
Όσον αφορά στο χρόνο εκτέλεσης του ΨΠΒ, η εξερεύνηση του γραφήµατος πραγ-
µατοποιείται από την διαδικασία ΨΠΒ – ΕΠΙΣΚΕΨΗ, η οποία καλείται ακριβώς µία
φορά για κάθε κορυφή v, αφού καλείται µόνο όταν η v είναι λευκή και, αµέσως µετά
την κλήση, βάφει την κορυφή v γκρίζα. Για κάθε κορυφή v, η ΨΠΒ – ΕΠΙΣΚΕΨΗ ελέγ-
χει όλους τους γείτονες της v, για κορυφές που δεν έχει επισκεφθεί. Εποµένως, ο
συνολικός χρόνος εκτέλεσης της διαδικασίας ΨΠΒ είναι γραµµικός στο µέγεθος της
λίστας γειτονικότητας του γραφήµατος, δηλαδή Ο(|V| + |E|).
140 K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡

1/ 1/ 2/ 1/ 2/

3/

1/ 2/ 1/ 2/ 1/ 2/

Π Π

4/ 3/ 4/5 3/ 4/5 3/

1/ 2/ 1/ 2/7 1/ 2/7
M
Π Π Π

4/5 3/6 4/5 3/6 4/5 3/6

1/8 2/7 1/8 2/7 9/ 1/8 2/7 9/


M M M ∆'
Π Π Π

4/5 3/6 4/5 3/6 4/5 3/6

1/8 2/7 9/ 1/8 2/7 9/ 1/8 2/7 9/


M ∆' M ∆' M ∆'
Π Π Π

4/5 3/6 10/ 4/5 3/6 10/ 4/5 3/6 10/11


Π Π

1/8 2/7 9/12 1/8 2/7 9/12


M ∆'
Π

4/5 3/6 10/11 4/5 3/6 10/11


Π

™¯‹Ì· 6.6
Παράδειγµα εφαρµογής Ψαξίµατος Πρώτα σε Βάθος. Στις κορυφές σηµειώνονται οι χρονικές στιγµές αλλαγής
χρώµατος. Οι ακµές που έχουν εξετασθεί απεικονίζονται διακεκοµµένες, ενώ οι ακµές που σηµειώνονται µε τα
γράµµατα Μ, Π, ∆ δεν συµµετέχουν στο δάσος του ΨΠΒ, το οποίο απεικονίζεται τελευταίο.
6 . 3 æ ∞ • π ª √ ¶ ƒ ø ∆∞ ™ ∂ µ ∞ £ √ ™ 141

¢Ú·ÛÙËÚÈfiÙËÙ· 6.3

Μια κλίκα (clique) είναι ένα µη κατευθυντικό γράφηµα G(V, E), κάθε ζευγάρι
κορυφών του οποίου συνδέεται µε µία ακµή. ∆ηλαδή, για κάθε u, v Œ V, {u. v} Œ
E. Αποδείξτε ότι, σε κάθε περίπτωση, το δέντρο του ΨΠΒ για µία κλίκα G(V, E)
είναι ένα απλό µονοπάτι που διέρχεται από όλες τις κορυφές του G. ∆ώστε ένα
παράδειγµα γραφήµατος, που αν και δεν είναι κλίκα, το δέντρο του ΨΠΒ για αυτό
το γράφηµα είναι, σε κάθε περίπτωση, ένα απλό µονοπάτι.

Ιδιότητες του ΨΠΒ


Το ΨΠΒ παρέχει σηµαντικές πληροφορίες για τη δοµή ενός γραφήµατος. Μία στοι-
χειώδης ιδιότητα του ΨΠΒ είναι ότι το δάσος Gp απεικονίζει την εξέλιξη των ανα-
δροµικών κλήσεων της διαδικασίας ΨΠΒ – ΕΠΙΣΚΕΨΗ. ∆ηλαδή, p[u] = v αν και µόνο
αν η κλήση ΨΠΒ – ΕΠΙΣΚΕΨΗ(u) έγινε κατά τον έλεγχο των γειτόνων της κορυφής v.
Μία πιο σηµαντική ιδιότητα είναι ότι το ΨΠΒ µπορεί να χρησιµοποιηθεί για την
κατηγοριοποίηση των ακµών του γραφήµατος εισόδου G(V, E). Συγκεκριµένα, χρη-
σιµοποιώντας σαν σηµείο αναφοράς το δάσος του ΨΠΒ Gp, µπορούµε να ορίσουµε
τέσσερα διαφορετικά είδη ακµών:
• Οι ακµές των δέντρων (tree edges) περιέχονται στο σύνολο Εp των ακµών του
δάσους. Μία ακµή (u, v) είναι ακµή του δέντρου, αν το ΨΠΒ επισκέφθηκε για
πρώτη φορά την κορυφή v χρησιµοποιώντας την ακµή (u, v). ∆ηλαδή, κατά τον
έλεγχο της κορυφής v σαν γείτονα της u, η κορυφή v είναι λευκή.
• Οι πίσω ακµές (back edges) συνδέουν µία κορυφή u µε µία κορυφή v, η οποία είναι
πρόγονος της u στο δάσος του ΨΠΒ. Μία ακµή (u, v) είναι πίσω ακµή όταν, τη
στιγµή που η κορυφή v ελέγχεται σαν γείτονας της u, η v είναι γκρίζα. Οι βρόγχοι
θεωρούνται πίσω ακµές.
• Οι µπρος ακµές (forward edges) συνδέουν µία κορυφή u µε µία κορυφή v, η οποία
είναι απόγονος της u στο δάσος του ΨΠΒ. Μία ακµή (u, v) είναι µπρος ακµή όταν,
τη χρονική στιγµή που ελέγχεται η κορυφή v σαν γείτονας της u, η κορυφή v είναι
µαύρη, και στο δάσος Gp υπάρχει ένα µονοπάτι από µαύρες κορυφές (εκτός της
αρχικής κορυφής u, που είναι γκρίζα) που οδηγεί από την u στην v. Ένα διαφορε-
τικό κριτήριο για τις µπρος ακµές είναι η κορυφή v να είναι µαύρη, και d[u] < d[v].
• Όλες οι υπόλοιπες ακµές ονοµάζονται ακµές διασταύρωσης (cross edges). Οι ακµές
διασταύρωσης µπορούν να συνδέουν κορυφές στο ίδιο δέντρο, οι οποίες δεν έχουν
142 K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡

σχέση προγόνου – απογόνου ή κορυφές σε διαφορετικά δέντρα του δάσους του


ΨΠΒ. Μία ακµή (u, v) είναι ακµή διασταύρωσης όταν, κατά τη χρονική στιγµή
που ελέγχεται η κορυφή v σαν γείτονας της u, η v είναι µαύρη και d[u] > d[v].
Στα Σχήµατα 6.6 και 6.7, διακρίνουµε τα είδη των ακµών που παράγει το ΨΠΒ.
Συγκεκριµένα, οι πίσω ακµές σηµειώνονται µε το γράµµα «Π», οι µπρος ακµές µε
το «Μ» και οι ακµές διασταύρωσης µε το «∆». Μάλιστα, στο Σχήµα 6.7.(β), το
δέντρο του ΨΠΒ έχει ζωγραφιστεί έτσι, ώστε οι πίσω ακµές να κατευθύνονται προς
τα πάνω, ενώ οι µπρος ακµές κατευθύνονται προς τα κάτω, και οι ακµές διασταύ-
ρωσης από δεξιά προς τα αριστερά.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 6.3

Αποδείξτε ότι ένα µη κατευθυντικό γράφηµα είναι άκυκλο αν και µόνο αν το ΨΠΒ
δεν παράγει πίσω ακµές. ∆ώστε έναν αλγόριθµο που αποφασίζει αν ένα µη κατευ-
θυντικό γράφηµα είναι άκυκλο.

Προκειµένου για µη κατευθυντικό γράφηµα, οι ακµές (u, v) και (v, u) συµπίπτουν.


Σε αυτή την περίπτωση, στην ακµή {u, v} αποδίδεται ο πρώτος στη σειρά χαρακτη-
ρισµός από την παραπάνω λίστα. Με άλλα λόγια, στην ακµή {u, v} αποδίδεται ο
χαρακτηρισµός όποιας από τις κατευθυνόµενες ακµές (u, v) και (v, u) χρησιµοποιη-
θεί πρώτη από το ΨΠΒ.

¢Ú·ÛÙËÚÈfiÙËÙ· 6.4

Αποδείξτε ότι το ΨΠΒ στα µη κατευθυντικά γραφήµατα, εκτός από τις ακµές των
δέντρων, παράγει µόνο πίσω ακµές.

¢Ú·ÛÙËÚÈfiÙËÙ· 6.5

∆ώστε έναν αλγόριθµο που αποφασίζει αν ένα µη κατευθυντικό γράφηµα G(V, E)


περιέχει κύκλο. Ο αλγόριθµός σας θα πρέπει να έχει χρόνο εκτέλεσης O(|V|), δηλα-
δή ανεξάρτητο του αριθµού των ακµών |Ε|.

Μια άλλη ενδιαφέρουσα ιδιότητα του ΨΠΒ προκύπτει από την παρατήρηση των
χρονικών στιγµών d[v] και f[v] που οι κορυφές v Œ V αλλάζουν χρώµα. Θα αποδεί-
ξουµε ότι για κάθε ζευγάρι κορυφών u, v, τα διαστήµατα [d[u], f[u]] και [d[v], f[v]]
είτε είναι ξένα µεταξύ τους, είτε το ένα περιέχεται στο άλλο (Σχήµα 6.7).
6 . 3 æ ∞ • π ª √ ¶ ƒ ø ∆∞ ™ ∂ µ ∞ £ √ ™ 143

3/6 2/9 1/10 11/16 1/10 11/16


Π

Π M ∆ Π
2/9 M
12/13 ∆ 14/15
4/5 ∆ 7/8 ∆ 12/13 ∆ 14/15

(α) 3/6 7/8
Π

1,10 11,16
(β)
4/5
2,9
12,13 14,15 ™¯‹Ì· 6.7
Παράδειγµα
3,6 7,8
εφαρµογής ΨΠΒ,
και απεικόνιση
4,5 του Θεωρήµατος
(γ) 6.2.

Θεώρηµα 6.2: Έστω ένα (κατευθυντικό ή µη κατευθυντικό) γράφηµα G(V, E).


Κατά το ΨΠΒ του G, για κάθε ζευγάρι κορυφών u, v, ακριβώς µία
από τις παρακάτω προτάσεις είναι αληθής:
• Τα διαστήµατα [d[u], f[u]] και [d[v], f[v]] είναι ξένα µεταξύ τους.
• Το διάστηµα [d[u], f[u]] περιέχεται στο διάστηµα [d[v], f[v]] και η κορυφή u
είναι απόγονος της v στο δέντρο του ΨΠΒ.
• Το διάστηµα [d[v], f[v]] περιέχεται στο διάστηµα [d[u], f[u]] και η κορυφή v
είναι απόγονος της u στο δέντρο του ΨΠΒ.
Απόδειξη: Αρχικά υποθέτουµε ότι d[u] < d[v] και διακρίνουµε τις περιπτώ-
σεις d[v] < f[u] και d[v] > f[u]. Αν d[v] < f[u], το ΨΠΒ επισκέ-
φθηκε την κορυφή v όταν η κορυφή u ήταν γκρίζα. Εποµένως, η
v είναι απόγονος της u. Επίσης, το ΨΠΒ πρέπει να είχε ολοκλη-
ρώσει τον έλεγχο των γειτόνων της v, πριν επιστρέψει στον έλεγ-
χο των γειτόνων της u. Συνεπώς, το διάστηµα [d[v], f[v]] περιέ-
χεται στο διάστηµα [d[u], f[u]]. Αν d[v] > f[u], τότε τα διαστήµα-
τα [d[v], f[v]] και [d[u], f[u]] είναι ξένα µεταξύ τους.
Η περίπτωση d[u] > d[v] είναι ίδια, µε τους ρόλους των κορυφών v και u να έχουν
αντιστραφεί.
144 K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 6.4

∆είξτε ότι το ΨΠΒ µπορεί να χρησιµοποιηθεί για τον υπολογισµό των συνεκτικών
συνιστωσών ενός µη κατευθυντικού γραφήµατος G(V, E). Συγκεκριµένα, αποδείξτε
ότι το ΨΠΒ(G) παράγει ακριβώς τόσα δέντρα όσες και οι συνεκτικές συνιστώσες
του G. Επίσης, αν k ο αριθµός των συνεκτικών συνιστωσών του G, τροποποιήστε
τον ψευδοκώδικα του ΨΠΒ, ώστε σε κάθε κορυφή v να ανατίθεται ένας αριθµός
cc[v] µεταξύ 1 και k, και για κάθε ζευγάρι κορυφών u, v Œ V, cc[u] = cc[v] αν και
µόνο αν οι κορυφές u και v ανήκουν στην ίδια συνεκτική συνιστώσα του G.

™‡ÓÔ„Ë
Σε αυτό το κεφάλαιο παρουσιάστηκαν µέθοδοι αναπαράστασης και αλγόριθµοι εξε-
ρεύνησης γραφηµάτων. Το κεφάλαιο ξεκίνησε µε τον ορισµό των βασικών εννοιών
και της ορολογίας που σχετίζονται µε τη µαθηµατική οντότητα του γραφήµατος και
την παρουσίαση της λίστας γειτονικότητας και του πίνακα γειτονικότητας, που είναι
οι δύο βασικές µέθοδοι για την αναπαράσταση ενός γραφήµατος στη µνήµη του υπο-
λογιστή. Στη συνέχεια, παρουσιάστηκαν δύο αλγόριθµοι για την εξερεύνηση ενός γρα-
φήµατος: το Ψάξιµο Πρώτα σε Πλάτος και το Ψάξιµο Πρώτα σε Βάθος, και µελετή-
θηκαν οι σηµαντικότερες ιδιότητές τους.

µÈ‚ÏÈÔÁÚ·Ê›·

Η ύλη του Κεφαλαίου 6 καλύπτεται πολύ καλά σε όλα τα βιβλία που προτάθηκαν
στο Κεφάλαιο 1. Συµπληρωµατικά προτείνονται τα παρακάτω:
[1] F. Harary. Graph Theory. Addison – Wesley, 1969. Εξαιρετική εισαγωγή στις βασι-
κές έννοιες της Θεωρίας Γραφηµάτων, µε καταπληκτική συλλογή ασκήσεων.
[2] S. Even. Graph Algorithms. Computer Science Press, 1979. Πολύ καλή και σε
βάθος παρουσίαση πολλών αλγόριθµων γραφηµάτων.
∂ÈÛ·ÁˆÁ‹ ÛÙËÓ ˘ÔÏÔÁÈÛÙÈ΋ ÔÏ˘ÏÔÎfiÙËÙ·

™ÎÔfi˜
∫ ∂

Σε σχέση µε τη θεωρία αλγορίθµων, η θεωρία υπολογιστικής πολυπλοκότητας παρέ-


χει µία συµπληρωµατική οπτική γωνία στην έννοια του υπολογισµού. Σκοπός αυτού
του κεφαλαίου είναι η εισαγωγή στις βασικές έννοιες της θεωρίας υπολογιστικής
πολυπλοκότητας και η ανάδειξη της σχέσης αλγόριθµων και πολυπλοκότητας. Συγκε-
7
º ∞ § ∞ π √

κριµένα, σε αυτό το κεφάλαιο ορίζονται οι Ντετερµινιστικές Μηχανές Turing µε πολ-


λαπλές ταινίες, που αποτελούν το βασικότερο υπολογιστικό µοντέλο στο θεωρία πολυ-
πλοκότητας, οι κλάσεις πολυπλοκότητας DTIME[t(n)], P και EXP, και οι κεντρικές
έννοιες της αναγωγής και της πληρότητας.

¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·
Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση:
• Να ορίζει το πρόβληµα απόφασης που αντιστοιχεί σε ένα πρόβληµα βελτιστοποίησης.
• Να περιγράφει µια µηχανή Turing που αποφασίζει ένα απλό πρόβληµα.
• Να αποδεικνύει ότι ένα πρόβληµα ανήκει σε µία κλάση πολυπλοκότητας.
• Να περιγράφει απλές αναγωγές µεταξύ υπολογιστικών προβληµάτων.

ŒÓÓÔȘ ÎÏÂȉȿ
• πρόβληµα απόφασης • ντετερµινιστική χρονική πολυπλοκό-
• ευεπίλυτα και δυσεπίλυτα προβλήµα-
τητα και κλάση P
τα – αξίωµα Cook – Karp
• ντετερµινιστική µηχανή Turing • αναγωγή και πληρότητα

∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Η θεωρία υπολογιστικής πολυπλοκότητας (computational complexity theory) είναι
η περιοχή της θεωρητικής επιστήµης των υπολογιστών που εξετάζει τους λόγους για
τους οποίους µερικά προβλήµατα είναι δύσκολο ή και αδύνατον να λυθούν από έναν
υπολογιστή. Η υπολογιστική πολυπλοκότητα (ή απλά πολυπλοκότητα), που, ουσια-
στικά, δεν υπήρχε σαν επιστηµονική περιοχή πριν εικοσιπέντε χρόνια, γνώρισε
ραγδαία ανάπτυξη, και σήµερα αποτελεί µία από τις σηµαντικότερες περιοχές της
146 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

θεωρητικής επιστήµης των υπολογιστών.


Η θεωρία πολυπλοκότητας προσπαθεί κατ’ αρχήν να αναγνωρίσει τα προβλήµατα
που δεν µπορούν να λυθούν από έναν υπολογιστή. Ένα παράδειγµα προβλήµατος που
δεν µπορεί να λυθεί είναι το διάσηµο πρόβληµα του τερµατισµού (Halting Problem)
µιας µηχανής Turing.
Από την άλλη πλευρά, υπάρχει η µεγάλη κατηγορία των προβληµάτων που µπορούν
να λυθούν από τους υπολογιστές. Σε αυτή την κατηγορία εντάσσονται όλα τα προ-
βλήµατα που συναντήσαµε µέχρι τώρα. Γι΄ αυτά τα προβλήµατα, η θεωρία πολυπλο-
κότητας µελετά την ποσότητα των υπολογιστικών πόρων που είναι απαραίτητοι για
την επίλυση κάθε προβλήµατος σε διάφορα αντιπροσωπευτικά υπολογιστικά µοντέ-
λα. Ένα κεντρικό ερώτηµα είναι η επίδραση του υπολογιστικού µοντέλου στους
πόρους που απαιτεί η επίλυση του προβλήµατος.
Εξετάζοντας τη συµπεριφορά των προβληµάτων όσον αφορά τους υπολογιστικούς
πόρους που απαιτούνται για την επίλυσή τους σε διάφορα υπολογιστικά µοντέλα, η
θεωρία πολυπλοκότητας προσπαθεί να εντάξει τα προβλήµατα σε κλάσεις πολυπλο-
κότητας (complexity classes), δηλαδή οµάδες προβληµάτων µε παρόµοια συµπερι-
φορά. Τα προβλήµατα κάθε κλάσης ανάγονται σε έναν σχετικά µικρό αριθµό προβλη-
µάτων που θεωρούνται αντιπροσωπευτικά για όλη την κλάση. Τα προβλήµατα αυτά
ονοµάζονται πλήρη (complete) για την κλάση και οι µέθοδοι αναγωγής εξασφαλίζουν
ότι, αν κάποια σηµαντική πρόοδος συµβεί στην επίλυση ενός από τα πλήρη προβλή-
µατα, αυτή θα έχει εφαρµογή στην επίλυση όλων των προβληµάτων της κλάσης.
Με βάση τα παραπάνω, η πολυπλοκότητα µπορεί να θεωρηθεί σαν η µελέτη της δια-
λεκτικής σχέσης µεταξύ του υπολογισµού (κλάσεις πολυπλοκότητας) και των εφαρ-
µογών (αλγόριθµοι για την επίλυση προβληµάτων).
Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες:
7.1. Αλγόριθµοι και Προβλήµατα
7.2. Ντετερµινιστικές Μηχανές Turing
7.3. Χρονική Πολυπλοκότητα και η Κλάση P
7.4. Αναγωγή και Πληρότητα
7 . 1 ∞ § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ ƒ √ µ § ∏ ª ∞∆ ∞ 147

7.1 ∞ÏÁfiÚÈıÌÔÈ Î·È ÚÔ‚Ï‹Ì·Ù·

Από την οπτική γωνία της θεωρίας αλγορίθµων, τα υπολογιστικά προβλήµατα απο-
τελούν ένα µαθηµατικό φορµαλισµό που περιγράφει µια κατηγορία πραγµατικών
προβληµάτων, τα οποία πρέπει να λυθούν αποτελεσµατικά από κάποιον αλγόριθµο.
Η µαθηµατική περιγραφή του προβλήµατος, συνήθως, βρίσκεται σε απόλυτη αντι-
στοιχία µε το πραγµατικό πρόβληµα. Η περιγραφή των αλγόριθµων σε ψευδοκώδι-
κα επιτρέπει την εύκολη υλοποίησή τους σε διάφορες γλώσσες προγραµµατισµού,
ώστε να χρησιµοποιηθούν για την επίλυση πραγµατικών στιγµιότυπων του προβλή-
µατος. Το γεγονός ότι οι αλγόριθµοι σχεδιάζονται για να χρησιµοποιηθούν στην
πράξη, καθιστά αναγκαίο τον ακριβή υπολογισµό της τάξης µεγέθους των συναρ-
τήσεων, οι οποίες προσδιορίζουν την ποσότητα των υπολογιστικών πόρων που απαι-
τεί κάθε αλγόριθµος. Επιπλέον, η πλειοψηφία των προβληµάτων που εξετάζονται
από τη θεωρία αλγορίθµων είναι προβλήµατα βελτιστοποίησης.
Από την οπτική γωνία της θεωρίας πολυπλοκότητας, τα υπολογιστικά προβλήµατα
είναι µαθηµατικές οντότητες που, καθ’ αυτές, χρήζουν µελέτης. Τα προβλήµατα περι-
γράφονται µαθηµατικά σαν τυπικές γλώσσες (formal languages), ενώ οι αλγόριθµοι
σαν υπολογιστικές µηχανές ειδικού σκοπού. Ο προσδιορισµός της ποσότητας των
υπολογιστικών πόρων που απαιτείται για τη λύση ενός προβλήµατος δεν χρειάζεται
να είναι ακριβής, αφού εκείνο που ενδιαφέρει είναι η κατηγορία των συναρτήσεων
και όχι η ακριβής τάξη µεγέθους.
Για τη θεωρία πολυπλοκότητας, ένα πρόβληµα Π είναι µία δυαδική σχέση που περι-
λαµβάνει όλα τα διαφορετικά ζεύγη των στιγµιότυπων του Π και των λύσεών τους.
Για παράδειγµα, ας θεωρήσουµε το πρόβληµα του Συντοµότερου Μονοπατιού µετα-
ξύ δύο κορυφών. Ένα στιγµιότυπο για αυτό το πρόβληµα αποτελείται από ένα γρά-
φηµα G(V, E), και δύο κορυφές s, t Œ V. Κάθε τριάδα που αποτελείται από ένα γρά-
φηµα και δύο κορυφές του γραφήµατος µπορεί να θεωρηθεί σαν ένα έγκυρο στιγ-
µιότυπο του προβλήµατος του Συντοµότερου Μονοπατιού. Κάθε ακολουθία κορυ-
φών που αποτελεί ένα συντοµότερο µονοπάτι µεταξύ των κορυφών s και t αποτελεί
µία λύση του προβλήµατος. Επίσης, λύση µπορεί να θεωρηθεί µια κενή ακολουθία
κορυφών, όταν αυτή δηλώνει ότι η t δεν είναι προσπελάσιµη από την s. Επειδή το
συντοµότερο µονοπάτι µεταξύ s και t δεν είναι µοναδικό, ένα στιγµιότυπο του προ-
βλήµατος µπορεί να έχει περισσότερες από µία λύσεις.
Το πρόβληµα του Συντοµότερου Μονοπατιού µεταξύ δύο κορυφών µπορεί να περι-
γραφεί και σαν πρόβληµα βελτιστοποίησης (optimization problem). ∆εδοµένης µιας
τριάδας < G(V, E), s, t >, ζητείται η συντοµότερη ακολουθία κορυφών που σχηµα-
148 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

τίζουν ένα µονοπάτι από την s στην t. Σε αυτή την περίπτωση, αποδεκτή λύση
(feasible solution) είναι κάθε µονοπάτι από την s στην t. Βέλτιστη λύση (optimal
solution) είναι κάθε µονοπάτι από την s στην t µε ελάχιστο µήκος.
Ένας διαφορετικός τρόπος να περιγραφεί το πρόβληµα του Συντοµότερου Μονο-
πατιού είναι, δεδοµένου ενός φυσικού αριθµού k ≥ 0, να εξετάσουµε αν υπάρχει
µονοπάτι από την s στην t µε µήκος το πολύ k. Σε αυτή τη µορφή, ένα στιγµιότυπο
του προβλήµατος καθορίζεται από µία διατεταγµένη τετράδα, η οποία αποτελείται
από ένα γράφηµα G(V, E), δύο κορυφές s, t Œ V και έναν φυσικό αριθµό k ≥ 0. Οι
δυνατές λύσεις του προβλήµατος είναι µόνο δύο: ΝΑΙ, που στο εξής θα συµβολίζε-
ται µε 1 και ΟΧΙ, που στο εξής θα συµβολίζεται µε 0. Κάθε πρόβληµα που διατυπώ-
νεται σε αυτή τη µορφή και έχει σύνολο λύσεων S = {0, 1} ονοµάζεται πρόβληµα
απόφασης (decision problem).

Ορισµός 7.1: Ένα πρόβληµα Π είναι µία δυαδική σχέση που ορίζεται στο καρτε-
σιανό γινόµενο του συνόλου Ι των στιγµιότυπων και του συνόλου S
των λύσεων, Π Õ I ¥ S. Ένα ζεύγος (i, s) Œ Π όταν το i είναι ένα έγκυ-
ρο στιγµιότυπο του Π και το s µία λύση του i. Ένα πρόβληµα ονο-
µάζεται πρόβληµα απόφασης όταν έχει δύο µόνο λύσεις, S = {0, 1}.

Στη θεωρία πολυπλοκότητας, θα ασχοληθούµε κυρίως µε προβλήµατα απόφασης.


Κάθε πρόβληµα βελτιστοποίησης µπορεί να περιγραφεί σαν πρόβληµα απόφασης
µε την προσθήκη ενός φυσικού αριθµού – ορίου (bound) k ≥ 0. Στο πρόβληµα από-
φασης ζητάµε την απάντηση στην ερώτηση «Υπάρχει αποδεκτή λύση µε κόστος το
πολύ k;», όταν πρόκειται για πρόβληµα ελαχιστοποίησης ή «Υπάρχει αποδεκτή λύση
µε κόστος τουλάχιστον k;», όταν πρόκειται για πρόβληµα µεγιστοποίησης. Στις
περισσότερες περιπτώσεις, αν ένα πρόβληµα απόφασης µπορεί να λυθεί αποδοτικά
(π.χ. σε πολυωνυµικό χρόνο), τότε και το αντίστοιχο πρόβληµα βελτιστοποίησης
µπορεί να λυθεί αποδοτικά (π.χ. σε πολυωνυµικό χρόνο) και αντίστροφα.
Ένας από τους σηµαντικότερους λόγους για τους οποίους στη θεωρία πολυπλοκό-
τητας µελετάµε κυρίως προβλήµατα απόφασης είναι ότι αυτά επιτρέπουν τη χρήση
µαθηµατικών εργαλείων από την περιοχή της θεωρίας τυπικών γλωσσών (formal
language theory).
Για να λυθεί κάποιο πρόβληµα από έναν υπολογιστή, πρέπει τα στιγµιότυπα του προ-
βλήµατος να αναπαρασταθούν µε τρόπο αντιληπτό από τον υπολογιστή. Για αυτό το
σκοπό, πρέπει να χρησιµοποιηθεί µία κωδικοποίηση (encoding) που θα µετατρέπει
κάθε στιγµιότυπο του προβλήµατος σε ένα σύνολο δυαδικών συµβολοσειρών (binary
7 . 1 ∞ § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ ƒ √ µ § ∏ ª ∞∆ ∞ 149

string) ή γενικότερα, σε ένα σύνολο από συµβολοσειρές ενός αλφάβητου Σ. Για


παράδειγµα, για να γράψουµε, να αποθηκεύσουµε και να επεξεργαστούµε ένα κεί-
µενο σε έναν υπολογιστή, κάθε γράµµα του κειµένου κωδικοποιείται µε µία µονα-
δική δυαδική συµβολοσειρά. Άρα, δεδοµένης µιας κωδικοποίησης e για κάποιο
συγκεκριµένο πρόβληµα, κάθε στιγµιότυπο i Œ I του προβλήµατος αποκτά µία ισο-
δύναµη συµβολοσειρά e(i) που χρησιµοποιεί σύµβολα ενός αλφάβητου Σ. Το µήκος
της συµβολοσειράς e(i) ονοµάζεται µέγεθος του στιγµιότυπου i.
Μια γλώσσα L που ορίζεται σε ένα αλφάβητο Σ είναι ένα σύνολο συµβολοσειρών
που αποτελούνται από σύµβολα / στοιχεία του Σ. Όπως το ισοδύναµο ενός στιγµιό-
τυπου i είναι η συµβολοσειρά e(i) του Σ, το ισοδύναµο ενός προβλήµατος απόφα-
σης Π είναι µία γλώσσα του Σ.

Ορισµός 7.2: ∆εδοµένου ενός προβλήµατος απόφασης Π και µιας κωδικοποίη-


σης e για τα στιγµιότυπα του Π, η γλώσσα L(Π, e) που σχετίζεται µε
το Π και την e είναι το σύνολο των συµβολοσειρών x Œ Σ*, όπου x
είναι η κωδικοποίηση ενός στιγµιότυπου του Π µε απάντηση ΝΑΙ,
και Σ* το σύνολο όλων των πεπερασµένων συµβολοσειρών του Σ,
συµπεριλαµβανοµένης και της κενής συµβολοσειράς.

7.1.1 ∂˘Â›Ï˘Ù· Î·È ‰˘ÛÂ›Ï˘Ù· ÚÔ‚Ï‹Ì·Ù·

Από τα προβλήµατα που µπορούν να λυθούν από έναν υπολογιστή, κάποια λύνονται
µε αποδοτικό τρόπο και θεωρούνται ευεπίλυτα (tractable) και, κάποια άλλα, δεν
λύνονται µε αποδοτικό τρόπο και θεωρούνται δυσεπίλυτα (intractable). Η διάκριση
γίνεται ανάλογα µε την ποσότητα των υπολογιστικών πόρων που απαιτούνται για
την επίλυση ενός προβλήµατος. Όταν υπάρχει ένας αποδοτικός αλγόριθµος (δηλα-
δή ένας αλγόριθµος που απαιτεί εύλογη ποσότητα υπολογιστικών πόρων) για κάποιο
πρόβληµα, τότε αυτό εντάσσεται στην κατηγορία των ευεπίλυτων προβληµάτων.
Όταν για κάποιο πρόβληµα δεν είναι γνωστός κανένας αποδοτικός αλγόριθµος, δεν
είναι προφανές αν αυτό πρέπει να ενταχθεί στα δυσεπίλυτα προβλήµατα. Ο λόγος είναι
ότι µπορεί να υπάρχει αποδοτικός αλγόριθµος για αυτό πρόβληµα, αλλά να µην έχει
ανακαλυφθεί ακόµα. Για παράδειγµα, ο πρώτος αλγόριθµος πολυωνυµικού χρόνου για
το πρόβληµα του γραµµικού προγραµµατισµού ανακαλύφθηκε µόλις στο τέλος της
δεκαετίας του 1970. Ένα πρόβληµα είναι δυσεπίλυτο όταν αποδεδειγµένα δεν µπορεί
να υπάρξει αποδοτικός αλγόριθµος για αυτό. Υπάρχει όµως και µία µεγάλη κατηγο-
ρία σηµαντικών προβληµάτων για τα οποία υπάρχουν ισχυρές ενδείξεις, αλλά όχι
150 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

µαθηµατική απόδειξη, ότι είναι δυσεπίλυτα. Η συντριπτική πλειοψηφία, αν όχι το σύνο-


λο, των επιστηµόνων θεωρεί ότι και αυτά τα προβλήµατα είναι δυσεπίλυτα.
Η κρατούσα αντίληψη εντάσσει στην κατηγορία των ευεπίλυτων προβληµάτων αυτά
και µόνο τα προβλήµατα που λύνονται σε πολυωνυµικό χρόνο. Ένα πρόβληµα λύνε-
ται σε πολυωνυµικό χρόνο όταν υπάρχει αλγόριθµος του οποίου ο χρόνος εκτέλεσης
χειρότερης περίπτωσης είναι O(nk), όπου n το µέγεθος του στιγµιότυπου εισόδου και
k µία οποιαδήποτε σταθερά. Τα προβλήµατα που λύνονται σε πολυωνυµικό χρόνο
αποτελούν την κλάση πολυπλοκότητας P. Η πεποίθηση ότι η κλάση P ταυτίζεται µε
την κλάση των ευεπίλυτων προβληµάτων αποδίδεται στους S. Cook και R. Karp και,
µερικές φορές, αναφέρεται σαν αξίωµα των Cook – Karp.
Υπάρχουν αρκετά σηµαντικά επιχειρήµατα που υποστηρίζουν το αξίωµα των Cook –
Karp. Κατ’ αρχήν, η ταχύτητα µε την οποία αυξάνεται ένα πολυώνυµο µικρού βαθµού
επιτρέπει την επίλυση αρκετά µεγάλων στιγµιότυπων ενός προβλήµατος σε εύλογο
χρονικό διάστηµα. Επιπλέον, η ύπαρξη ενός αλγόριθµου πολυωνυµικού χρόνου επι-
τρέπει τη σηµαντική αύξηση του µεγέθους των στιγµιότυπων που λύνει ο αλγόριθµος
σε δεδοµένο χρονικό διάστηµα, σαν αποτέλεσµα της συνεχούς αύξησης της ταχύτη-
τας των υπολογιστών. Στο Κεφάλαιο 1 είδαµε ότι τα παραπάνω δεν ισχύουν για συναρ-
τήσεις που µεγαλώνουν γρηγορότερα από οποιοδήποτε πολυώνυµο (π.χ. εκθετικές).
Από την άλλη πλευρά, ένα πρόβληµα που λύνεται σε χρόνο Θ(n200) δεν µπορεί στην
πράξη να χαρακτηριστεί ευεπίλυτο, σε αντίθεση µε ένα πρόβληµα που λύνεται σε
χρόνο Θ(2n/200). Όµως, πολύ λίγα πρακτικά προβλήµατα απαιτούν χρόνο επίλυσης
που δίνεται από ένα πολυώνυµο τόσο µεγάλου βαθµού. Η συντριπτική πλειοψηφία
των προβληµάτων που ανήκουν στην κλάση P λύνονται σε χρόνο που φράσσεται
από ένα πολυώνυµο µικρού βαθµού (π.χ. 2, 3, 4).
Επιπλέον, για τα περισσότερα αποδεκτά υπολογιστικά µοντέλα, όταν ένα πρόβλη-
µα µπορεί να λυθεί σε πολυωνυµικό χρόνο σε ένα από αυτά, µπορεί να λυθεί σε
πολυωνυµικό χρόνο και στα υπόλοιπα. Για παράδειγµα, ένα πρόβληµα που µπορεί
να λυθεί σε πολυωνυµικό χρόνο σε µία µηχανή Turing, µπορεί να λυθεί σε πολυω-
νυµικό χρόνο και σε µια Μηχανή Άµεσης Προσπέλασης Μνήµης (Random Access
Machine) µε έναν επεξεργαστή, την οποία χρησιµοποιήσαµε σαν υπολογιστικό
µοντέλο για την ανάλυση των αλγόριθµων.
Μάλιστα, επειδή το σύνολο των πολυωνύµων είναι κλειστό ως προς τις πράξεις της
πρόσθεσης, του πολλαπλασιασµού και της σύνθεσης, η κλάση των προβληµάτων
που λύνονται σε πολυωνυµικό χρόνο έχει αντίστοιχες ιδιότητες κλειστότητας. Για
παράδειγµα, αν συνθέσουµε δύο αλγόριθµους πολυωνυµικού χρόνου, χρησιµοποι-
7.2 ¡∆∂∆∂ƒªπ¡π™∆π∫∂™ ª∏Ã∞¡∂™ TURING 151

ώντας την έξοδο του ενός σαν είσοδο του άλλου, το αποτέλεσµα θα είναι ένας αλγό-
ριθµος πολυωνυµικού χρόνου.

¢Ú·ÛÙËÚÈfiÙËÙ· 7.1

Να ορίσετε τα προβλήµατα απόφασης που αντιστοιχούν στο πρόβληµα του Πολ-


λαπλασιασµού Ακολουθίας Πινάκων και στο πρόβληµα της Μεγαλύτερης Κοινής
Υποακολουθίας. Είναι αυτά τα προβλήµατα ευεπίλυτα ή δυσεπίλυτα.

7.2 ¡ÙÂÙÂÚÌÈÓÈÛÙÈΤ˜ Ì˯·Ó¤˜ Turing

Παρά την αδύναµη και, µάλλον, άχαρη εικόνα τους, οι µηχανές Turing µπορούν να
προσοµοιώσουν οποιοδήποτε αλγόριθµο χωρίς σηµαντική υποβάθµιση της απόδο-
σής του. Οι µηχανές Turing θα αποτελέσουν το βασικό υπολογιστικό µοντέλο για
την παρουσίαση της θεωρίας πολυπλοκότητας.
Αρχικά, θα θεωρήσουµε ντετερµινιστικές µηχανές Turing µε πολλαπλές ταινίες
(Multitape Deterministic Turing Machines). Μία Ντετερµινιστική Μηχανή Turing
(DTM) µε πολλαπλές ταινίες έχει k (k ≥ 1) ταινίες από τις οποίες µπορεί να διαβά-
σει και να γράψει συγκεκριµένα σύµβολα. Κάθε ταινία (tape) εκτείνεται απεριόρι-
στα στη µία µόνο κατεύθυνση (π.χ. προς τα δεξιά), και αποτελείται από κελιά (cells)
τα οποία αριθµούνται από τα αριστερά προς τα δεξιά χρησιµοποιώντας τους φυσι-
κούς αριθµούς. Ένα κελί είτε είναι κενό (blank), είτε περιέχει κάποιο στοιχείο ενός
πεπερασµένου αλφάβητου Σ, το οποίο ονοµάζεται αλφάβητο εισόδου ή απλά αλφά-
βητο. Κάθε ταινία έχει µία κεφαλή (tape head) η οποία µπορεί να κινείται κατά µήκος
της ταινίας και να διαβάζει ή να γράφει στο κελί πάνω από το οποίο βρίσκεται. Οι
ενέργειες των κεφαλών καθορίζονται από ένα πεπερασµένο σύνολο εντολών, το
οποίο ονοµάζεται συνάρτηση µετάβασης (transition function).
Κάθε χρονική στιγµή, η µηχανή Turing βρίσκεται σε µία κατάσταση (state). Το σύνο-
λο των επιτρεπτών καταστάσεων είναι πεπερασµένο και, συνήθως, συµβολίζεται µε
Q. ∆εδοµένης µιας κατάστασης από το σύνολο Q και των περιεχόµενων των κελιών
στα οποία βρίσκονται οι κεφαλές, η συνάρτηση µετάβασης προσδιορίζει την επό-
µενη κατάσταση, το σύµβολο που θα γράψει κάθε κεφαλή στο κελί που βρίσκεται
και την κίνηση κάθε κεφαλής. Όσον αφορά στις κινήσεις µιας κεφαλής, αυτή µπο-
ρεί να µετακινηθεί ένα κελί δεξιά (συµβολίζεται µε R), ή ένα κελί αριστερά (συµ-
βολίζεται µε L) ή να µείνει στάσιµη (συµβολίζεται µε S). Ο υπολογισµός µιας µηχα-
νής Turing ξεκινάει από µία ειδική αρχική κατάσταση (initial state) και τερµατίζεται
όταν η µηχανή φτάσει σε κάποιες ειδικές τελικές καταστάσεις (final state).
152 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

Ορισµός 7.3: Για κάποιον ακέραιο k ≥ 1, µία Ντετερµινιστική Μηχανή Turing Μ


µε k ταινίες είναι µία διατεταγµένη τετράδα Μ = (Q, Σ, δ, q0), όπου:
• Q είναι ένα πεπερασµένο σύνολο καταστάσεων.
• Σ είναι ένα πεπερασµένο αλφάβητο που ονοµάζεται αλφάβητο εισόδου της Μ.
Το λεγόµενο αλφάβητο ταινίας Γ αποτελείται από τα σύµβολα του Σ και το δια-
κεκριµένο σύµβολο u που δηλώνει το κενό κελί (κενό σύµβολο – blank symbol).
• q0 Œ Q είναι η αρχική κατάσταση της Μ. Επιπλέον, το σύνολο καταστάσεων Q
περιέχει ένα υποσύνολο F τελικών καταστάσεων.
• δ : (Q – F) ¥ Γk a Q ¥ Γk ¥ {L, R, S}k είναι η συνάρτηση µετάβασης.

Παρατηρούµε ότι η συνάρτηση µετάβασης δ είναι πεπερασµένη. ∆ηλαδή, αν και οι


ταινίες µιας µηχανής Turing µπορούν να εκτείνονται απεριόριστα, η ίδια η µηχανή
ορίζεται µε πεπερασµένο τρόπο. Χωρίς βλάβη της γενικότητας, θα υποθέτουµε ότι
η πρώτη ταινία είναι η ταινία εισόδου (input tape) και ότι το σύνολο των τελικών
καταστάσεων F αποτελείται από τρία στοιχεία: το ΝΑΙ που αντιστοιχεί στην αποδο-
χή της συµβολοσειρά εισόδου, το ΟΧΙ που αντιστοιχεί στην απόρριψη και το ΠΕΡΑΣ
(halt) που δηλώνει την ολοκλήρωση του υπολογισµού. Όταν µία µηχανή Turing Μ
επεξεργάζεται ένα πρόβληµα απόφασης, το F = {ΝΑΙ, ΟΧΙ}, ενώ όταν η Μ υπολογί-
ζει µία συνάρτηση, το F = {ΠΕΡΑΣ}.
Μία άλλη παραδοχή είναι ότι αν κάποια στιγµή µια µηχανή Turing προσπαθήσει να
κινήσει κάποια από τις κεφαλές της πέραν του αριστερού άκρου της αντίστοιχης ται-
νίας (συχνά συµβολίζεται µε το σύµβολο >), η συγκεκριµένη κεφαλή θα µείνει στη
θέση της, ακόµα και αν η συνάρτηση µετάβασης ορίζει ότι αυτή πρέπει να κινηθεί
προς τα αριστερά.
Η συνάρτηση µετάβασης είναι το πρόγραµµα της µηχανής Turing Μ. Σε αντίθεση µε
τη Μηχανή Άµεσης Προσπέλασης Μνήµης, που αποτελούσε το υπολογιστικό µοντέ-
λο για το σχεδιασµό και την ανάλυση αλγορίθµων και ήταν προγραµµατιζόµενη
(δηλαδή µπορούσε να εκτελέσει όποιο πρόγραµµα υπήρχε στη µνήµη της), µία µηχα-
νή Turing µπορεί να εκτελέσει µόνο ένα προκαθορισµένο πρόγραµµα (fixed program
computers), αυτό που καθορίζεται από τη συνάρτηση µετάβασης. Βέβαια, όπως θα
δούµε στην ενότητα 7.2.1, το γεγονός αυτό δεν συνιστά ουσιαστικό περιορισµό, αφού
µπορούµε να περιγράψουµε µία καθολική µηχανή Turing (universal Turing machine),
η οποία µπορεί να προσοµοιώσει τη λειτουργία µιας οποιασδήποτε Ντετερµινιστι-
κής Μηχανής Turing.
7.2 ¡∆∂∆∂ƒªπ¡π™∆π∫∂™ ª∏Ã∞¡∂™ TURING 153

¢Ú·ÛÙËÚÈfiÙËÙ· 7.2

Περιγράψτε µία Ντετερµινιστική Μηχανή Turing µε µία ταινία, η οποία µετατοπί-


ζει την είσοδό της µία θέση προς τα δεξιά, γράφοντας το κενό σύµβολο στο κελί
0. Για παράδειγµα, αν αρχικά η ταινία εισόδου περιέχει το «1101», στο τέλος του
υπολογισµού πρέπει να περιέχει «u1101». Υποθέστε ότι το αλφάβητο εισόδου είναι
Σ = {0, 1}.

7.2.1 §ÂÈÙÔ˘ÚÁÈο ¯·Ú·ÎÙËÚÈÛÙÈο ÙˆÓ Ì˯·ÓÒÓ Turing

Μία µηχανή Turing (DTM) Μ ξεκινάει στην αρχική κατάσταση q0. Υποθέτουµε ότι
όλες οι ταινίες περιέχουν µόνο κενά σύµβολα (u), εκτός από την ταινία εισόδου που
στην αρχή της περιέχει µία συµβολοσειρά x Œ Σ* η οποία οριοθετείται από το πρώτο
κενό σύµβολο στην ταινία εισόδου. Το x ονοµάζεται συµβολοσειρά εισόδου (input
string) της Μ.
Ο υπολογισµός της Μ τερµατίζει µόνο όταν η τρέχουσα κατάσταση γίνει µία από τις
τελικές καταστάσεις του συνόλου F. Αν η τελική κατάσταση είναι ΝΑΙ, γράφουµε
M(x) = ΝΑΙ και λέµε ότι η µηχανή Μ αποδέχεται (accepts) τη συµβολοσειρά x. Αν η
τελική κατάσταση είναι ΟΧΙ, γράφουµε ότι M(x) = ΟΧΙ και λέµε ότι η µηχανή Μ απορ-
ρίπτει (rejects) τη συµβολοσειρά x. Το σύνολο των συµβολοσειρών x Œ Σ* που γίνο-
νται αποδεκτές από την Μ αποτελεί τη γλώσσα που γίνεται αποδεκτή από την Μ και
συµβολίζεται µε L(Μ).
Αν η τελική κατάσταση είναι ΠΕΡΑΣ, τότε το αποτέλεσµα του υπολογισµού της Μ
βρίσκεται στην αρχή της ταινίας k (ταινία εξόδου – output tape). Το αποτέλεσµα της
Μ είναι µία συµβολοσειρά y Œ Σ* η οποία αρχίζει από το αριστερό άκρο της ταινίας
εξόδου και οριοθετείται από το πρώτο κενό σύµβολο. Σε αυτή την περίπτωση, γρά-
φουµε M(x) = y. Τέλος, υπάρχει περίπτωση η Μ ποτέ να µη φτάσει σε κάποια τελι-
κή κατάσταση, οπότε λέµε ότι η Μ δεν τερµατίζει για την είσοδο x.
Η περιγραφή της λειτουργίας µιας DTM M γίνεται, συνήθως, χρησιµοποιώντας την
έννοια της διαµόρφωσης (configuration). Η διαµόρφωση µιας DTM M γράφεται σαν:

( q,(u1 , u1¢),(u2 , u2¢ ),...,(uk , uk¢ )) ,

όπου q είναι η τρέχουσα κατάσταση, και για κάθε i, 1 £ i £ k, το ui Œ Γ* είναι η συµ-


βολοσειρά της ταινίας i από το αριστερό άκρο µέχρι και τη θέση της κεφαλής, και
u¢i Œ Γ* είναι η συµβολοσειρά της ταινίας i ξεκινώντας από το πρώτο κελί δεξιά της
θέσης της κεφαλής. Αφού κάθε ταινία i εκτείνεται απεριόριστα προς τα δεξιά, η συµ-
154 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

βολοσειρά u¢i είναι άπειρη, αλλά αποτελείται από µία πεπερασµένη συµβολοσειρά
του Σ* ακολουθούµενη από έναν άπειρο αριθµό κενών συµβόλων. Άρα, το u¢i είναι
ουσιαστικά, µία πεπερασµένη συµβολοσειρά.
Η αρχική διαµόρφωση (start configuration) της Μ µε είσοδο x είναι (q0, (x, ∆), …, (∆,
∆)). Μία διαµόρφωση αποδοχής (accepting configuration) έχει σαν κατάσταση ΝΑΙ,
και µία διαµόρφωση απόρριψης (rejecting configuration) έχει σαν κατάσταση ΟΧΙ.
∆εδοµένης µιας διαµόρφωσης µε τρέχουσα κατάσταση q που δεν είναι τελική, η
συνάρτηση µετάβασης δ ορίζει µία νέα διαµόρφωση που αντιστοιχεί στο επόµενο βήµα
της Μ. Η έννοια της µετάβασης από µία διαµόρφωση σε µία άλλη µπορεί να οριστεί
τυπικά χρησιµοποιώντας τη δυαδική σχέση Æ, η οποία ορίζεται σε ζεύγη διαµορφώ-
σεων και καλείται σχέση παραγωγής (yield). Συγκεκριµένα, για κάθε q Œ Q – F,

( q,(u1 , u1¢),(u2 , u2¢ ),...,(uk , uk¢ )) Æ ( p,( v1 , v1¢),( v2 , v2¢ ),...,( v k , v k¢ )) ,

όταν d ( q,( a1 , a2 ,..., ak )) = ( p,( b1 , b2 ,..., bk ),( D1 , D2 ,..., Dk )) και για κάθε ταινία i, 1 £
i £ k, ισχύει µία από τις παρακάτω συνθήκες:
• Αν Di = L, το vi προκύπτει από το ui µε αφαίρεση του τελευταίου συµβόλου, και
v¢i=bi◊u¢i.
• Αν Di = R, το vi προκύπτει από το ui µε αντικατάσταση του τελευταίου συµβόλου
από το bi και συµπλήρωση µε το πρώτο σύµβολο του u¢i, και το v¢i προκύπτει από
το u¢i µε αφαίρεση του πρώτου συµβόλου.
• Αν Di = S, το vi προκύπτει από το ui µε αντικατάσταση του τελευταίου συµβόλου
από το bi, και v¢i = u¢i.
Η σχέση Æ είναι µία µερική συνάρτηση (partial function) από το σύνολο των δια-
µορφώσεων στο σύνολο των διαµορφώσεων. Με βάση τον παραπάνω φορµαλισµό,
λέµε ότι η DTM Μ αποδέχεται (απορρίπτει) µία συµβολοσειρά x Œ Σ* όταν υπάρχει
µία ακολουθία διαµορφώσεων C1, C2, …, Cn τέτοια, ώστε το C1 είναι η αρχική δια-
µόρφωση της Μ µε είσοδο x, για κάθε i, 1 £ i < n, η διαµόρφωση Ci παράγει τη δια-
µόρφωση Ci + 1 (Ci Æ Ci + 1), και το Cn είναι µία διαµόρφωση αποδοχής (απόρριψης).
Η ακολουθία C1, C2, …, Cn ονοµάζεται υπολογισµός αποδοχής (απόρριψης).
Επίσης, αν f είναι µία µερική συνάρτηση από το Σ* στο Σ*, λέµε ότι µία DTM M υπο-
λογίζει (computes) την f όταν, αν f(x) = y, τότε Μ(x) = y, και αν το f(x) δεν ορίζεται,
τότε η M(x) δεν τερµατίζει.
7.2 ¡∆∂∆∂ƒªπ¡π™∆π∫∂™ ª∏Ã∞¡∂™ TURING 155

7.2.2 ∫·ıÔÏÈΤ˜ Ì˯·Ó¤˜ Turing

Ο ορισµός και η περιγραφή των Ντετερµινιστικών Μηχανών Turing δηµιουργεί την


εντύπωση ότι οι DTM είναι υπολογιστικές µηχανές ειδικού σκοπού, δηλαδή µηχα-
νές που µπορούν να εκτελέσουν µόνο τον αλγόριθµο – πρόγραµµα για τον οποίο
έχουν κατασκευαστεί και περιγράφεται από τη συνάρτηση µετάβασης δ. Όµως, σε
αυτή την ενότητα θα δείξουµε ότι, όπως και οι Μηχανές Άµεσης Προσπέλασης Μνή-
µης, οι DTM µπορούν να είναι υπολογιστές γενικού σκοπού. Συγκεκριµένα, θα περι-
γράψουµε µία καθολική (universal) DTM U η οποία δέχεται σαν είσοδο την κωδι-
κοποίηση µιας οποιασδήποτε DTM M ακολουθούµενη από κάποια συµβολοσειρά x,
και προσοµοιώνει τη λειτουργία της Μ µε είσοδο x.
Αφού η U πρέπει να είναι σε θέση να προσοµοιώνει κάθε DTM, δεν µπορεί να υπάρ-
ξει εκ των προτέρων κάποιο άνω φράγµα στον αριθµό των καταστάσεων και των
συµβόλων που θα πρέπει η U να προσοµοιώσει (δηλαδή, στον αριθµό των κατα-
στάσεων και των συµβόλων που θα έχει η DTM Μ, της οποίας τη λειτουργία η U
πρέπει να προσοµοιώσει). Γι’ αυτό, υποθέτουµε ότι οι καταστάσεις και το αλφάβη-
το κάθε DTM Μ αναπαριστώνται µε φυσικούς αριθµούς.
Συγκεκριµένα, έστω µια DTM Μ = (Q, Σ, δ, q0) µε Σ = {1, 2, …, |Σ| } και Q =
{ |Σ| + 1, …, |Σ| + |Q|, |Σ| + |Q| + 1}. Το κενό σύµβολο της Μ αναπαρίσταται µε το
φυσικό αριθµό 0, η αρχική κατάσταση µε το φυσικό αριθµό |Σ| + 1, η κατάσταση
ΝΑΙ µε |Σ| + |Q| – 1, η κατάσταση ΟΧΙ µε |Σ| + |Q|, η κατάσταση ΠΕΡΑΣ µε |Σ| + |Q|
+ 1, και τα L, R, και S που καθορίζουν τις κινήσεις των κεφαλών µε |Σ| + |Q| + 2,
|Σ| + |Q| + 3, και |Σ| + |Q| + 4, αντίστοιχα.

Στην κωδικοποίηση της Μ που θα διαβάσει και θα επεξεργαστεί η καθολική µηχανή


U, θεωρούµε ότι όλοι οι αριθµοί που αναπαριστούν σύµβολα ή καταστάσεις της Μ
περιγράφονται στο δυαδικό σύστηµα, χρησιµοποιώντας ακριβώς È log(| S | + | Q | +4 )ù
δυαδικά ψηφία για κάθε αριθµό (χρησιµοποιούµε το δυαδικό ψηφίο 0 για να συµπλη-
ρώσουµε αυτόν τον αριθµό δυαδικών ψηφίων).
Η κωδικοποίηση της Μ = (Q, Σ, δ, q0) αρχίζει µε το |Q|, συνεχίζει µε το |Σ| και ολο-
κληρώνεται µε την αναπαράσταση της δ. Η δ αναπαρίσταται σαν µια ακολουθία δια-
τεταγµένων ζευγαριών ((q; s);(p; t; D)), όπου s είναι το διάνυσµα των k συµβόλων
που διαβάζουν οι κεφαλές της Μ, t το διάνυσµα των k συµβόλων που θα γράψουν
οι κεφαλές της Μ, και D Œ {L, R, S}k το διάνυσµα που περιγράφει την επόµενη κίνη-
ση κάθε κεφαλής της Μ. Υποθέτουµε ότι τα διαχωριστικά σύµβολα «(», «)», και «;»
ανήκουν στο αλφάβητο της U. Η κωδικοποίηση της Μ ακολουθείται από τη συµβο-
156 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

λοσειρά x, που αποτελεί την είσοδο της Μ. Η x διαχωρίζεται από την Μ µε «;». Τα
σύµβολα της συµβολοσειράς x, επίσης, αναπαρίστανται στο δυαδικό σύστηµα και
διαχωρίζονται µε «;» . Εποµένως, το αλφάβητο της U περιλαµβάνει, εκτός από το
κενό σύµβολο, τα δυαδικά ψηφία 0 και 1 και τα σύµβολα «(», «)» και «;».

Υποθέτουµε ότι η U έχει δύο ταινίες, από τις οποίες η πρώτη περιέχει την κωδικο-
ποίηση της Μ και της συµβολοσειράς x και η δεύτερη χρησιµοποιείται για την απο-
θήκευση της τρέχουσας διαµόρφωσης της Μ. Κάθε διαµόρφωση της Μ κωδικοποι-
είται σαν ( q;(u1; u1¢);(u2 ; u2¢ );...;(uk ; uk¢ )) , όπου η κατάσταση q και όλα τα σύµβολα,
εκτός από τα διαχωριστικά, αναπαριστώνται στο δυαδικό σύστηµα. Στην αρχή της
προσοµοίωσης, η δεύτερη ταινία της U περιέχει την αρχική διαµόρφωση της Μ.
Για την προσοµοίωση ενός βήµατος της Μ, η U διαβάζει την τρέχουσα διαµόρφω-
ση της Μ από τη δεύτερη ταινία και ανατρέχει στην κωδικοποίηση της δ (που είναι
αποθηκευµένη στην πρώτη ταινία) για να εντοπίσει τον κανόνα µετάβασης που εφαρ-
µόζεται στην τρέχουσα διαµόρφωση. Στη συνέχεια, η U εκτελεί τον κανόνα µετά-
βασης, ενηµερώνοντας κατάλληλα την κωδικοποίηση της τρέχουσας διαµόρφωσης
της Μ στη δεύτερη ταινία. Από την περιγραφή της λειτουργίας της U, όταν η Μ τερ-
µατίζει µε είσοδο x, η U τερµατίζει στην ίδια κατάσταση. Επίσης, όταν η Μ δεν τερ-
µατίζει µε είσοδο x, ούτε η U τερµατίζει.
Στην αρχή του υπολογισµού της, η U ελέγχει αν τα περιεχόµενα της πρώτης της ται-
νίας (ταινίας εισόδου) βρίσκονται στην προκαθορισµένη µορφή και αντιστοιχούν
στην έγκυρη κωδικοποίηση µιας DTM Μ και µιας συµβολοσειράς x που αποτελεί
τη συµβολοσειρά εισόδου για την Μ. Αν η είσοδος της U δεν ικανοποιεί τις παρα-
πάνω απαιτήσεις, η U δεν τερµατίζει µπαίνοντας σε έναν αέναο βρόγχο (π.χ. µετα-
κινώντας τις κεφαλές της συνεχώς προς τα δεξιά).
Από την κατασκευή της, η καθολική DTM U µπορεί να προσοµοιώσει κάθε άλλη
DTM Μ για κάθε δυνατή είσοδο x της Μ. Αυτή είναι µια πολύ σηµαντική ιδιότητα
του υπολογιστικού µοντέλου των Ντετερµινιστικών Μηχανών Turing, η οποία απο-
δεικνύει ότι όντως πρόκειται για ένα προγραµµατιζόµενο υπολογιστικό µοντέλο γενι-
κού σκοπού. Με απλά λόγια, η U δέχεται σαν «πρόγραµµα» τη µηχανή Μ και η είσο-
δος του «προγράµµατος» είναι η συµβολοσειρά x.
Η δυνατότητα µιας κατάλληλα ορισµένης DTM να προσοµοιώνει τη λειτουργία
άλλων DTM είναι θεµελιώδης και χρησιµοποιείται στην απόδειξη πολλών σηµαντι-
κών αποτελεσµάτων της Θεωρίας Υπολογιστικής Πολυπλοκότητας, µεταξύ των
οποίων είναι ότι το Πρόβληµα του Τερµατισµού (Halting Problem) και αρκετά συνα-
7.2 ¡∆∂∆∂ƒªπ¡π™∆π∫∂™ ª∏Ã∞¡∂™ TURING 157

φή προβλήµατα δεν µπορούν να επιλυθούν από µία DTM. Σε αυτό το κεφάλαιο, θα


χρησιµοποιήσουµε τη δυνατότητα της προσοµοίωσης της λειτουργίας µίας DTM
από κάποια άλλη για την απόδειξη του Θεωρήµατος 7.1 της ενότητας 7.3.1.

7.2.3 °ÏÒÛÛ˜ Ô˘ ·ÔÊ·Û›˙ÔÓÙ·È ·fi Ì˯·Ó¤˜ Turing


Μία γλώσσα L ενός αλφάβητου Σ είναι ένα οποιοδήποτε υποσύνολο του Σ*.

Το συµπλήρωµα (complement) µιας γλώσσας L είναι η γλώσσα L που αποτελείται

από όλες τις συµβολοσειρές του Σ* που δεν ανήκουν στην L, L = S - L .


*

Μια γλώσσα L είναι DTM – αποδεκτή (DTM – acceptable) αν υπάρχει µία DTM Μ που
αποδέχεται όλες τις συµβολοσειρές που ανήκουν στην L, και µόνο αυτές. ∆ηλαδή, για
κάθε x œ L, είτε η Μ θα απορρίπτει το x, είτε η Μ δεν θα τερµατίζει µε είσοδο x.
Μία γλώσσα L ενός αλφάβητου Σ είναι DTM – αποφασίσιµη (DTM – decidable) αν
υπάρχει µία DTM M που τερµατίζει για κάθε x Œ Σ* και αποδέχεται όλες τις συµ-
βολοσειρές x Œ L, και απορρίπτει όλες τις συµβολοσειρές x œ L. ∆ηλαδή, αν Μ είναι
µία DTM που αποφασίζει τη γλώσσα L Õ Σ*, για κάθε x Œ Σ*, Μ(x) = ΝΑΙ, αν x Œ L,
και M(x) = ΟΧΙ, αν x œ L.
Ένα πολύ γνωστό παράδειγµα γλώσσας που δεν είναι DTM – αποφασίσιµη είναι αυτή
που αντιστοιχεί στο πρόβληµα του τερµατισµού µιας µηχανής Turing. Συγκεκριµέ-
να, δεδοµένης µιας DTM M και µιας εισόδου x για την Μ, δεν υπάρχει DTM που να
αποφασίζει αν η M τερµατίζει µε είσοδο x. Από την άλλη πλευρά, η παραπάνω γλώσ-
σα είναι DTM – αποδεκτή και, συνεπώς, το σύνολο των DTM – αποφασίσιµων γλωσ-
σών είναι γνήσιο υποσύνολο του συνόλου των DTM – αποδεκτών γλωσσών.
Το αξίωµα των Church – Turing πρεσβεύει ότι κάθε γλώσσα / συνάρτηση που µπο-
ρεί να αποφασιστεί / υπολογιστεί από έναν αλγόριθµο σε ένα οποιοδήποτε υπολο-
γιστικό µοντέλο µπορεί να υπολογιστεί και από µια Ντετερµινιστική Μηχανή Turing.
Το αξίωµα έχει αποδειχθεί για όλα τα υπολογιστικά µοντέλα που έχουν κατά και-
ρούς προταθεί (π.χ. λ – definability του Church, µ – αναδροµικές συναρτήσεις του
Godel, γενικές αναδροµικές συναρτήσεις των Herbrand – Godel, κανονικά συστή-
µατα του Post, αλγόριθµοι του Markov), ενώ κάθε συστηµατική προσπάθεια για να
αυξηθεί η κλάση των γλωσσών / συναρτήσεων που µπορούν να υπολογιστούν / απο-
φασιστούν από τις Ντετερµινιστικές Μηχανές Turing δεν είχε επιτυχία. Το αξίωµα
των Church – Turing τεκµηριώνει την επιλογή των Ντετερµινιστικών Μηχανών
Turing σαν βασικό υπολογιστικό µοντέλο για τη θεωρία πολυπλοκότητας.
158 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 7.1

Αποδείξτε τις ακόλουθες προτάσεις:


(1) Αν µία γλώσσα L είναι DTM – αποφασίσιµη, είναι και DTM – αποδεκτή.

(2) Αν µία γλώσσα L είναι DTM – αποφασίσιµη, και το συµπλήρωµά της L είναι
γλώσσα DTM – αποφασίσιµη.

(3) Μια γλώσσα L είναι DTM – αποφασίσιµη αν και µόνο αν τόσο η L όσο και το

συµπλήρωµά της L είναι DTM – αποδεκτές γλώσσες.

7.3 ÃÚÔÓÈ΋ ÔÏ˘ÏÔÎfiÙËÙ· Î·È Ë ÎÏ¿ÛË P

Η πολυπλοκότητα ενός υπολογιστικού προβλήµατος ορίζεται µε βάση την πολυ-


πλοκότητα των αλγόριθµων που λύνουν το πρόβληµα. Τα διάφορα κριτήρια αποδο-
τικότητας ενός αλγόριθµου (π.χ. χρόνος εκτέλεσης, αριθµός θέσεων µνήµης) δίνουν
την αφορµή για αντίστοιχα µέτρα πολυπλοκότητας.
Το βασικότερο ίσως κριτήριο για την αποδοτικότητα ενός αλγόριθµου είναι ο υπο-
λογιστικός χρόνος που απαιτείται για την επίλυση του προβλήµατος. Στην περίπτω-
ση µιας µηχανής Turing Μ, σαν χρονική µονάδα ορίζεται το υπολογιστικό βήµα της
Μ, που συνίσταται σε µία εφαρµογή της συνάρτησης µετάβασης. Η χρονική πολυ-
πλοκότητα ενός προβλήµατος Π είναι µια συνάρτηση που φράσσει άνω τον αριθµό
των στοιχειωδών βηµάτων που χρειάζεται µια µηχανή Turing για να αποφασίσει το
Π, δηλαδή φράσσει τον υπολογιστικό χρόνο που µπορεί να χρησιµοποιηθεί για να
αποφασιστεί ένα στιγµιότυπο του Π.
Συγκεκριµένα, έστω µία DTM M που τερµατίζει σε κάθε είσοδο. Ο χρόνος εκτέλε-
σης (running time) ή η χρονική πολυπλοκότητα (time complexity) της Μ είναι µία
συνάρτηση f : IN a IN, όπου για κάθε n Œ IN, το f(n) είναι ο µέγιστος αριθµός στοι-
χειωδών υπολογιστικών βηµάτων που χρειάζεται η Μ για να τερµατίσει µε είσοδο
µια οποιαδήποτε συµβολοσειρά x µήκους n, |x| = n. Αν η συνάρτηση f(n) δίνει το
χρόνο εκτέλεσης της Μ, λέµε ότι η Μ έχει χρόνο εκτέλεσης f(n), ή ότι η Μ είναι µία
DTM f(n) – χρόνου. Η χρονική πολυπλοκότητα ενός προβλήµατος απόφασης Π (µιας
γλώσσας L) είναι η χρονική πολυπλοκότητα της πιο αποδοτικής (όσον αφορά στον
χρόνο εκτέλεσης) DTM που αποφασίσει το Π (την L).
∆εδοµένης µιας συνάρτησης t : IN a IN η οποία µπορεί να αποτελέσει φράγµα στον
χρόνο εκτέλεσης µιας DTM, µπορούµε να ορίσουµε µια κλάση πολυπλοκότητας
7 . 3 Ã ƒ √ ¡ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞ ∫ ∞ π ∏ ∫ § ∞ ™ ∏ P 159

περιορισµένου ντετερµινιστικού υπολογιστικού χρόνου (deterministic time


complexity class) DTIME[t(n)], η οποία αποτελείται από όλες τις γλώσσες / προ-
βλήµατα µε χρονική πολυπλοκότητα Ο(t(n)). Συγκεκριµένα, ορίζουµε:
DTIME[t(n)] = { L : L είναι γλώσσα αποφασίσιµη από µία DTM Ο(t(n)) – χρόνου }.
∆εν είναι όλες οι συναρτήσεις t : IN a IN κατάλληλες για να αποτελέσουν φράγµα-
τα στον χρόνο εκτέλεσης µιας DTM και, άρα, κατάλληλες για τον ορισµό µιας κλά-
σης χρονικής πολυπλοκότητας. Οι συναρτήσεις t(n) που µπορούν να αποτελέσουν
φράγµατα στο χρόνο εκτέλεσης µιας DTM ονοµάζονται συναρτήσεις περιορισµού
(bounding functions). Κατ’ αρχήν, µια συνάρτηση περιορισµού t(n) πρέπει να είναι
αύξουσα, αφού πρέπει να επιτρέπει περισσότερο υπολογιστικό χρόνο για µεγαλύτε-
ρες συµβολοσειρές εισόδου. Επιπλέον, για κάθε συνάρτηση περιορισµού t(n) πρέπει
να υπάρχει µια DTM Mt, η οποία για κάθε είσοδο x µήκους n, γράφει τη συµβολο-
σειρά 1t(n), 1 Œ Σ, στην ταινία εξόδου σε χρόνο Ο(n + t(n)), έχοντας διαβάσει / γρά-
ψει σε Ο(t(n)) κελιά εκτός από αυτά που καταλαµβάνει η είσοδος x. Προφανώς, κάθε
συνάρτηση µε την παραπάνω ιδιότητα είναι ολική (total) και DTM – υπολογίσιµη.

¢Ú·ÛÙËÚÈfiÙËÙ· 7.3

Αποδείξτε ότι οι συναρτήσεις f1(n) = c, c Œ IN*, f2(n) = n και f 3 (n ) = È log nù είναι


συναρτήσεις περιορισµού.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 7.2

Έστω L µία γλώσσα που γίνεται αποδεκτή από µία DTM Μ µε χρονική πολυπλο-
κότητα t(n), όπου η t(n) είναι µία συνάρτηση περιορισµού. Αποδείξτε ότι η L είναι
και DTM – αποφασίσιµη σε χρόνο Ο(t(n)).

7.3.1 πÂÚ·Ú¯›· ÎÏ¿ÛÂˆÓ ¯ÚÔÓÈ΋˜ ÔÏ˘ÏÔÎfiÙËÙ·˜

Ένα σηµαντικό ερώτηµα σχετικά µε τις κλάσεις DTIME[t(n)] είναι αν η αύξηση της
τάξης µεγέθους της συνάρτησης t(n) επηρεάζει το µέγεθος της κλάσης. Το ακόλου-
θο θεώρηµα, που είναι γνωστό και σαν Θεώρηµα της Ιεραρχίας των Κλάσεων Χρο-
νικής Πολυπλοκότητας (Time Hierarchy Theorem), δείχνει ότι µια αύξηση της τάξης
µεγέθους της t(n) κατά ω(log t(n)) έχει σαν αποτέλεσµα την προσθήκη µιας, τουλά-
χιστον, γλώσσας στην κλάση DTIME[t(n)].
160 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

Θεώρηµα 7.1: Έστω t1(n) και t2(n) δύο συναρτήσεις περιορισµού. Αν t2(n) =
ω(t1(n) log t1(n)), η κλάση DTIME[t1(n)] είναι γνήσιο υποσύνολο
της κλάσης DTIME[t2(n)].
Απόδειξη: Θα αποδείξουµε το θεώρηµα ορίζοντας µία γλώσσα L του Σ = {0, 1}
η οποία µπορεί να αποφασιστεί από µία DTM t2(n) – χρόνου, αλλά
όχι και από µία DTM t1(n) – χρόνου. Συγκεκριµένα, η L αποτελείται
από όλα τα x Œ Σ*, |x| = n, που έχουν τη µορφή 1*0 <Τ>, όπου <Τ>
είναι η δυαδική κωδικοποίηση µιας DTM Τ µε δύο ταινίες που απορ-
ρίπτει το x σε t2(n) βήµατα. Η DTM Μ, της οποίας η λειτουργία περι-
γράφεται στη συνέχεια, αποφασίζει την L σε χρόνο t2(n).
(1) Η Μ χρησιµοποιεί ένα ρολόι ώστε να σταµατά µετά από το πολύ t2(n) βήµατα.
Αυτό είναι εφικτό, αφού υποθέσαµε ότι η t2(n) είναι συνάρτηση περιορισµού.
(2) Παράλληλα µε το ρολόι, η Μ:
(a) Ελέγχει αν το x έχει τη µορφή 1*0<Τ>, όπου <Τ> είναι η δυαδική κωδι-
κοποίηση µιας DTM Τ µε δύο ταινίες. Αν το x δεν είναι της µορφής 1*0<Τ>,
η Μ επιστρέφει ΟΧΙ. ∆ιαφορετικά, αποµονώνει το <Τ> και το αποθηκεύει σε
µία από τις ταινίες εργασίας.
(b) Προσοµοιώνει τη λειτουργία της Τ µε είσοδο x. Αν η προσοµοίωση µπο-
ρεί να ολοκληρωθεί σε t2(n) βήµατα και T(x) = ΟΧΙ, η Μ επιστρέφει ΝΑΙ. ∆ια-
φορετικά, η Μ επιστρέφει ΟΧΙ.
Από κατασκευή, η Μ πάντα ολοκληρώνει τον υπολογισµό της µετά από το πολύ
t2(n) βήµατα. Άρα, L = L(M) Œ DTIME[t2(n)]. Η απόδειξη ολοκληρώνεται απο-
δεικνύοντας ότι L œ DTIME[t1(n)].
Με σκοπό να καταλήξουµε σε άτοπο υποθέτουµε ότι L Œ DTIME[t1(n)]. Μπορεί
να αποδειχθεί ότι για κάθε DTM µε πολλαπλές ταινίες και χρόνο εκτέλεσης t(n),
υπάρχει µία DTM µε 2 ταινίες και χρόνο εκτέλεσης Ο(t(n) log t(n)) που προσο-
µοιώνει την πρώτη. Εποµένως, έστω µία DTM Τ¢ µε δύο ταινίες, η οποία αποφα-
σίζει τη L σε χρόνο c2 t1(n) log t1(n), για κάποια σταθερά c2 > 0.
Το στάδιο (2.a) της M που, επίσης, αποφασίζει την L χρειάζεται χρόνο n + c1, όπου
c1 είναι ο αριθµός των βηµάτων για την αναγνώριση και αποµόνωση του <Τ¢>. Το
στάδιο (2.b) της Μ χρειάζεται χρόνο c3t1(n) logt1(n), για κάποια σταθερά c3 > 0,
για να ολοκληρώσει την προσοµοίωση της Τ¢ µε είσοδο x. Αλλά αφού t2(n) =
ω(t1(n) log t1(n)), είναι t2(n) ≥ n + c1 + c3t1(n) log t1(n), για αρκούντως µεγάλες
τιµές του n.
7 . 3 Ã ƒ √ ¡ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞ ∫ ∞ π ∏ ∫ § ∞ ™ ∏ P 161

Άρα, για κάθε είσοδο x µε αρκούντως µεγάλο πρόθεµα 1*0, η Μ µπορεί να ολο-
κληρώσει την προσοµοίωση της Τ¢(x) πριν συµπληρωθούν t2(n) βήµατα, δηλαδή
πριν το ρολόι αναγκάσει την Μ να τερµατίσει. Όµως, για κάθε τέτοιο x, ισχύουν
οι παρακάτω ισοδυναµίες:
x Œ L ¤ Τ¢(x) = ΝΑΙ ¤ M(x) = ΟΧΙ ¤ x œ L
Εποµένως, υποθέτοντας ότι L Œ DTIME[t1(n)] καταλήξαµε σε άτοµο. Άρα, L œ
DTIME[t1(n)], και DTIME[t1(n)] Ã DTIME[t2(n)].

Ένα ενδιαφέρον πόρισµα του Θεωρήµατος 7.1 είναι η ιεραρχία των κλάσεων
DTIME[nk], για k = 1, 2, 3, …. Συγκεκριµένα, ισχύει ότι:
DTIME[n] Ã DTIME[n2] Ã DTIME[n3] Ã L

∆ύο σηµαντικές κλάσεις ντετερµινιστικής χρονικής πολυπλοκότητας (deterministic


time complexity classes) είναι οι P και EXP. Η κλάση P αποτελείται από όλα τα
προβλήµατα µε πολυωνυµική χρονική πολυπλοκότητα, και η κλάση EXP από όλα
τα προβλήµατα µε εκθετική χρονική πολυπλοκότητα. Τυπικά, είναι:

P = U k ≥0 DTIME[n k ] , και

EXP = U k ≥0 DTIME 2 n[ ]k

.Αφού κάθε γλώσσα που µπορεί να αποφασιστεί σε πολυωνυµικό χρόνο, µπορεί να


αποφασιστεί και σε εκθετικό χρόνο, είναι P Õ EXP. Από το Θεώρηµα 7.1 για την
Ιεραρχίας των Κλάσεων Χρονικής Πολυπλοκότητας συνάγεται ότι η κλάση P είναι
γνήσιο υποσύνολο της EXP. Επίσης, µπορεί να αποδειχθεί ότι οι κλάσεις P και EXP
δεν εξαρτώνται από τις παραµέτρους του υπολογιστικού µοντέλου.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 7.3

Αποδείξτε ότι P Ã EXP.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 7.4

Με βάση τους αλγόριθµους που ήδη γνωρίζετε, να εντάξετε σε κλάσεις χρονικής


πολυπλοκότητας τα προβλήµατα του Πολλαπλασιασµού Ακολουθίας Πινάκων και
της Μεγαλύτερης Κοινής Υποακολουθίας.
162 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

7.3.2 ∏ ÎÏ¿ÛË P

Η κλάση P είναι µια από τις σηµαντικότερες κλάσεις πολυπλοκότητας. Έχουµε ήδη
αναφερθεί στο αξίωµα των Cook – Karp που ταυτίζει την κλάση P µε την κλάση των
προβληµάτων που µπορούν να λυθούν αποδοτικά από µια υπολογιστική συσκευή.
Επιπλέον, είναι κοινή επιστηµονική πεποίθηση ότι η κλάση P παραµένει αµετάβλη-
τη για οποιοδήποτε εύλογο, ακολουθιακό υπολογιστικό µοντέλο. Για παράδειγµα,
µπορεί να αποδειχθεί ότι οποιοδήποτε πρόβληµα λύνεται σε πολυωνυµικό χρόνο από
έναν αλγόριθµο µιας Μηχανής Άµεσης Προσπέλασης Μνήµης (Random Access
Machine – RAM) µπορεί, επίσης, να λυθεί σε πολυωνυµικό χρόνο από µια Ντετερ-
µινιστική Μηχανή Turing.
Όλα τα προβλήµατα στα οποία έχουµε αναφερθεί µέχρι τώρα ανήκουν στην κλάση
P. Στη συνέχεια, θα αποδείξουµε ότι ένα πολύ γνωστό πρόβληµα ανήκει στο P.
Ικανοποιησιµότητα Λογικών Προτάσεων
Μια λογική πρόταση (boolean formula) αποτελείται από λογικές (boolean) µετα-
βλητές οι οποίες σχετίζονται µεταξύ τους µε λογικούς τελεστές (boolean operators).
Μια λογική πρόταση φ είναι σε συζευκτική κανονική µορφή (conjuctive normal form
– CNF) αν αποτελείται από τη σύζευξη φ = (c1 Ÿ c2 Ÿ … Ÿ cm) όρων (clauses), καθέ-
νας από τους οποίους αποτελείται από τη διάζευξη ci = (li1 Ú li2 Ú … Ú lik) ατόµων
(literals), όπου ένα άτοµο είναι µία λογική µεταβλητή (xi) ή η άρνησή της (ÿxi). Για
παράδειγµα, η λογική πρόταση (x1 Ú x2) Ÿ (x2 Ú x3) Ÿ (ÿx1 Ú ÿx3) είναι σε συζευκτι-
κή κανονική µορφή, ενώ η πρόταση (x1 Ú x2 Ÿ x3) Ÿ (x2 Ÿ x3 Ú x5 Ÿ x6) δεν είναι. Μία
λογική πρόταση είναι ικανοποιήσιµη (satisfiable) αν υπάρχει µία ανάθεση τιµών στις
λογικές µεταβλητές της που κάνει την πρόταση αληθή.
Το πρόβληµα της k – ικανοποιησιµότητας είναι, δεδοµένης µιας λογικής πρότασης
φ σε συζευκτική κανονική µορφή (ΣΚΜ) που περιέχει το πολύ k άτοµα σε κάθε όρο,
να αποφασιστεί αν η φ είναι ικανοποιήσιµη. Το πρόβληµα της k – ικανοποιησιµό-
τητας και διάφορες παραλλαγές του είναι από τα κεντρικά προβλήµατα στη θεωρία
πολυπλοκότητας, επειδή η λειτουργία µιας µηχανής Turing Μ µπορεί να κωδικο-
ποιηθεί σε µια λογική πρόταση φ, µε τρόπο ώστε η φ να είναι ικανοποιήσιµη αν και
µόνο αν η Μ αποδέχεται την είσοδό της.
Παρόλο που δεν γνωρίζουµε αν το πρόβληµα της k – ικανοποιησιµότητας, για k ≥ 3,
ανήκει στο P, θα αποδείξουµε ότι το πρόβληµα της 2 – ικανοποιησιµότητας µπορεί
να αποφασιστεί σε πολυωνυµικό χρόνο.
7 . 3 Ã ƒ √ ¡ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞ ∫ ∞ π ∏ ∫ § ∞ ™ ∏ P 163

Θεώρηµα 7.2: Το πρόβληµα της 2 – ικανοποιησιµότητας ανήκει στο P.


Απόδειξη: Έστω µία λογική πρόταση φ σε ΣΚΜ µε το πολύ 2 άτοµα σε κάθε
όρο. Χωρίς βλάβη της γενικότητας, θεωρούµε ότι η φ περιέχει
ακριβώς 2 άτοµα σε κάθε όρο. Παρατηρούµε ότι ένας όρος της
µορφής (x Ú y) είναι ισοδύναµος µε τους όρους (ÿx Æ y) και (ÿy
Æ x). Για να αποφασίσουµε αν η φ είναι ικανοποιήσιµη, ορίζου-
µε ένα κατευθυντικό γράφηµα Gφ(V, E) µε µια κορυφή για κάθε
άτοµο της φ. ∆ηλαδή, V = {x1, x2, …, xn} » {ÿx1, ÿx2, …, ÿxn},
όπου x1, x2, …, xn είναι οι λογικές µεταβλητές της φ. Για κάθε όρο
(li Ú lj) της φ, προσθέτουµε στο Gφ τις ακµές (ÿli, lj) και (ÿlj, li)
θεωρώντας τις κορυφές x και ÿÿx σαν ταυτόσηµες. Από κατα-
σκευή, το γράφηµα G είναι συµµετρικό όσον αφορά στις ακµές
του. ∆ηλαδή, το Gφ περιέχει την ακµή (l, l¢) αν και µόνο αν περιέ-
χει την ακµή (ÿl¢, ÿl). Στη Σχήµα 7.1 φαίνεται το γράφηµα Gφ(V,
E) που αντιστοιχεί στη λογική πρόταση φ = (x1 Ú x2) Ÿ (x1 Ú ÿx3)
Ÿ (ÿx1 Ú x2) Ÿ (x2 Ú x3).

ÿx
3

x1 x3

ÿx ÿx
1 2
™¯‹Ì· 7.1
Ένα παράδειγµα
γραφήµατος
x2 Gφ(V, Ε).

Για να αποδείξουµε το θεώρηµα, θα δείξουµε ότι η πρόταση φ δεν είναι ικανο-


ποιήσιµη αν και µόνο αν, για κάποια µεταβλητή x, υπάρχει µονοπάτι από τη x στη
ÿ
x (και – λόγω συµµετρίας – µονοπάτι από τη ÿx στη x).
Αρχικά, υποθέτουµε ότι η φ είναι ικανοποιήσιµη και, έστω ρ µία ανάθεση τιµών στις
λογικές µεταβλητές που ικανοποιεί την φ. Έστω ότι για κάποια µεταβλητή x είναι ρ(x)
= 1 (TRUE) και υπάρχει µονοπάτι p από τη x στη ÿx. Αφού ρ(x) = 1 και ρ(ÿx) = 0
(FALSE), το p πρέπει να περιέχει τουλάχιστον µία ακµή (l1, l2), τέτοια, ώστε ρ(l1) = 1
164 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

και ρ(l2) = 0. Αυτό σηµαίνει ότι ο όρος (ÿl1 Ú l2), που αντιστοιχεί στην ακµή (l1, l2),
αποτιµάται στο 0 από την ανάθεση ρ, γεγονός που αντιβαίνει στην υπόθεση ότι η φ
είναι ικανοποιήσιµη. Το ίδιο επιχείρηµα µπορεί να χρησιµοποιηθεί και όταν ρ(x) = 0.
Για το αντίστροφο, υποθέτοντας ότι δεν υπάρχει µεταβλητή x, µε µονοπάτι από
τη x στη ÿx στο γράφηµα Gφ, θα κατασκευάσουµε µία ανάθεση ρ που ικανοποιεί
την φ. Η κατασκευή µιας ανάθεσης που ικανοποιεί την φ είναι ισοδύναµη µε την
κατασκευή µιας ανάθεσης λογικών τιµών στις κορυφές του Gφ, ώστε καµία ακµή
να µην κατευθύνεται από κορυφή µε τιµή 1 σε κορυφή µε τιµή 0.
Για να κατασκευάσουµε την ανάθεση ρ, σε κάθε βήµα, επιλέγουµε µία κορυφή l
στην οποία δεν έχει ανατεθεί λογική τιµή και θέτουµε ρ(l) = 1. Επιπλέον, για κάθε
κορυφή l¢ που είναι προσπελάσιµη από την l, θέτουµε ρ(l¢) = 1. Επίσης, θέτουµε
τις αρνήσεις όλων των παραπάνω ατόµων στην τιµή 0 (δηλαδή, ρ(ÿl) = 0, και για
κάθε l¢ προσπελάσιµη από την l, ρ(ÿl¢) = 0).
Πρέπει να αποδείξουµε ότι αυτή η ανάθεση είναι συνεπής, δηλαδή δεν υπάρχει
άτοµο µε ρ(l) = ρ(ÿl). Έχουµε ήδη υποθέσει ότι δεν υπάρχει µονοπάτι από κάποιο
άτοµο l στο ÿl. Επίσης, δεν υπάρχει κορυφή x, τέτοια, ώστε, τόσο η x όσο και η
ÿ
x να είναι προσπελάσιµες από την l. Αν η ÿx ήταν προσπελάσιµη από την l, τότε
– λόγω συµµετρίας του Gφ – η ÿl θα ήταν προσπελάσιµη από την x και, συνεπώς,
η ÿl θα ήταν προσπελάσιµη από την l µέσω της x. Αυτό αντιβαίνει στην υπόθε-
ση ότι η ÿl δεν είναι προσπελάσιµη από την l. Επίσης, αν υπήρχε µονοπάτι p από
την l σε µία κορυφή x στην οποία έχει ήδη ανατεθεί η τιµή 0, η ÿl θα ήταν προ-
σπελάσιµη από τη ÿx (λόγω συµµετρίας), και η τιµή 0 θα έπρεπε να έχει ανατεθεί
στην l στο ίδιο βήµα µε τη x. Άρα, η ανάθεση ρ που κατασκευάζεται µε αυτό τον
τρόπο είναι συνεπής και ικανοποιεί την φ.
Το γράφηµα Gφ(V, E) µπορεί εύκολα να κατασκευαστεί σε χρόνο Ο(n + m), όπου
n o αριθµός των µεταβλητών και m ο αριθµός των όρων της φ. Επίσης, χρησιµο-
ποιώντας το ΨΠΠ µπορούµε να ελέγξουµε αν, στο γράφηµα Gφ, κάποια κορυφή
ÿ
x είναι προσπελάσιµη από την κορυφή x σε χρόνο Ο(n2 + nm). Αφού το µήκος
της συµβολοσειράς που περιγράφει την φ πρέπει να είναι Ω(n + m), ο παραπάνω
αλγόριθµος αποφασίζει αν η φ είναι ικανοποιήσιµη σε πολυωνυµικό χρόνο.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 7.5

Αποδείξτε ότι το P είναι κλειστό ως προς την ένωση, την τοµή και το συµπλήρω-

µα, δηλαδή ότι αν δύο γλώσσες L1, L2 Œ P, τότε και L1 » L2, L1 « L2, L1 Œ P.
7 . 4 ∞ ¡ ∞ ° ø ° ∏ ∫ ∞ π ¶ § ∏ ƒ √ ∆ ∏ ∆∞ 165

7.4 ∞Ó·ÁˆÁ‹ Î·È ÏËÚfiÙËÙ·

Στο επόµενο κεφάλαιο, θα παραθέσουµε ισχυρές ενδείξεις που υποστηρίζουν την


κοινή επιστηµονική πεποίθηση ότι, για k ≥ 3, το πρόβληµα της k – ικανοποιησιµό-
τητας δεν ανήκει στην κλάση P. Αυτές οι ενδείξεις βασίζονται στις έννοιες της ανα-
γωγής (reduction) ενός προβλήµατος (γλώσσας) σε ένα άλλο, και της πληρότητας
(completeness) ενός προβλήµατος (γλώσσας) για κάποια κλάση πολυπλοκότητας.
Οι έννοιες της αναγωγής και της πληρότητας είναι κεντρικές στη θεωρία πολυπλο-
κότητας και, σχετίζονται µε το γεγονός ότι, συγκεκριµένα προβλήµατα συνοψίζουν
τη δυσκολία µιας ολόκληρης κλάσης πολυπλοκότητας. Συγκεκριµένα, ένα πρόβλη-
µα συνοψίζει τη δυσκολία µιας κλάσης πολυπλοκότητας αν µπορεί να αποδειχθεί ότι
είναι τουλάχιστον τόσο δύσκολο να λυθεί όσο κάθε άλλο πρόβληµα της κλάσης. Ένα
τέτοιο πρόβληµα λέγεται δύσκολο (hard) για τη συγκεκριµένη κλάση, και αν έχει την
επιπλέον ιδιότητα να ανήκει στην κλάση, λέγεται πλήρες (complete). Οι έννοιες της
αναγωγής και της πληρότητας χρησιµοποιούνται πολύ συχνά για να διατυπωθούν
εικασίες και να αποδειχθούν θεωρήµατα για τις σχέσεις κλάσεων πολυπλοκότητας.
Προκειµένου να εντοπίσουµε κάποια προβλήµατα που συνοψίζουν τη δυσκολία µιας
ολόκληρης κλάσης προβληµάτων, χρειαζόµαστε έναν τρόπο να αξιολογούµε συγκρι-
τικά τη δυσκολία δύο προβληµάτων. Η έννοια της αναγωγής (reduction) καλύπτει
αυτήν ακριβώς την αναγκαιότητα.
Ένα πρόβληµα Π1 ανάγεται (reduces) σε ένα πρόβληµα Π2, αν υπάρχει ένας µετα-
σχηµατισµός R ο οποίος, για κάθε είσοδο x του Π1 παράγει µια ισοδύναµη είσοδο
R(x) του Π2. Μια είσοδος x για το Π1 είναι ισοδύναµη µε µια είσοδο R(x) για το Π2,
όταν x Œ Π1 (δηλαδή, κάποια DTM Μ που αποφασίζει το Π1 δίνει M(x) = ΝΑΙ) αν και
µόνο αν R(x) Œ Π2. Στην πράξη, αν ο µετασχηµατισµός R αποτελεί µια αναγωγή του
Π1 στο Π2, για να αποφασίσουµε το Π1 µε είσοδο x, αρκεί να υπολογίσουµε το R(x)
και να αποφασίσουµε το Π2 µε είσοδο R(x) (Σχήµα 7.2).

Aλγόριθµος για Π1

R(x)
x R Aλγόριθµος για Π2 NAI/OXI
™¯‹Ì· 7.2
Μια αναγωγή R
του προβλήµατος Π1
στο πρόβληµα Π2.
166 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

Όµως η δυνατότητα αναγωγής ενός προβλήµατος Π1 σε ένα πρόβληµα Π2 δεν αρκεί


για να στοιχειοθετήσει ότι το Π2 είναι τουλάχιστον τόσο δύσκολο όσο το Π1. Πρέ-
πει, επιπλέον, ο µετασχηµατισµός R, ο οποίος αποτελεί την αναγωγή, να υπολογί-
ζεται από κάποιον αποδοτικό αλγόριθµο.

Ορισµός 7.4: Ένα πρόβληµα Π1 ανάγεται σε ένα πρόβληµα Π2 (συµβολίζεται


Π1 µ Π2), αν υπάρχει µια ολική συνάρτηση R που υπολογίζεται
από µια DTM πολυωνυµικού χρόνου, τέτοια, ώστε, για κάθε στιγ-
µιότυπο x, x Œ Π1 αν και µόνο αν R(x) Œ Π2. Η συνάρτηση / µετα-
σχηµατισµός R αποτελεί την αναγωγή του Π1 στο Π2.

Η µορφή αναγωγής του Ορισµού 7.4 ονοµάζεται και πολυωνυµική αναγωγή


(polynomial reduction) ή αναγωγή του Karp (Karp reduction).

¢Ú·ÛÙËÚÈfiÙËÙ· 7.4

Αποδείξτε ότι η πολυωνυµική αναγωγή είναι µεταβατική, δηλαδή ότι, για κάποια
προβλήµατα Π1, Π2, Π3, αν Π1 µ Π2 και Π2 µ Π3, τότε Π1 µ Π3.

¢Ú·ÛÙËÚÈfiÙËÙ· 7.5

Αποδείξτε ότι η κλάση P είναι κλειστή ως προς την πολυωνυµική αναγωγή, δηλα-
δή αν κάποιο πρόβληµα Π2 Œ P και κάποιο πρόβληµα Π1 ανάγεται πολυωνυµικά
στο Π2, τότε και Π2 Œ P.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 7.6

Το πρόβληµα του διµερούς γραφήµατος (bipartite graph) είναι, δεδοµένου ενός µη


κατευθυντικού γραφήµατος G(V, E), να αποφασιστεί να είναι δυνατός ο διαχωρι-
σµός των κορυφών του V σε δύο ξένα υποσύνολα V1 και V2, τα οποία δεν περιέ-
χουν καθόλου ακµές µεταξύ των κορυφών τους (Άσκηση Αυτοαξιολόγησης 7.2).
Περιγράψτε µια πολυωνυµική αναγωγή του προβλήµατος του διµερούς γραφήµα-
τος στο πρόβληµα της 2 – ικανοποιησιµότητας.
7 . 4 ∞ ¡ ∞ ° ø ° ∏ ∫ ∞ π ¶ § ∏ ƒ √ ∆ ∏ ∆∞ 167

Σαν µεταβατική σχέση, η αναγωγή µεταξύ υπολογιστικών προβληµάτων (ή γλωσ-


σών) παράγει µια µερική διάταξη των προβληµάτων µε κριτήριο τη δυσκολία τους.
Ιδιαίτερο ενδιαφέρον έχουν τα ακραία (maximal) στοιχεία αυτής της διάταξης, που
αντιστοιχούν στα δυσκολότερα προβλήµατα.

Ορισµός 7.5: Έστω C µία κλάση πολυπλοκότητας. Αν κάθε πρόβληµα Π¢ Œ C


ανάγεται σε ένα πρόβληµα Π, το Π ονοµάζεται δύσκολο για την
κλάση C (C – δύσκολο, C – hard). Αν, επιπλέον, το Π ανήκει
στην κλάση C, ονοµάζεται πλήρες για την κλάση C (C – πλήρες,
C – complete).

Από τον ορισµό, δεν είναι καθόλου προφανές ότι υπάρχουν πλήρη προβλήµατα για
κάθε κλάση. Παρόλα αυτά, µπορεί να αποδειχθεί ότι αρκετά γνωστά προβλήµατα
είναι πλήρη για την κλάση P, ενώ στο επόµενο κεφάλαιο θα αποδείξουµε ότι µερι-
κά οικεία προβλήµατα είναι πλήρη για µια άλλη πολύ σηµαντική κλάση, το NP.
Τα πλήρη προβλήµατα αποτελούν µια κεντρική έννοια και ένα πολύ σηµαντικό µεθο-
δολογικό εργαλείο για τη θεωρία πολυπλοκότητας. Η πολυπλοκότητα ενός υπολο-
γιστικού προβλήµατος θεωρείται ότι έχει καθοριστεί όταν αυτό αποδειχθεί πλήρες
για κάποια κλάση. Από την άλλη πλευρά, τα πλήρη προβλήµατα συνοψίζουν την
υπολογιστική δυσκολία όλων των προβληµάτων κάθε κλάσης και αποτελούν το σύν-
δεσµο των κλάσεων πολυπλοκότητας µε τη θεωρία αλγορίθµων και τις εφαρµογές
της Επιστήµης των Υπολογιστών.
Για παράδειγµα, η ύπαρξη σηµαντικών πρακτικών προβληµάτων που είναι πλήρη
για κάποια κλάση προσδίδει στην κλάση πρακτική αξία που, συνήθως, δεν είναι
ξεκάθαρη από τον ορισµό της. Αντίστροφα, αν µια κλάση δεν έχει σηµαντικά ή,
έστω, γνωστά πρακτικά πλήρη προβλήµατα, αυτόµατα η κλάση θεωρείται θεωρητι-
κό κατασκεύασµα χωρίς ουσιαστικό περιεχόµενο.
Παρόλα αυτά, η έννοια της πληρότητας, συνήθως, χρησιµοποιείται για την απόδει-
ξη αρνητικών αποτελεσµάτων της εξής µορφής: Αν ένα πρόβληµα Π είναι πλήρες
για µία κλάση C, τότε θεωρείται απίθανο το Π να ανήκει σε κάποια πιο αδύναµη
κλάση C¢ Õ C, δηλαδή σε κάποια κλάση που περιλαµβάνει ευκολότερα προβλήµα-
τα. Ο λόγος είναι ότι αν η C¢ είναι κλειστή ως προς την αναγωγή και το Π ανήκει
στη C¢, τότε η C πρέπει να ταυτίζεται µε την πιο αδύναµη κλάση C¢, δηλαδή πρέπει
η C να καταπίπτει (collapse) στην C¢.
168 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

¢Ú·ÛÙËÚÈfiÙËÙ· 7.6

Αν δύο κλάσεις C και C¢ είναι κλειστές ως προς την αναγωγή, και υπάρχει ένα πρό-
βληµα Π που είναι πλήρες τόσο για τη C όσο και για τη C¢, τότε C = C¢.

™‡ÓÔ„Ë
Σε αυτό το κεφάλαιο ορίστηκαν µερικές κεντρικές έννοιες της θεωρίας υπολογιστι-
κής πολυπλοκότητας. Στη θεωρία πολυπλοκότητας, τα ίδια τα υπολογιστικά προβλή-
µατα αποτελούν αντικείµενο µελέτης. Κάθε υπολογιστικό πρόβληµα µπορεί να µετα-
τραπεί σε πρόβληµα απόφασης, και µέσω κατάλληλης κωδικοποίησης, να αντιστοι-
χηθεί σε µία τυπική γλώσσα.
Μεταξύ άλλων, η υπολογιστική πολυπλοκότητα διαχωρίζει τα προβλήµατα σε ευεπί-
λυτα και δυσεπίλυτα. Ο διαχωρισµός αυτός γίνεται µε βάση την αποδοτικότητα των
αλγορίθµων που λύνουν ένα πρόβληµα. Το αξίωµα των Cook – Karp ταυτίζει τα ευε-
πίλυτα προβλήµατα µε αυτά που λύνονται από αλγόριθµους πολυωνυµικού χρόνου.
Το βασικό υπολογιστικό µοντέλο για τη θεωρία πολυπλοκότητας είναι οι Ντετερµινιστι-
κές Μηχανές Turing (DTM) µε πολλαπλές ταινίες, οι οποίες αποτελούν το θεωρητικό
ισοδύναµο των υπολογιστών που εκτελούν µόνο ένα προκαθορισµένο πρόγραµµα.
Ένα βασικό κριτήριο πολυπλοκότητας είναι αυτό του υπολογιστικού χρόνου που απαι-
τείται για την επίλυση ενός προβλήµατος. Η κλάση DTIME[t(n)] περιλαµβάνει όλα
τα προβλήµατα που λύνονται από µια DTM σε χρόνο Ο(t(n)). Το Θεώρηµα της Ιεραρ-
χίας των Κλάσεων Χρονικής Πολυπλοκότητας αποδεικνύει ότι κάθε υπερ – λογαριθ-
µική αύξηση της συνάρτηση t(n) επιτρέπει την προσθήκη και νέων προβληµάτων στην
αρχική κλάση. Το P είναι η κλάση των προβληµάτων που λύνονται σε πολυωνυµικό
χρόνο, και το EXP είναι η κλάση των προβληµάτων που λύνονται σε εκθετικό χρόνο.
Η πολυωνυµική αναγωγή επιτρέπει την µερική διάταξη των προβληµάτων µε κριτή-
ριο την υπολογιστική τους δυσκολία. Όταν ένα πρόβληµα Π1 ανάγεται πολυωνυµικά
σε ένα πρόβληµα Π2, το Π2, είναι τουλάχιστον τόσο δύσκολο όσο το Π1. Ένα πρό-
βληµα Π λέγεται πλήρες για κάποια κλάση πολυπλοκότητας C, όταν ανήκει στην
κλάση, και κάθε άλλο πρόβληµα που ανήκει στην C ανάγεται στο Π. ∆ηλαδή, το Π
είναι ένα από τα δυσκολότερα προβλήµατα της C.
B I B § I O ° PA º I A 169

µÈ‚ÏÈÔÁÚ·Ê›·

Για µία ολοκληρωµένη, σε βάθος παρουσίαση της Θεωρίας Υπολογιστικής Πολυ-


πλοκότητας, προτείνεται το βιβλίο:
[1] C.H. Papadimitriou. Computational Complexity. Addison – Wesley, 1994. Παρέ-
χει µια εξαιρετικά κατανοητή και σε βάθος παρουσίαση όλων των σηµαντικών
ζητηµάτων της υπολογιστικής πολυπλοκότητας. Έχει εξαιρετική συλλογή παρα-
δειγµάτων και ασκήσεων.
Όσον αφορά στις έννοιες των τυπικών γλωσσών, των µηχανών Turing, βασικών
εναλλακτικών µοντέλων υπολογισµού και θεµελιωδών κλάσεων πολυπλοκότητας,
προτείνονται τα παρακάτω βιβλία:
[2] J.E. Hopcroft και J.D. Ullman. Introduction to Automata Theory, Languages,
and Computation. Addison – Wesley, 1979. Κλασσικό βιβλίο για θέµατα αυτο-
µάτων, τυπικών γλωσσών, µηχανών Turing και µη υπολογισιµότητας.
[3] H.R. Lewis και C.H. Papadimitriou. Elements of the Theory of Computation.
Prentice – Hall, 1981. Πολύ καλή και σε βάθος παρουσίαση των µηχανών Turing
και της µη υπολογισιµότητας. Εξαιρετική συλλογή ασκήσεων. Κυκλοφορεί
µεταφρασµένο στα Ελληνικά.
[4] M. Sipser. Introduction to the Theory of Computation. PWS Publishing, 1997.
Σύγχρονο βιβλίο που διαπραγµατεύεται τόσο θέµατα Θεωρίας Υπολογισµού
όσο και θέµατα Υπολογιστικής Πολυπλοκότητας.
ªË ¡ÙÂÙÂÚÌÈÓÈÛÌfi˜ Î·È NP – ¶ÏËÚfiÙËÙ·

™ÎÔfi˜
∫ ∂

8
º

Σε αυτό το κεφάλαιο, αφού περιγράψουµε την ιδέα του µη ντετερµινισµού και ορί-
σουµε το υπολογιστικό µοντέλο των Μη Ντετερµινιστικών Μηχανών Turing, θα ορί-
σουµε την κλάση NP και θα µελετήσουµε τις σηµαντικές εφαρµογές της στο χώρο της
συνδυαστικής βελτιστοποίησης.
∞ § ∞ π √

¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·
Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση:
• Να ορίζει µια Μη Ντετερµινιστική Μηχανή Turing.
• Να ορίζει την κλάση NP µε δύο διαφορετικούς, ισοδύναµους τρόπους.
• Να αποδεικνύει ότι ένα πρόβληµα ανήκει στο NP.
• Να περιγράφει τη σχέση των κλάσεων P και NP και τις αλγοριθµικές συνέπειες
της NP – Πληρότητας.

ŒÓÓÔȘ ÎÏÂȉȿ
• Μη Ντετερµινισµός και Μη Ντετερµι- Turing.
νιστική Μηχανή Turing • Κλάσεις NTIME[◊] και NP
• Αποφασίσιµες και αποδεκτές γλώσσες • NP – Πληρότητα και σχέση κλάσεων
από Μη Ντετερµινιστικές Μηχανές P και NP

∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Ό,τι έχει παρουσιαστεί µέχρι αυτό το σηµείο του βιβλίου βασίζεται στα ρεαλιστικά
υπολογιστικά µοντέλα της Μηχανής Άµεσης Προσπέλασης Μνήµης (RAM) και της
Ντετερµινιστικής Μηχανής Turing (DTM). Σε αντίθεση µε τα προηγούµενα, το υλικό
αυτού του κεφαλαίου βασίζεται στο µη ρεαλιστικό υπολογιστικό µοντέλο των Μη Ντε-
τερµινιστικών Μηχανών Turing (Non – Deterministic Turing Machines – NDTM).
Αντί του µονοσήµαντα ορισµένου (ντετερµινιστικού) τρόπου µε τον οποίο εξελίσσε-
ται ο υπολογισµός σε µία DTM, δεδοµένης µιας συµβολοσειράς εισόδου, ο υπολογι-
σµός µίας NDTM πολυωνυµικού χρόνου µπορεί να εξελιχθεί µε έναν εκθετικό αριθ-
µό διαφορετικών (αλλά όχι ανεξάρτητων) τρόπων. Η NDTM αποδέχεται µία γλώσ-
172 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞

σα αν ένας τουλάχιστον από αυτούς τους διαφορετικούς τρόπους εξέλιξης του υπο-
λογισµού καταλήγει σε αποδοχή.
Χονδρικά, µία NDTM πολυωνυµικού χρόνου είναι σαν να αποτελείται από έναν εκθε-
τικά µεγάλο αριθµό διαφορετικών (αλλά συσχετιζόµενων) DTM. Για κάθε είσοδο, η
NDTM διαλέγει από αυτές τις διαφορετικές DTM και επικαλείται αυτήν που έχει το
«πλέον επιθυµητό» αποτέλεσµα. ∆ιαφορετικά, η NDTM προσοµοιώνει όλες τις δια-
φορετικές DTM που την αποτελούν στο χρόνο που χρειάζεται για να ολοκληρωθεί ο
υπολογισµός της πιο αργής από αυτές, και επιστρέφει το «καλύτερο αποτέλεσµα».
Θα δούµε ότι κάθε NDTM µπορεί να προσοµοιωθεί από µία DTM µε εκθετική επι-
βάρυνση στο χρόνο εκτέλεσης. Αν αυτή η προσοµοίωση µπορεί να εκτελεστεί µε
πολυωνυµική µόνο επιβάρυνση ή όχι, αποτελεί, ίσως, το πιο γνωστό και σηµαντικό
ανοικτό ερώτηµα στη Θεωρητική Επιστήµη των Υπολογιστών. Μια από τις πιο γνω-
στές διατυπώσεις αυτού του ερωτήµατος αφορά στην ισότητα των κλάσεων πολυ-
πλοκότητας P και NP.
Από την παραπάνω αδρή περιγραφή γίνεται φανερό γιατί το µοντέλο των Μη Ντε-
τερµινιστικών Μηχανών Turing δεν αποτελεί ένα ρεαλιστικό υπολογιστικό µοντέλο.
Άλλωστε, ο µη ντετερµινισµός δεν έχει στόχο να αποτελέσει ένα µαθηµατικό µοντέ-
λο περιγραφής µιας συγκεκριµένης, πρακτικής ή ιδεατής, µορφής υπολογισµού. Ο
λόγος που ο µη ντετερµινισµός αποτελεί αντικείµενο διεξοδικής µελέτης στη Θεωρία
Πολυπλοκότητας είναι οι εφαρµογές του σε άλλες περιοχές της Επιστήµης των Υπο-
λογιστών, όπως η Μαθηµατική Λογική, η Τεχνητή Νοηµοσύνη και η Συνδυαστική
Βελτιστοποίηση. Η κλάση NP, µε τα πολλά και σηµαντικά πλήρη και δύσκολα προ-
βλήµατα, αποτελεί µια από τις βασικές εφαρµογές του µη ντετερµινισµού στη περιο-
χή της Συνδυαστικής Βελτιστοποίησης (Combinatorial Optimization).
Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες:
8.1. Μη Ντετερµινιστικές Μηχανές Turing
8.2. Η Κλάση NP
8.3. NP–Πληρότητα
8.1 ª∏ ¡∆∂∆∂ƒªπ¡π™∆π∫∂™ ª∏Ã∞¡∂™ TURING 173

8.1 ªË ÓÙÂÙÂÚÌÈÓÈÛÙÈΤ˜ Ì˯·Ó¤˜ Turing

Ο ορισµός µιας Μη Ντετερµινιστικής Μηχανής Turing είναι παρόµοιος µε αυτόν


µιας DTM. Μια Μη Ντετερµινιστική Μηχανή Turing (Non – Deterministic Turing
Machine – NDTM) Ν µε k ταινίες ορίζεται από διατεταγµένη τετράδα Ν = (Q, Σ, ∆,
q0). Όπως και στον ορισµό µιας DTM, τα Q και Σ συµβολίζουν το σύνολο κατα-
στάσεων και το αλφάβητο εισόδου της Ν, αντίστοιχα, ενώ το q0 συµβολίζει την αρχι-
κή κατάσταση.
Σε µια Μη Ντετερµινιστική Μηχανή Turing, το επόµενο βήµα του υπολογισµού
(δηλαδή η επόµενη διαµόρφωση – configuration) δεν ορίζεται µονοσήµαντα. Αντί-
θετα, σε κάθε βήµα, µε βάση την τρέχουσα διαµόρφωση, η NDTM επιλέγει την επό-
µενή της διαµόρφωση από ένα σύνολο επιτρεπτών διαµορφώσεων. Εποµένως, ο υπο-
λογισµός της Ν δεν καθορίζεται πλέον από µία συνάρτηση µετάβασης, αλλά από µία
σχέση µετάβασης, η οποία συµβολίζεται µε ∆. Για κάθε διαµόρφωση, η σχέση ∆ ορί-
ζει καµία ή περισσότερες επόµενες, επιτρεπτές διαµορφώσεις. Για κάθε διαµόρφω-
ση, ο αριθµός των επόµενων, επιτρεπτών διαµορφώσεων είναι πεπερασµένος, όπως
πεπερασµένη είναι και η σχέση µετάβασης ∆. Αυστηρά, η σχέση ∆ ορίζεται σαν:
∆ Õ ((Q – F) ¥ Γk) ¥ (Q ¥ Γk ¥ {L, R, S}k).
Από τον ορισµό, γίνεται φανερό ότι οι DTM αποτελούν µια ειδική κατηγορία
NDTM. Συγκεκριµένα, µία DTM είναι µία NDTM της οποίας η σχέση µετάβασης
∆ έχει την επιπλέον ιδιότητα να είναι συνάρτηση.

8.1.1 °ÏÒÛÛ˜ ·Ô‰ÂÎÙ¤˜ Î·È ·ÔÊ·Û›ÛÈ̘ ·fi NDTM

Η αιτία που η ιδέα του µη ντετερµινισµού έχει σαν αποτέλεσµα ένα ελάχιστα ρεαλι-
στικό, αλλά πολύ ισχυρό υπολογιστικό µοντέλο έγκειται στη µικρή εξάρτηση του υπο-
λογισµού και της εξόδου µίας NDTM από τη συµβολοσειρά εισόδου. Σε αντίθεση µε
τα ντετερµινιστικά υπολογιστικά µοντέλα, όπου κάθε είσοδος αντιστοιχεί µονοσή-
µαντα σε µία ακολουθία υπολογισµού και διαµόρφωση εξόδου, κάθε είσοδος µιας
NDTM επιτρέπει την επιλογή ανάµεσα σε πολλές διαφορετικές ακολουθίες υπολογι-
σµών (computation paths) και διαµορφώσεις εξόδου. Από όλες τις διαφορετικές, επι-
τρεπτές διαµορφώσεις εξόδου, η NDTM επιλέγει κάθε φορά την «πλέον επιθυµητή».
Συγκεκριµένα, λέµε ότι µία NDTM Ν αποδέχεται µία συµβολοσειρά εισόδου x Œ Σ*,
όταν µία τουλάχιστον από τις επιτρεπτές ακολουθίες υπολογισµών της Ν(x) είναι υπο-
λογισµός αποδοχής (accepting computation), δηλαδή καταλήγει σε κατάσταση τερ-
µατισµού ΝΑΙ. Αντίστροφα, για να απορριφθεί µια συµβολοσειρά εισόδου πρέπει όλες
οι επιτρεπτές ακολουθίες υπολογισµών να είναι είτε υπολογισµοί απόρριψης (rejecting
174 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞

computations), δηλαδή να καταλήγουν σε κατάσταση ΟΧΙ, είτε υπολογισµοί τερµατι-


σµού (halting computations), δηλαδή να καταλήγουν σε κατάσταση ΠΕΡΑΣ.
Μία γλώσσα L Õ Σ* είναι NDTM – αποδεκτή (NDTM – acceptable) όταν υπάρχει
µια NDTM Ν η οποία αποδέχεται την L, δηλαδή για κάθε x Œ L, η Ν(x) επιτρέπει
τουλάχιστον έναν υπολογισµό αποδοχής, και για κάθε x œ L, όλες οι επιτρεπτές ακο-
λουθίες υπολογισµών της N(x) είναι υπολογισµοί απόρριψης ή τερµατισµού. Μία
γλώσσα L Õ Σ* είναι NDTM – αποφασίσιµη (NDTM – decidable) όταν υπάρχει µια
NDTM Ν που αποδέχεται την L, τέτοια, ώστε, για κάθε x Œ Σ*, όλες οι επιτρεπτές
ακολουθίες υπολογισµών της N(x) τερµατίζουν µετά από πεπερασµένο αριθµό βηµά-
των. Σε αυτή την περίπτωση, λέµε ότι η Ν αποφασίζει την γλώσσα L.
Ένας τρόπος αναπαράστασης της λειτουργίας µιας NDTM Ν µε είσοδο x είναι µέσω
του δέντρου υπολογισµών (computation tree). Στο δέντρο υπολογισµών της Ν(x), κάθε
επιτρεπτό ενδιάµεσο βήµα υπολογισµού (διαµόρφωση) αναπαρίσταται µε έναν κόµβο.
Οι άµεσοι απόγονοι / παιδιά κάθε διαµόρφωσης / κόµβου είναι όλες οι επιτρεπτές δια-
µορφώσεις που µπορούν να παραχθούν από αυτή σε ένα βήµα. Αν όλες οι ακολουθίες
/ κλάδοι υπολογισµών της N(x) τερµατίζουν, το δέντρο είναι πεπερασµένο. Η Ν απο-
δέχεται την είσοδο x, αν η κατάσταση ενός, τουλάχιστον, από τα φύλλα του δέντρου
υπολογισµών είναι ΝΑΙ. Εφόσον ένα, τουλάχιστον, από τα φύλλα του δέντρου αντι-
στοιχεί σε αποδοχή, θεωρούµε ότι σε κάθε βήµα, η Ν θα επιλέγει µη ντετερµινιστικά
(θα «µαντεύει») τις κατάλληλες επιτρεπτές µεταβάσεις, ώστε να αποδεχθεί το x.

q0

Ύψος∆έντρου=—
™¯‹Ì· 8.1
O Xρόνος Yπολογισµού
Παράδειγµα δέντρου
υπολογισµών µιας
NDTM. Η χρονική O O
πολυπλοκότητα της
µηχανής δίνεται από
το ύψος του δέντρου. N O N O

∆ιαισθητικά, στα µη ντετερµινιστικά υπολογιστικά µοντέλα, οι υπολογισµοί απο-


δοχής µπορούν πάντα να επιβάλουν τη θέλησή τους, ακόµα και αν αποτελούν ισχνή
µειοψηφία. Το φαινόµενο αυτό είναι πολύ συνηθισµένο στα µαθηµατικά. Ένα θεώ-
ρηµα ισχύει, αν από όλες τις δυνατές µαθηµατικές αποδείξεις, µία και µόνη αποτε-
8.1 ª∏ ¡∆∂∆∂ƒªπ¡π™∆π∫∂™ ª∏Ã∞¡∂™ TURING 175

λεί µια σωστή απόδειξη για αυτό. Αντίστροφα, ένα θεώρηµα δεν ισχύει αν υπάρχει
ένα και µόνο παράδειγµα που το διαψεύδει. Αυτή η ασυµµετρία στον τρόπο µε τον
οποία µια NDTM χειρίζεται τους υπολογισµούς αποδοχής και απόρριψης (ή τερµα-
τισµού) είναι η αιτία που οι NDTM αποτελούν ένα τόσο ισχυρό και χρονικά απο-
δοτικό υπολογιστικό µοντέλο.
Ο χρόνος λειτουργίας µιας NDTM Ν µε είσοδο x καθορίζεται από το µήκος της µεγα-
λύτερης επιτρεπτής ακολουθίας υπολογισµών ή, διαφορετικά, από το ύψος του
δέντρου υπολογισµών της N(x). Συγκεκριµένα, για µια συνάρτηση t : IN a IN, λέµε
ότι µια NDTM Ν αποφασίζει µια γλώσσα L Õ Σ* σε χρόνο t(n), αν η Ν αποφασίζει
την L, και για κάθε x Œ Σ*, όλες οι ακολουθίες υπολογισµών της Ν(x) έχουν µήκος
το πολύ t(|x|). Σε αυτή την περίπτωση, λέµε ότι η L αποφασίζεται σε µη ντετερµινι-
στικό χρόνο t(n). Εποµένως, σαν χρονική πολυπλοκότητα µιας NDTM θεωρείται το
µήκος του µεγαλύτερου κλάδου υπολογισµού της, ένα µέγεθος που µπορεί να είναι
εκθετικά µικρότερο από τη πραγµατική, συνολική υπολογιστική δραστηριότητα.

8.1.2 ∏ ÎÏ¿ÛË NTIME

∆εδοµένης µιας συνάρτησης t : IN a IN, το σύνολο των γλωσσών που αποφασίζο-


νται σε µη ντετερµινιστικό χρόνο Ο(t(n)) αποτελούν µία νέα, ενδιαφέρουσα κλάση
πολυπλοκότητας, η οποία συµβολίζεται µε NTIME[t(n)]. Η NTIME[◊◊] είναι µια
κλάση πολυπλοκότητας περιορισµένου µη ντετερµινιστικού χρόνου (non –
deterministic time complexity class) και, τυπικά, ορίζεται ως:
NTIME[f(n)] = {L : L είναι γλώσσα αποφασίσιµη από µία NDTM Ο(t(n)) – χρόνου }.
Κατ’ αρχήν, παρατηρούµε ότι για κάθε συνάρτηση t(n), η κλάση DTIME[t(n)] είναι
υποσύνολο της κλάσης NTIME[t(n)], αφού εξ’ ορισµού, οι DTM αποτελούν ειδική
κατηγορία των NDTM. Για µερικές συναρτήσεις, όπως t(n) = n, έχει αποδειχθεί ότι η
αντίστοιχη κλάση DTIME είναι γνήσιο υποσύνολο της αντίστοιχης κλάσης NTIME.
Θα ήταν εξαιρετικά σηµαντικό αν µπορούσε να αποδειχθεί ότι, για κάθε συνάρτηση
t(n), η κλάση NTIME[t(n)] είναι υποσύνολο της κλάσης DTIME[t¢(n)], όπου η συνάρ-
τηση t¢(n) είναι ένα πολυώνυµο της t(n). Προς το παρόν το µόνο που µπορούµε να απο-
δείξουµε είναι ότι αυτό ισχύει όταν η t¢(n) = Ο(ct(n)), για κάποια σταθερά c > 1.

Θεώρηµα 8.1: Έστω µία γλώσσα L που αποφασίζεται από µια NDTM Ν σε χρόνο
t(n). Η ίδια γλώσσα µπορεί να αποφασιστεί από µία DTM Μ µε 3
ταινίες σε χρόνο Ο(ct(n)), όπου c > 1 είναι µια σταθερά που εξαρ-
τάται από την Ν.
176 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞

Απόδειξη: Αφού η Ν είναι Μη Ντετερµινιστική, σύµφωνα µε τη σχέση µετάβα-


σης ∆, από κάθε διαµόρφωσή της µπορεί να προκύψει ένας αριθµός
άλλων διαµορφώσεων. Έστω d ο µέγιστος αριθµός πιθανών διαµορ-
φώσεων που µπορεί να προκύψει από µια διαµόρφωση της Ν. Το d
ονοµάζεται «βαθµός µη ντετερµινισµού» της Ν και, υποθέτουµε, ότι
d > 1, γιατί, διαφορετικά, η ∆ θα ήταν συνάρτηση και η Ν µια DTM.
Η ντετερµινιστική προσοµοίωση της Ν βασίζεται στο γεγονός ότι µια ακολουθία
µη ντετερµινιστικών επιλογών µήκους t µπορεί να αναπαρασταθεί µε µια ακο-
λουθία φυσικών αριθµών του συνόλου {0, 1, …, d – 1} µήκους t. Για όλα τα δια-
φορετικά t, η DTM Μ προσοµοιώνει τη λειτουργία της Ν για όλες τις διαφορετι-
κές ακολουθίες της µορφής {0, 1, …, d – 1}t. Αξίζει να σηµειωθεί ότι η Μ πρέπει
να λειτουργεί χωρίς εκ των προτέρων γνώση του ορίου f(n) στο µήκος κάθε ακο-
λουθίας υπολογισµών, οπότε πρέπει να δοκιµάζει όλα τα t σε αύξουσα σειρά.
Για την εκτέλεση της προσοµοίωσης, η Μ διατηρεί µια ακολουθία (c1, c2, …, ct)
στη δεύτερη ταινία της, και προσοµοιώνει τη λειτουργία της Ν πραγµατοποιώντας
στο i βήµα την µη ντετερµινιστική επιλογή ci. Αν αυτή η ακολουθία υπολογισµών
καταλήξει κάποια στιγµή (πιθανόν πριν το βήµα t) σε αποδοχή, η Μ αποδέχεται
την είσοδο και τερµατίζει. ∆ιαφορετικά, η Μ δηµιουργεί την επόµενη στη σειρά
ακολουθία µήκους t (αυξάνει κατά 1 τον αριθµό c1c2…ct) και συνεχίζει. Όταν η
Μ έχει προσοµοιώσει την Ν για όλες τις διαφορετικές ακολουθίες µήκους t, αυξά-
νει το t κατά 1 και επαναλαµβάνει την παραπάνω διαδικασία.
Για να απορρίψει µία είσοδο, η Μ πρέπει να εντοπίσει ένα t για το οποίο όλες οι
διαφορετικές ακολουθίες της µορφής {0, 1, …, d – 1}t κάνουν την Ν να τερµατί-
σει µε κατάσταση ΟΧΙ ή ΠΕΡΑΣ.

∆εδοµένου του ορίου f(n) στο µήκος κάθε ακολουθίας υπολογισµών της Ν, ο χρό-
νος που χρειάζεται η Μ για να ολοκληρώσει την προσοµοίωση είναι ανάλογος του
συνολικού αριθµού των διαφορετικών ακολουθιών για τις οποίες η Μ προσοµοι-
ώνει την Ν. ∆ηλαδή, η χρονική πολυπλοκότητα της Μ είναι

Ê
 ˆ
( )
f ( n)
O d t = O d f ( n ) +1 .
Ë t =1 ¯

Χρησιµοποιώντας συµβολισµό που περιλαµβάνει κλάσεις πολυπλοκότητας αντί


µηχανών Turing, το Θεώρηµα 8.1 µπορεί να γραφεί σαν:
NTIME[t (n )] Õ U c>1 DTIME[ ct ( n ) ] .
8.2 ∏ ∫§∞™∏ NP 177

Μια σηµαντική συνέπεια του Θεωρήµατος 8.1 είναι ότι το σύνολο των γλωσσών που
γίνονται αποδεκτές / αποφασίζονται από Μη Ντετερµινιστικές Μηχανές Turing ταυ-
τίζεται µε το σύνολο των γλωσσών που γίνονται αποδεκτές / αποφασίζονται από τις
Ντετερµινιστικές Μηχανές Turing. ∆ηλαδή η επαύξηση µε ένα τόσο ισχυρό χαρα-
κτηριστικό όπως ο µη ντετερµινισµός δεν προσθέτει τίποτα στο σύνολο των γλωσ-
σών που αναγνωρίζονται από τις Ντετερµινιστικές Μηχανές Turing. Από αυτή την
άποψη, το Θεώρηµα 8.1 µπορεί να θεωρηθεί σαν ένα ακόµη τεκµήριο υπέρ της θέσης
των Church – Turing.

¢Ú·ÛÙËÚÈfiÙËÙ· 8.1

Στο Πρόβληµα του Περιοδεύοντος Πωλητή (Travelling Salesman Problem) δίνο-


νται n σηµεία, οι αποστάσεις µεταξύ τους και ένα όριο Β, και ζητείται να αποφα-
σιστεί αν υπάρχει περιοδεία, δηλαδή κύκλος που διέρχεται από κάθε σηµείο ακρι-
βώς µία φορά, µε µήκος το πολύ Β. Αποδείξτε ότι το Πρόβληµα του Περιοδεύο-
ντος Πωλητή (σε µορφή προβλήµατος απόφασης) ανήκει στην κλάση NTIME[n2].

8.2 ∏ ÎÏ¿ÛË NP

Η σηµαντικότερη κλάση µη ντετερµινιστικής χρονικής πολυπλοκότητας και, σίγου-


ρα, µία από τις σηµαντικότερες κλάσεις πολυπλοκότητας που έχουν ποτέ οριστεί,
είναι η κλάση NP. Παρόµοια µε την κλάση P, το NP ορίζεται σαν το σύνολο των
προβληµάτων που µπορούν να λυθούν σε πολυωνυµικό, µη ντετερµινιστικό χρόνο.
∆ιαφορετικά,
NP = U k ≥0 NTIME[n k ] .

¢Ú·ÛÙËÚÈfiÙËÙ· 8.2

Αποδείξτε ότι το πρόβληµα της Ικανοποιησιµότητας µιας λογικής πρότασης φ σε


Συζευκτική Κανονική Μορφή (ΣΚΜ) ανήκει στο NP. Τι ισχύει για το πρόβληµα
της 2 – Ικανοποιησιµότητας.

Εκτός από τον παραπάνω ορισµό της κλάσης NP, υπάρχει ένας εναλλακτικός, ισο-
δύναµος ορισµός που, ουσιαστικά, βασίζεται στον τρόπο µε τον οποίο λειτουργεί
µια NDTM πολυωνυµικού χρόνου. Ο ορισµός αυτός βασίζεται στις πολυωνυµικά
ισορροπηµένες και πολυωνυµικά αποφασίσιµες δυαδικές σχέσεις.
Έστω µία δυαδική σχέση R Õ Σ* ¥ Σ*. H R καλείται πολυωνυµικά αποφασίσιµη
178 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞

(polynomially decidable) αν υπάρχει µία DTM πολυωνυµικού χρόνου που για κάθε
x, y Œ Σ*, µπορεί να αποφασίσει αν (x, y) Œ R. Επιπλέον, η R καλείται πολυωνυµικά
ισορροπηµένη (polynomially balanced) αν για κάθε (x, y) Œ R, το µήκος της συµβο-
λοσειράς y φράσσεται άνω από κάποιο πολυώνυµο του µήκους της συµβολοσειράς
x, δηλαδή |y| £ |x|k, για κάποια σταθερά k ≥ 1.

Θεώρηµα 8.2: Μια γλώσσα L ανήκει στο NP αν και µόνο αν υπάρχει µία πολυω-
νυµικά αποφασίσιµη και πολυωνυµικά ισορροπηµένη σχέση R
τέτοια, ώστε L = {x: (x, y) Œ R για κάποιο y}.
Απόδειξη: Αρχικά, υποθέτουµε ότι υπάρχει µία τέτοια σχέση R. Τότε, η L µπορεί
να αποφασιστεί από µια NDTM Ν της οποίας (για µια είσοδο x) κάθε
κλάδος / ακολουθία υπολογισµών υπολογίζει ένα διαφορετικό y, |y| £
|x|k και, στη συνέχεια, προσοµοιώνει την DTM πολυωνυµικού χρόνου
που αποφασίζει αν το (x, y) ανήκει στην R. Κάθε διαφορετικό y µε
µήκος το πολύ |x|k υπολογίζεται από ακριβώς έναν κλάδο της Ν.
Προφανώς όλοι οι κλάδοι υπολογισµών της Ν έχουν πολυωνυµικό µήκος και, άρα,
η Ν είναι µία NDTM πολυωνυµικού χρόνου. Επιπλέον, αν υπάρχει κάποιο y
τέτοιο, ώστε (x, y) Œ R, τότε αυτό θα υπολογιστεί από κάποιον κλάδο υπολογι-
σµών, και η Ν θα αποδεχτεί την είσοδο x. ∆ιαφορετικά, όλοι οι κλάδοι υπολογι-
σµών θα καταλήξουν σε διαµορφώσεις απόρριψης, και η Ν θα απορρίψει το x.
Για το αντίστροφο, έστω µία γλώσσα L Œ NP και µία NDTM Ν που αποφασίζει
την L σε χρόνο nk. Ορίζουµε τη σχέση R ως εξής: (x, y) Œ R αν και µόνο αν το y
είναι η κωδικοποίηση ενός υπολογισµού αποδοχής της Ν µε είσοδο x. Η R είναι
πολυωνυµικά ισορροπηµένη, αφού για είσοδο x, κάθε κλάδος υπολογισµών της Ν
έχει µήκος το πολύ |x|k και, συνεπώς, το ίδιο ισχύει για την κωδικοποίησή του. Επί-
σης, η R είναι πολυωνυµικά αποφασίσιµη, αφού είναι εύκολο να ελεγχθεί ντετερ-
µινιστικά σε γραµµικό χρόνο αν µια συµβολοσειρά y αποτελεί την κωδικοποίηση
ενός υπολογισµού αποδοχής της Ν µε είσοδο x. Αφού υποθέσαµε ότι η Ν αποφα-
σίζει την L, η L µπορεί να γραφεί σαν L = {x Œ Σ*: (x, y) Œ R για κάποιο y}.

Παρατηρήστε ότι ο τρόπος που εργαστήκαµε για να αποδείξουµε ότι τα προβλήµα-


τα του Περιοδεύοντος Πωλητή και της Ικανοποιησιµότητας ανήκουν στο NP στις
∆ραστηριότητες 8.1 και 8.2 είναι απόλυτα παρόµοιος µε το πρώτο σκέλος της από-
δειξης του Θεωρήµατος 8.2.
8 . 3 N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞ 179

Το Θεώρηµα 8.2 αποτελεί τον καλύτερο ίσως τρόπο να κατανοήσουµε την κλάση NP.
Σύµφωνα µε το Θεώρηµα 8.2, κάθε γλώσσα / πρόβληµα στο NP έχει µια αξιοσηµεί-
ωτη ιδιότητα: Για κάθε είσοδο x που ανήκει στη γλώσσα, υπάρχει τουλάχιστον ένα
«πιστοποιητικό» y πολυωνυµικού µήκους, το οποίο µπορεί να εύκολα να ελεγχθεί από
µία DTM πολυωνυµικού χρόνου, επιβεβαιώνοντας το γεγονός ότι το x είναι µέλος της
γλώσσας. Αντίθετα, κανένα τέτοιο «πιστοποιητικό» y δεν υπάρχει για τα x που δεν ανή-
κουν στη γλώσσα. Αν και δεν ξέρουµε πως να υπολογίζουµε ένα τέτοιο «πιστοποιητι-
κό» σε πολυωνυµικό (ντετερµινιστικό) χρόνο, ξέρουµε ότι κάθε είσοδος x ανήκει στη
γλώσσα αν και µόνο αν υπάρχει ένα τέτοιο «πιστοποιητικό» y για το γεγονός αυτό.
Για παράδειγµα, το «πιστοποιητικό» ότι µια λογική πρόταση φ είναι ικανοποιήσιµη
(δηλαδή ανήκει στη γλώσσα που αποτελείται από τις ικανοποιήσιµες λογικές προ-
τάσεις σε συζευκτική κανονική µορφή) είναι µία ανάθεση τιµών στις λογικές µετα-
βλητές που ικανοποιεί τη φ. Μια τέτοια ανάθεση τιµών έχει µήκος ίσο µε τον αριθ-
µό των µεταβλητών της φ και, όταν είναι διαθέσιµη, είναι εύκολο να επιβεβαιωθεί
ότι ικανοποιεί τη φ. Το «πιστοποιητικό» ότι ένα στιγµιότυπο του Προβλήµατος του
Περιοδεύοντος Πωλητή ανήκει στη γλώσσα που αποτελείται από όλα τα στιγµιότυ-
πα που έχουν λύσεις / περιοδείες µε µήκος το πολύ Β, είναι µία περιοδεία µε µήκος
που δεν ξεπερνά το Β. Μια περιοδεία δεν είναι παρά µια αναδιάταξη των σηµείων
του προβλήµατος, και το µήκος της µπορεί εύκολα να υπολογισθεί και να συγκριθεί
µε το Β σε γραµµικό χρόνο.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 8.1

Αποδείξτε ότι το NP είναι κλειστό ως προς την ένωση και την τοµή, δηλαδή ότι αν
δύο γλώσσες L1, L2 Œ NP, τότε L1 » L2 Œ NP και L1 « L2 Œ NP. Επίσης, αποδείξ-
τε ότι το NP είναι κλειστό ως προς την πολυωνυµική αναγωγή, δηλαδή, ότι αν L1
µ L2 και L2 Œ NP, τότε L1 Œ NP.

8.3 NP – ÏËÚfiÙËÙ·

Αφού οι DTM είναι ειδική περίπτωση των NDTM, η κλάση P είναι υποσύνολο της
κλάσης NP. Τα περισσότερα προβλήµατα βελτιστοποίησης που συναντήσαµε σε
αυτό το βιβλίο ανήκουν στο NP και λύνονται σε πολυωνυµικό ντετερµινιστικό χρόνο.
Από την άλλη πλευρά, υπάρχουν προβλήµατα που ανήκουν στο NP και δεν είναι
γνωστό αν µπορεί να λυθούν σε πολυωνυµικό χρόνο, όπως το Πρόβληµα του Περιο-
δεύοντος Πωλητή και της Ικανοποιησιµότητας λογικών προτάσεων σε ΣΚΜ. Το
σηµαντικότερο, ίσως, ανοικτό ερώτηµα στη Θεωρητική Επιστήµη των Υπολογιστών
180 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞

είναι αν τα προβλήµατα αυτής της κατηγορίας µπορούν να λυθούν σε πολυωνυµικό


ντετερµινιστικό χρόνο ή όχι.
Μια διαφορετική διατύπωση του ίδιου ερωτήµατος αφορά στην ισότητα των κλά-
σεων P και NP. Με άλλα λόγια, το θέµα είναι κατά πόσον κάθε NDTM πολυωνυ-
µικού χρόνου µπορεί να προσοµοιωθεί από µία DTM µε πολυωνυµική αντί εκθετι-
κής χρονικής επιβάρυνσης. Το ερώτηµα αυτό έχει τεράστια πρακτική και θεωρητι-
κή σηµασία, αλλά προς το παρόν δεν µοιάζει ώριµο να απαντηθεί. Παρόλα αυτά,
αποτελεί κοινή πεποίθηση στην επιστηµονική κοινότητα ότι το P είναι γνήσιο υπο-
σύνολο του NP.
Αν όντως το P διαφέρει από το NP, πρέπει να υπάρχουν κάποια προβλήµατα στο NP
που δεν µπορούν να λυθούν σε πολυωνυµικό χρόνο. Έχοντας κατά νου ότι τα πλήρη
προβλήµατα µιας κλάσης είναι και τα δυσκολότερα υπολογιστικά, αν υπάρχουν
κάποια προβλήµατα στο NP τα οποία δεν λύνονται σε πολυωνυµικό χρόνο, τότε ανά-
µεσα σε αυτά πρέπει να είναι και όλα τα NP – πλήρη προβλήµατα, εφόσον βέβαια
υπάρχουν. Υπενθυµίζεται ότι ένα πρόβληµα Π είναι πλήρες για την κλάση NP (NP
– complete) αν ανήκει στο NP (Π Œ NP), και κάθε άλλο πρόβληµα Π¢ που ανήκει
στο NP ανάγεται πολυωνυµικά στο Π ("1Π¢ Œ NP, Π¢ µ Π).
Το ακόλουθο θεώρηµα τεκµηριώνει ότι το σύνολο των προβληµάτων που είναι
πλήρη για την κλάση NP διαδραµατίζει ένα κεντρικό ρόλο στη διερεύνηση του ερω-
τήµατος σχετικά µε την ισότητα των κλάσεων P και NP.

Θεώρηµα 8.3: Αν κάποιο NP – πλήρες πρόβληµα λύνεται σε πολυωνυµικό ντε-


τερµινιστικό χρόνο, τότε P = NP. Επιπλέον, αν υπάρχει κάποιο
πρόβληµα στο NP που δεν λύνεται σε πολυωνυµικό ντετερµινι-
στικό χρόνο, τότε κανένα από τα NP – πλήρη προβλήµατα δεν
λύνεται σε πολυωνυµικό χρόνο.
Απόδειξη: Εξ’ ορισµού, όταν ένα πρόβληµα Π είναι NP – πλήρες, όλα τα προ-
βλήµατα που ανήκουν στο NP ανάγονται πολυωνυµικά στο Π. Αφού
η κλάση P είναι υποσύνολο της κλάσης NP, κάθε πρόβληµα που ανή-
κει στο P θα ανάγεται πολυωνυµικά στο Π. Συνεπώς, αν το Π λύνεται
σε πολυωνυµικό χρόνο (δηλαδή Π Œ P), το Π θα είναι πλήρες τόσο για
τις κλάσεις P όσο και για τις κλάσεις NP. Επειδή το P είναι κλειστό
ως προς την πολυωνυµική αναγωγή, Π Œ P, και κάθε πρόβληµα Π¢ Œ
NP ανάγεται πολυωνυµικά στο Π, κάθε πρόβληµα Π¢ πρέπει να ανή-
κει και στο P.
8 . 3 N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞ 181

Αντίστροφα, αν υπάρχει κάποιο πρόβληµα στο NP που δεν ανήκει στο P, δηλα-
δή P π NP, τότε κανένα NP – πλήρες πρόβληµα δεν µπορεί να λύνεται σε πολυω-
νυµικό χρόνο, γιατί µε βάση τον συλλογισµό της προηγούµενης παραγράφου, θα
καταλήγαµε σε άτοπο.

Σύµφωνα µε το Θεώρηµα 8.3, αν όπως πιστεύεται οι κλάσεις P και NP διαφέρουν,


τότε το σύνολο των προβληµάτων που είναι πλήρη για το NP αποτελούν ένα γνήσιο
υποσύνολο του NP και είναι ξένο µε την κλάση P (βλ. Σχήµα 8.2).
Αυτός είναι και ένας από τους βασικούς λόγους που η κλάση NP και η θεωρία της
NP – πληρότητας έχουν τόσο πολλές και σηµαντικές πρακτικές εφαρµογές. Όταν
προσπαθούµε να σχεδιάσουµε έναν αποδοτικό αλγόριθµο για κάποιο πρακτικό πρό-
βληµα, είναι πολύ συνηθισµένο αυτό να ανήκει στο NP. Έχοντας ταυτίσει τους απο-
δοτικούς αλγόριθµους µε αυτούς που έχουν πολυωνυµικό χρόνο εκτέλεσης, είναι
σηµαντικό να αποφασίσουµε αν το πρόβληµα λύνεται σε πολυωνυµικό χρόνο (ανή-
κει στο P) ή είναι NP – πλήρες.
Συνήθως, µετά από µερικές αποτυχηµένες προσπάθειες σχεδιασµού αλγόριθµου
πολυωνυµικού χρόνου, στρέφουµε το ενδιαφέρον µας στην απόδειξη NP – πληρό-
τητας. Σε κάποιες περιπτώσεις, η αιτία που δεν καταλήγουµε σε αλγόριθµο πολυω-
νυµικού χρόνου οδηγεί φυσιολογικά σε απόδειξη NP – πληρότητας. Άλλες φορές
πάλι, η αιτία που δεν καταφέρνουµε να ολοκληρώσουµε µια απόδειξη NP – πληρό-
τητας οδηγεί σε αλγόριθµο πολυωνυµικού χρόνου.

NP-Πλήρη—
NP Προβλήµατα ™¯‹Ì· 8.2
Η σχέση
των κλάσεων P, NP,
και του συνόλου
των προβληµάτων
P
που είναι πλήρη για
το NP, εφόσον
P π NP.
182 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 8.2

Έστω δύο γλώσσες L1 και L2, τέτοιες, ώστε L1 µ L2. Για κάθε µία από τις ακόλου-
θες προτάσεις, είτε εξηγήστε γιατί αποτελεί ανοικτό πρόβληµα, είτε αποδείξτε ότι
είναι αληθής ή ψευδής.
(1) Έστω L1, L2 Œ NP. Αν L1 Œ P, τότε και L2 Œ P.
(2) Αν L2 Œ P, τότε και L1 Œ P.
(3) Έστω L2 Œ NP. Αν η L2 δεν είναι NP – πλήρης, τότε ούτε και η L1 είναι.
(4) Αν τόσο η L1 όσο και η L2 είναι NP – πλήρεις, τότε L2 µ L1.

8.3.1 NP – Ï‹ÚË ÚÔ‚Ï‹Ì·Ù·

Έχοντας επιχειρηµατολογήσει για τις πολλές και σηµαντικές εφαρµογές της θεωρίας
της NP – πληρότητας, αποµένει να αποδείξουµε ότι όντως υπάρχουν προβλήµατα
τα οποία είναι πλήρη για την κλάση NP.
Ικανοποιησιµότητα Λογικών Προτάσεων σε Συζευκτική Κανονική Μορφή
Το πρώτο πρακτικό πρόβληµα που αποδείχτηκε πλήρες για το NP είναι αυτό της Ικα-
νοποιησιµότητας Λογικών Προτάσεων σε Συζευκτική Κανονική Μορφή (ΣΚΜ), ή
απλά πρόβληµα της Ικανοποιησιµότητας. Στην Ικανοποιησιµότητα (Satisfiability),
δεδοµένης µιας λογικής πρότασης φ σε ΣΚΜ, διερευνούµε αν η φ είναι ικανοποιή-
σιµη, δηλαδή αν υπάρχει µια ανάθεση τιµών στις λογικές µεταβλητές της φ που κάνει
την φ αληθή. Η Ικανοποιησιµότητα αποδείχτηκε NP – πλήρης από τον S. Cook το
1971 και ανεξάρτητα από τον L. Levin, γι¢ αυτό και το Θεώρηµα 8.4 είναι γνωστό
σαν Θεώρηµα των Cook – Levin.

Θεώρηµα 8.4: Το πρόβληµα της Ικανοποιησιµότητας είναι NP – πλήρες.


Απόδειξη (βασική ιδέα): Έχουµε ήδη αποδείξει ότι η Ικανοποιησιµότητα ανήκει
στο NP. Εποµένως, αποµένει να δείξουµε ότι κάθε
γλώσσα L Œ NP µπορεί να αναχθεί πολυωνυµικά στο
πρόβληµα της Ικανοποιησιµότητας. Η απόδειξη,
ουσιαστικά, κωδικοποιεί τη λειτουργία µιας NDTM µε
µία ταινία σε µία λογική πρόταση σε ΣΚΜ.
Θεωρούµε µια οποιαδήποτε γλώσσα L Œ NP η οποία αποφασίζεται από µία
NDTM Ν µε µία ταινία σε πολυωνυµικό χρόνο t(n). Θα δείξουµε ότι για κάθε είσο-
8 . 3 N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞ 183

δο x µπορούµε να κατασκευάσουµε µία λογική πρόταση φx σε ΣΚΜ, τέτοια, ώστε


η φx να είναι ικανοποιήσιµη αν και µόνο αν το x ανήκει στην L.
Έστω ότι το αλφάβητο της Ν είναι {α1, α2, …, αm} και το σύνολο καταστάσεων
είναι {q1, q2, …, ql}. Αφού η Ν λειτουργεί σε χρόνο t(n), |x| = n, η κεφαλή της ται-
νίας δεν µπορεί να επισκεφθεί περισσότερα από t(n) κελιά. Η λογική πρόταση φx
θα χρησιµοποιεί τους ακόλουθους τρεις τύπους λογικών µεταβλητών:
• ΚΕΛΙ(i, j, t) που δηλώνει ότι «το κελί i περιέχει το σύµβολο αj τη χρονική στιγ-
µή t», 1 £ i £ t(n), 1 £ j £ m, 1 £ t £ t(n), σύνολο m t2(n) µεταβλητές.
• ΚΕΦΑΛΗ(i, t) που δηλώνει ότι «η κεφαλή της ταινίας βρίσκεται στο κελί i τη χρο-
νική στιγµή t», 1 £ i £ t(n), 1 £ t £ t(n), σύνολο t2(n) µεταβλητές.
• ΚΑΤΑΣΤΑΣΗ(k, t) που δηλώνει ότι «η Ν βρίσκεται στην κατάσταση qk τη χρονι-
κή στιγµή t», 1 £ k £ l, 1 £ t £ t(n), σύνολο l t(n) µεταβλητές.
Συνολικά, χρησιµοποιούµε (m + 1) t2(n) + l t(n) λογικές µεταβλητές, ενώ για κάθε
χρονική στιγµή t, η τρέχουσα διαµόρφωση της Ν περιγράφεται πλήρως από ένα
σύνολο (m + 1) t(n) + l µεταβλητών.
Η λογική πρόταση φx αποτελείται από τη σύζευξη επτά επιµέρους λογικών προ-
τάσεων οι οποίες γράφονται σε ΣΚΜ χρησιµοποιώντας τα τρία είδη µεταβλητών
που µόλις περιγράψαµε. Καθεµία από τις επιµέρους λογικές προτάσεις διατυπώ-
νεται µε τέτοιο τρόπο, ώστε να είναι ικανοποιήσιµη αν και µόνο αν ισχύει η αντί-
στοιχη από τις παρακάτω προτάσεις:
(1) Κάθε χρονική στιγµή η κεφαλή της ταινίας βρίσκεται σε ένα και µόνο κελί.
(2) Κάθε χρονική στιγµή κάθε κελί περιέχει ένα και µόνο σύµβολο του αλφάβητου.
(3) Κάθε χρονική στιγµή η Ν βρίσκεται σε µία και µόνη κατάσταση.
(4) Τη χρονική στιγµή 1 (αρχική διαµόρφωση), τα πρώτα n κελιά περιέχουν την
είσοδο x, ενώ όλα τα υπόλοιπα t(n) – n περιέχουν το κενό σύµβολο. Επιπλέ-
ον, η Ν ξεκινάει στην αρχική κατάσταση.
(5) Κάποια χρονική στιγµή t £ t(n), η Ν φτάνει σε κατάσταση αποδοχής.
(6) Κάθε χρονική στιγµή µόνο το περιεχόµενο του κελιού στο οποίο βρίσκεται η
κεφαλή της ταινίας µπορεί να µεταβληθεί.
(7) Κάθε χρονική στιγµή η επόµενη διαµόρφωση καθορίζεται από τη σχέση µετά-
βασης ∆. ∆ηλαδή οι τιµές των µεταβλητών που περιγράφουν τις διαµορφώ-
σεις της Ν σε κάθε δύο διαδοχικές χρονικές στιγµές πρέπει να υπακούουν /
184 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞

επαληθεύουν τους κανόνες µετάβασης που περιέχονται στη σχέση ∆.


Οι παραπάνω προτάσεις απλώς συνοψίζουν τους κανόνες λειτουργίας µιας NDTM
µε µία ταινία. Η Ν αποδέχεται το x αν και µόνο αν υπάρχει µια ακολουθία δια-
µορφώσεων που ικανοποιεί όλες τις παραπάνω προτάσεις. Εδώ ολοκληρώνεται
και η βασική ιδέα της απόδειξης.

Τεχνικά, για να ολοκληρωθεί η απόδειξη, απαιτείται να δείξουµε ότι καθεµία από


τις προτάσεις (1) – (7) µπορεί ισοδύναµα να διατυπωθεί µε µία λογική πρόταση
j x( m ) σε ΣΚΜ, µ = 1, …, 7. Επιπλέον, δεδοµένης της περιγραφής της Ν και της
(m)
εισόδου x, κάθε j x πρέπει να µπορεί να υπολογισθεί σε πολυωνυµικό χρόνο.

Έχουµε ήδη αποδείξει ότι το πρόβληµα της 2 – Ικανοποιησιµότητας, όπου η λογική


πρόταση φ µπορεί να έχει µέχρι 2 άτοµα σε κάθε όρο, µπορεί να λυθεί σε πολυωνυ-
µικό χρόνο. Στη συνέχεια, θα χρησιµοποιήσουµε το Θεώρηµα 8.4 για να αποδεί-
ξουµε ότι η 3 – Ικανοποιησιµότητα, όπου η λογική πρόταση φ µπορεί να έχει µέχρι
3 άτοµα σε κάθε όρο, είναι NP – πλήρης.

Θεώρηµα 8.5: Το πρόβληµα της 3 – Ικανοποιησιµότητας είναι NP – πλήρες.


Απόδειξη: Όπως και το πρόβληµα της 2 – Ικανοποιησιµότητας, η 3 – Ικα-
νοποιησιµότητα ανήκει στο NP. Θα αποδείξουµε ότι η Ικανοποι-
ησιµότητα ανάγεται πολυωνυµικά στην 3 – Ικανοποιησιµότητα.
Συγκεκριµένα, θα δείξουµε ότι µια λογική πρόταση φ σε ΣΚΜ
µπορεί να µετατραπεί σε πολυωνυµικό χρόνο σε µία άλλη λογική
πρόταση φ¢ σε ΣΚΜ µε το πολύ 3 άτοµα σε κάθε όρο, ώστε η φ
να είναι ικανοποιήσιµη αν και µόνο αν η φ¢ είναι ικανοποιήσιµη.
Η µετατροπή συνίσταται στην αντικατάσταση κάθε όρου c της φ µε k ≥ 4 άτοµα από
µια οµάδα όρων c¢ που έχει το πολύ 3 άτοµα ανά όρο. Συγκεκριµένα, για κάθε όρο
c της φ που αποτελείται από k ≥ 4 άτοµα, δηλαδή c = (l1 Ú l2 Ú L Ú lk), ορίζουµε
k – 3 νέες µεταβλητές x1, x2, …, xk–3, και αντικαθιστούµε τον όρο c µε τους όρους:
8 . 3 N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞ 185

Ï( l1 Ú l2 Ú x1 ) Ÿ
Ô
Ô( ÿx1 Ú l 3 Ú x2 ) Ÿ
ÔÔ( ÿx2 Ú l 4 Ú x 3 ) Ÿ
c¢ = Ì
ÔL Ÿ
Ô( ÿx k - 4 Ú l k - 2 Ú x k - 3 ) Ÿ
Ô
ÔÓ( ÿx k - 3 Ú l k -1 Ú l k )

Η φ¢ αποτελείται από τη λογική σύζευξη των παραπάνω οµάδων όρων c¢. Είναι
φανερό ότι δεδοµένης της φ, η φ¢ µπορεί εύκολα να υπολογιστεί σε πολυωνυµικό
χρόνο. Για να αποδείξουµε ότι η φ είναι ικανοποιήσιµη αν και µόνο αν η φ¢ είναι
ικανοποιήσιµη, αρκεί να δείξουµε ότι αυτή η ισοδυναµία ισχύει για κάθε ζευγάρι
όρων c και c¢.

Έστω ότι ο όρος c ικανοποιείται από µια ανάθεση αλήθειας Α που ικανοποιεί την
φ και, έστω lj το πρώτο άτοµο που γίνεται αληθές από την ανάθεση Α. Τότε, η
οµάδα όρων c¢ ικανοποιείται συµπληρώνοντας την ανάθεση Α µε τις ακόλουθες
τιµές για τις µεταβλητές xi, i = 1, …, k – 3.

Ï1 αν 1 £ i < j - 1
xi a Ì
Ó0 αν j - 1 £ i < k - 3

Για το αντίστροφο, παρατηρούµε ότι για να είναι η οµάδα όρων c¢ ικανοποιήσιµη


πρέπει τουλάχιστον ένα από τα άτοµα l1, l2, …, lk να είναι αληθές. Εποµένως, και
ο όρος c θα είναι ικανοποιήσιµος.

Η µεθοδολογία της απόδειξης του Θεωρήµατος 8.5 χρησιµοποιείται πολύ συχνά στις
αποδείξεις NP – πληρότητας. Συγκεκριµένα, για να ανάγουµε ένα πρόβληµα σε ένα
άλλο αρχικά διερευνούµε πιθανές συσχετίσεις / µετασχηµατισµούς µεταξύ µικρών,
επιµέρους στιγµιότυπων των δύο προβληµάτων (π.χ. µετασχηµατισµός ενός όρου σε
µια οµάδα όρων). Ένας µετασχηµατισµός µεταξύ µικρών, επιµέρους στιγµιότυπων,
που διατηρεί τις επιθυµητές ιδιότητες (π.χ. την ιδιότητα της ικανοποιησιµότητας),
συνήθως, µπορεί να εφαρµοστεί τµηµατικά σε µεγαλύτερα στιγµιότυπα, καταλήγο-
ντας σε µια απόδειξη NP – πληρότητας.
186 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞

¢Ú·ÛÙËÚÈfiÙËÙ· 8.3

Το πρόβληµα της Μέγιστης 2 – Ικανοποιησιµότητας (Maximum 2 – Satisfiability)


είναι, δεδοµένου ενός συνόλου όρων φ που καθένας αποτελείται από τη διάζευξη
δύο ατόµων και ενός φράγµατος Β, να αποφασιστεί αν τουλάχιστον Β όροι του φ
µπορούν να ικανοποιηθούν, ταυτόχρονα. Να αποδείξετε ότι το πρόβληµα της Μέγι-
στης 2 – Ικανοποιησιµότητας είναι NP – πλήρες.

Το Πρόβληµα του Μέγιστου Συνόλου Ανεξαρτησίας


Ένα σύνολο ανεξαρτησίας (independent set) ενός µη κατευθυντικού γραφήµατος
είναι ένα υπογράφηµα / υποσύνολο κορυφών στο οποίο κανένα ζευγάρι κορυφών
δεν συνδέεται µε ακµή. ∆εδοµένου ενός µη κατευθυντικού γραφήµατος G(V, E) και
ενός ακέραιου K ≥ 1, η εκδοχή απόφασης του προβλήµατος του Μέγιστου Συνόλου
Ανεξαρτησίας (ΜΣΑ – Maximum Independent Set) εξετάζει αν το G περιέχει ένα
σύνολο ανεξαρτησίας µεγέθους τουλάχιστον K.

Θεώρηµα 8.6: Το πρόβληµα του Μέγιστου Συνόλου Ανεξαρτησίας (ΜΣΑ) είναι


NP – πλήρες.
Απόδειξη: Για να αποδείξουµε ότι το ΜΣΑ ανήκει στο NP, παρατηρούµε ότι
µία NDTM πολυωνυµικού χρόνου µπορεί να «µαντέψει» ένα
σύνολο ανεξαρτησίας µεγέθους K (εφόσον υπάρχει), και να επι-
βεβαιώσει ότι κανένα ζευγάρι αυτών των κορυφών δεν συνδέεται
µε ακµή σε χρόνο O(K2) = Ο(n2).
Για να αποδείξουµε ότι το ΜΣΑ είναι πλήρες για το NP, θα ανάγουµε το πρό-
βληµα της 3 – Ικανοποιησιµότητας στο ΜΣΑ. Χωρίς βλάβη της γενικότητας, θεω-
ρούµε µόνο λογικές προτάσεις φ σε ΣΚΜ µε m όρους, n λογικές µεταβλητές, και
ακριβώς 3 άτοµα σε κάθε όρο. ∆εδοµένης µιας τέτοιας πρότασης φ, θα κατα-
™¯‹Ì· 8.3 σκευάσουµε ένα γράφηµα G(V, E), |V| = 3m, το οποίο θα έχει ένα σύνολο ανε-
Ένα παράδειγµα της ξαρτησίας µεγέθους m αν και µόνο αν η φ είναι ικανοποιήσιµη.
αναγωγής από την
3 – Ικανοποιησιµότη- x1 ÿx ÿx
1 1
τα στο Μέγιστο Σύνο-
λο Ανεξαρτησίας. Η
λογική πρόταση είναι
ÿx ÿx
φ = (x1 Ú x2 Ú x3) Ÿ 2 3
x3 x2
(ÿx1 Ú ÿx2 Ú ÿx3) Ÿ x2 x3
(ÿx1 Ú x2 Ú x3).
8 . 3 N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞ 187

Για να κατασκευάσουµε το γράφηµα G, κάθε όρος c της φ µετατρέπεται σε ένα


τρίγωνο, µε κάθε άτοµο του c να αντιστοιχεί σε µία κορυφή του τριγώνου. ∆ύο
κορυφές διαφορετικών τριγώνων συνδέονται µε ακµή αν και µόνο αν αντιστοι-
χούν σε συµπληρωµατικά άτοµα, δηλαδή άτοµα που το ένα είναι η άρνηση του
άλλου, π.χ. xi και ÿxi. Ένα παράδειγµα της αναγωγής φαίνεται στο Σχήµα 8.3.
Τυπικά, έστω ότι η φ = c1 Ÿ c2 Ÿ L Ÿ cm, µε κάθε όρο να έχει τη µορφή ci = (li1 Ú
li2 Ú li3), όπου τα άτοµα lij, j = 1, 2, 3, συµβολίζουν λογικές µεταβλητές ή τις αρνή-
σεις τους. Από την φ κατασκευάζουµε ένα γράφηµα R(φ) = (G(V, E), K), όπου K
= m, και το γράφηµα G(V, E) έχει τη µορφή V = {vij : i = 1, 2, …, m και j = 1, 2, 3}
και E = {(vij, vik) : i = 1, 2, …, m και j π k} » {(vij, vµk) : i π µ και lij = ÿlµk}. ∆ηλα-
δή, υπάρχει µια κορυφή για κάθε εµφάνιση ενός ατόµου σε έναν όρο, η πρώτη
οµάδα ακµών ορίζει τα m τρίγωνα, ένα για κάθε όρο και η δεύτερη οµάδα ακµών
συνδέει κάθε ζευγάρι συµπληρωµατικών εµφανίσεων της ίδιας µεταβλητής.
Παρατηρούµε ότι κάθε τρίγωνο µπορεί να συνεισφέρει το πολύ µία κορυφή σε
ένα σύνολο ανεξαρτησίας. Άρα, κανένα σύνολο ανεξαρτησίας του G δεν µπορεί
να έχει µέγεθος µεγαλύτερο από m. Επίσης, η κατασκευή δεν επιτρέπει σε κανέ-
να ζευγάρι συµπληρωµατικών εµφανίσεων της ίδιας µεταβλητής (π.χ. xi και ÿxi)
να ανήκει στο ίδιο σύνολο ανεξαρτησίας. Άρα, αν κάποιες κορυφές που αντι-
στοιχούν στην ίδια µεταβλητή (π.χ. xi) συµπεριλαµβάνονται στο ίδιο σύνολο ανε-
ξαρτησίας, τότε όλες αυτές αντιστοιχούν στο ίδιο άτοµο (δηλαδή είτε όλες αντι-
στοιχούν στο xi είτε στο ÿxi) και, εποµένως, παίρνουν την ίδια τιµή από κάθε ανά-
θεση αλήθειας.
Έστω λοιπόν ότι το γράφηµα G(V, E) έχει ένα σύνολο ανεξαρτησίας µεγέθους K
= m. Κάθε ανάθεση αλήθειας που αποδίδει την τιµή TRUE σε όλα τα άτοµα που
ανήκουν σε αυτό το σύνολο ανεξαρτησίας ικανοποιεί την φ γιατί κάθε τρίγωνο /
όρος της φ έχει ακριβώς µία κορυφή / ένα άτοµο που παίρνει την τιµή TRUE. Μια
τέτοια ανάθεση αλήθειας είναι έγκυρη γιατί όπως παρατηρήσαµε, σε ένα σύνολο
ανεξαρτησίας του G δεν µπορούν να περιέχονται συµπληρωµατικές εµφανίσεις
της ίδιας µεταβλητής.
Για το αντίστροφο, δεδοµένης µιας οποιαδήποτε ανάθεσης αλήθειας που ικανο-
ποιεί την φ, κατασκευάζουµε ένα σύνολο ανεξαρτησίας µεγέθους K = m, συµπερι-
λαµβάνοντας σε αυτό µια από τις κορυφές / άτοµα κάθε τριγώνου / όρου που παίρ-
νουν την τιµή TRUE. Αφού όλα τα άτοµα που συµπεριλαµβάνονται στο σύνολο ανε-
ξαρτησίας έχουν την τιµή TRUE, δεν συµπεριλαµβάνεται κανένα ζευγάρι συµπλη-
ρωµατικών εµφανίσεων της ίδιας µεταβλητής και, εποµένως, δεν υπάρχουν ακµές
188 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞

µεταξύ των κορυφών των διαφορετικών τριγώνων. Αφού η φ ικανοποιείται, κάθε


τρίγωνο θα αντιπροσωπεύεται στο σύνολο ανεξαρτησίας µε ακριβώς µία κορυφή,
οπότε το σύνολο ανεξαρτησίας όντως θα έχει το επιθυµητό µέγεθος.
Η απόδειξη ολοκληρώνεται µε την παρατήρηση ότι η παραπάνω αναγωγή µπορεί
να υπολογιστεί σε πολυωνυµικό χρόνο.

Παρατηρείστε ότι στην πραγµατικότητα αποδείξαµε ότι το πρόβληµα του Μέγιστου


Συνόλου Ανεξαρτησίας είναι NP – πλήρες ακόµη και όταν το γράφηµα εισόδου µπο-
ρεί να χωριστεί σε ξένα µεταξύ τους τρίγωνα. Από την άλλη πλευρά, όπως και για κάθε
άλλο πρόβληµα, υπάρχουν κάποιες ειδικές περιπτώσεις του Μέγιστου Συνόλου Ανε-
ξαρτησίας που είναι ευεπίλυτες, δηλαδή µπορούν να λυθούν σε πολυωνυµικό χρόνο.
Μια τέτοια ειδική περίπτωση προκύπτει όταν το γράφηµα εισόδου είναι διµερές.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 8.3

Αποδείξτε ότι το πρόβληµα του Μέγιστου Συνόλου Ανεξαρτησίας είναι στο P όταν
όλες οι κορυφές του γραφήµατος εισόδου έχουν βαθµό 2.
Έχοντας σαν σηµείο εκκίνησης το πρόβληµα του Μέγιστου Συνόλου Ανεξαρτη-
σίας, µπορούµε να αποδείξουµε ότι και µερικά ακόµη γραφοθεωρητικά προβλή-
µατα είναι NP – πλήρη.

ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 8.4

Ένα υπογράφηµα ενός µη κατευθυντικού γραφήµατος ονοµάζεται πλήρες υπο-


γράφηµα ή κλίκα (clique) όταν κάθε ζευγάρι κορυφών του συνδέεται µε µία ακµή.
Το µέγεθος µιας κλίκας είναι ο αριθµός των κορυφών της. Η εκδοχή απόφασης του
προβλήµατος της Μέγιστης Κλίκας (ΜΚ – Maximum Clique) είναι, δεδοµένου
ενός µη κατευθυντικού γραφήµατος G(V, E) και ενός ακέραιου K ≥ 1, να αποφα-
σιστεί αν το G περιέχει µια κλίκα µεγέθους τουλάχιστον K. Αποδείξτε ότι το πρό-
βληµα της Μέγιστης Κλίκας είναι NP – πλήρες.
™YNOæH 189

¢Ú·ÛÙËÚÈfiÙËÙ· 8.4

∆εδοµένου ενός µη κατευθυντικού γραφήµατος G(V, E), ένα υποσύνολο C Õ V


λέµε ότι καλύπτει (covers) τις ακµές του G αν κάθε ακµή του G έχει τουλάχιστον
ένα άκρο της στο C. Το σύνολο C ονοµάζεται και κάλυµµα κορυφών (vertex cover)
του G και το µέγεθός του είναι ίσο µε τον αριθµό των κορυφών που περιέχει. Η
εκδοχή απόφασης του προβλήµατος του Ελάχιστου Καλύµµατος Κορυφών (ΕΚΚ
– Minimum Vertex Cover) είναι, δεδοµένου ενός µη κατευθυντικού γραφήµατος
G(V, E) και ενός ακέραιου K ≥ 1, να αποφασιστεί αν το G περιέχει ένα κάλυµµα
κορυφών µεγέθους |C| £ K. Αποδείξτε το πρόβληµα του Ελάχιστου Καλύµµατος
Κορυφών είναι NP – πλήρες.

™‡ÓÔ„Ë
Σε αυτό το κεφάλαιο παρουσιάστηκε το µη ντετερµινιστικό υπολογιστικό µοντέλο,
ορίστηκε η κλάση NP των προβληµάτων που αποφασίζονται από NDTM πολυωνυ-
µικού χρόνου και παρουσιάστηκε η θεωρία της NP – πληρότητας.
Αν και µη ρεαλιστικό υπολογιστικό µοντέλο, ο µη ντετερµινισµός αποτελεί κεντρική
έννοια στη Θεωρία Υπολογιστικής Πολυπλοκότητας εξαιτίας των πολλών και σηµα-
ντικών εφαρµογών του. Η επόµενη διαµόρφωση µιας Μη Ντετερµινιστικής Μηχανής
Turing καθορίζεται από τη σχέση µετάβασης ∆ και µπορεί να είναι µία από ένα σύνο-
λο διαµορφώσεων.
Η κλάση NP περιλαµβάνει όλες τις γλώσσες / προβλήµατα που αποφασίζονται από
κάποια NDTM πολυωνυµικού χρόνου. Ισοδύναµα, η κλάση NP περιλαµβάνει όλες
τις γλώσσες L των οποίων κάθε συµβολοσειρά – µέλος x έχει ένα «πιστοποιητικό»
πολυωνυµικού µήκους, που µπορεί να χρησιµοποιηθεί από µία DTM πολυωνυµικού
χρόνου για να επιβεβαιώσει ότι το x ανήκει στην L.
Τα NP – πλήρη προβλήµατα είναι τα δυσκολότερα υπολογιστικά προβλήµατα της κλά-
σεως NP. Τα NP – πλήρη προβλήµατα διαδραµατίζουν ένα κεντρικό ρόλο στη διε-
ρεύνηση των κλάσεων P και NP, αφού αν ένα NP – πλήρες πρόβληµα λύνεται σε
πολυωνυµικό χρόνο, οι κλάσεις P και NP ταυτίζονται. Μερικά από τα πιο σηµαντι-
κά NP – πλήρη προβλήµατα είναι η Ικανοποιησιµότητα, η 3 – Ικανοποιησιµότητα
και το Μέγιστο Σύνολο Ανεξαρτησίας.
190 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞

µÈ‚ÏÈÔÁÚ·Ê›·

Η θεωρία NP – πληρότητας διαπραγµατεύεται διεξοδικά ενταγµένη στο γενικότερο


πλαίσιο της έννοιας της πληρότητας ως προς µία κλάση πολυπλοκότητας στο:
[1] C.H. Papadimitriou. Computational Complexity. Addison – Wesley, 1994.
Για τη θεωρία NP – πληρότητας προτείνεται το βιβλίο:
[2] M.R. Garey και D.S. Johnson. Computers and Intractability: A Guide to the
Theory of NP – Completeness. Freeman Publishing, 1979. Σηµείο αναφοράς στην
παρουσίαση της NP – πληρότητας. ∆ιαπραγµατεύεται τη NP – πληρότητα τόσο
από θεωρητική όσο και από πρακτική οπτική γωνία. Περιέχει εκτενέστατη λίστα
µε προβλήµατα που έχουν αποδειχθεί NP – πλήρη.
Το Θεώρηµα των Cook – Levin και τα πρώτα NP – πλήρη προβλήµατα εµφανίστη-
καν για πρώτη φορά στις εργασίες:
[3] S. Cook. The complexity of theorem proving procedures. In Proceedings of the
Third Annual ACM Symposium on Theory of Computing, σελ. 151 – 158, 1971.
[4] L.A. Levin. Universal sorting problems. Problemy Peredachi Informatsii,
9(3):265 – 266, 1973. Στα Ρωσικά.
Επίσης, πολλά θεµελιώδη προβλήµατα αποδείχθηκαν NP – πλήρη στην εργασία:
[5] R.M. Karp. Reducibility among combinatorial problems. In R.E. Miller and J.W.
Thatcher, editors, Complexity of Computer Computations, σελ. 85 – 103. Plenum
Press, 1972.
∞·ÓÙ‹ÛÂȘ AÛ΋ÛÂˆÓ A˘ÙÔ·ÍÈÔÏfiÁËÛ˘

1.1
procedure selection_sort(A[1...n])
(1) for i ¨ 1 to n–1 do
(2) minj ¨ i; minx ¨ A[i];
(3) for j ¨ i + 1 to n do
(4) if A[j] < minx then
(5) minj ¨ j; minx ¨ A[j];
(6) A[minj] ¨ A[i]; A[i] ¨ minx;
Το βήµα 1 εκτελείται πάντα n φορές, και τα βήµατα 2 και 6 εκτελούνται πάντα (n –
1) φορές. Στην επανάληψη i, το βήµα 3 εκτελείται (n – i + 1) φορές, και το βήµα 4
εκτελείται (n – i) φορές. Όσον αφορά στο βήµα 5, η εκτέλεσή του εξαρτάται από τη
διάταξη των στοιχείων του πίνακα εισόδου. Έτσι, αν τα στοιχεία του πίνακα εισό-
δου είναι διατεταγµένα σε αύξουσα σειρά, το βήµα 5 δεν εκτελείται καµία φορά στη
διάρκεια του αλγορίθµου. Αντίθετα, αν τα στοιχεία του πίνακα εισόδου είναι διατε-
ταγµένα σε γνήσια φθίνουσα σειρά, το βήµα 5 εκτελείται (n – i) φορές, σε κάθε επα-
νάληψη i. Εποµένως, η καλύτερη περίπτωση για τον αλγόριθµο selection sort συµ-
βαίνει όταν ο πίνακας εισόδου είναι διατεταγµένος σε αύξουσα σειρά, και η χειρό-
τερη περίπτωση συµβαίνει όταν ο πίνακας εισόδου είναι διατεταγµένος σε γνήσια
φθίνουσα σειρά.

Για να έχουµε µια ασυµπτωτική εκτίµηση του χρόνου εκτέλεσης του αλγορίθµου,
αρκεί να υπολογίσουµε τον αριθµό των εκτελέσεων του βήµατος 3, ο οποίος δίνε-
n -1 n
n(n + 1)
ται από το άθροισµα Â
i =1
(n - i + 1) = Âi =
i =2
2
- 1 . Παρατηρείστε ότι το βήµα

3 εκτελείται τον ίδιο αριθµό φορών τόσο στην καλύτερη όσο και στη χειρότερη περί-
πτωση. Συνεπώς, ανεξάρτητα από το στιγµιότυπο, ο χρόνος εκτέλεσης του αλγο-
ρίθµου selection sort είναι τετραγωνικός στο µέγεθος της εισόδου.

1.2
Καταρχήν, ας θυµηθούµε τον ψευδοκώδικα του αλγορίθµου γραµµικής αναζήτησης:
procedure linear_search(A[1,...,n], x)
(1) i ¨ 1;
(2) while i <= n do
192 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

(3) if A[i] = x then


(4) return i;
(5) i ¨ i + 1;
(6) return 0;
Παρατηρείστε ότι σε κάθε περίπτωση τα βήµατα 4 και 6 εκτελούνται µία φορά συνο-
λικά. Αν ο ζητούµενος αριθµός x βρίσκεται στη θέση y του πίνακα Α, τα βήµατα 2
και 3 εκτελούνται ακριβώς y φορές, ενώ το βήµα 5 εκτελείται ακριβώς (y – 1) φορές.
Εποµένως, η καλύτερη περίπτωση για τον αλγόριθµο γραµµικής αναζήτησης είναι
ο ζητούµενος αριθµός x να βρίσκεται στην πρώτη θέση του πίνακα Α. Σε αυτή την
περίπτωση, ο χρόνος εκτέλεσης του αλγορίθµου είναι σταθερός, δηλαδή ανεξάρτη-
τος του µεγέθους n του πίνακα Α. Αντίθετα, η χειρότερη περίπτωση συµβαίνει όταν
ο αριθµός x βρίσκεται στην τελευταία θέση του πίνακα Α, όποτε και ο χρόνος εκτέ-
λεσης του αλγορίθµου είναι γραµµικός στο µέγεθος του πίνακα Α.

Έστω ότι ο αριθµός x έχει την ίδια πιθανότητα να βρίσκεται σε κάθε θέση του Α. Για
να αποκτήσουµε µια εκτίµηση του µέσου χρόνου εκτέλεσης του αλγορίθµου ως προς
αυτή την κατανοµή εισόδου, θα εξετάσουµε τον αριθµό των εκτελέσεων του βήµατος
2. Ο αριθµός x έχει πιθανότητα να βρίσκεται σε καθεµία από τις θέσεις y = 1, …, n µε
πιθανότητα 1/n, και όταν ο x βρίσκεται στη θέση y, το βήµα 2 εκτελείται y φορές. Επο-
µένως, ο µέσος αριθµός εκτελέσεων του βήµατος 2 δίνεται από το άθροισµα
n
n(n + 1) n + 1
Ân =
y
= . Υποθέτοντας ότι το x έχει την ίδια πιθανότητα να βρίσκεται
y =1
2n 2
σε κάθε θέση του Α, βλέπουµε ότι, όπως και στη χειρότερη περίπτωση, ο µέσος χρόνος
εκτέλεσης του αλγορίθµου γραµµικής αναζήτησης είναι γραµµικός στο µέγεθος του Α.
Στην περίπτωση που ο ζητούµενος αριθµός x δεν περιέχεται στον πίνακα Α, το βήµα
2 εκτελείται πάντα (n + 1) φορές, ενώ τα βήµατα 3 και 5 εκτελούνται n φορές. Ο
χρόνος εκτέλεσης του αλγορίθµου είναι γραµµικός στο µέγεθος της εισόδου, και
µάλιστα, αυτή η περίπτωση είναι ακόµα χειρότερη από την περίπτωση που ο x βρί-
σκεται στην τελευταία θέση του πίνακα Α.

2.1
Υπενθυµίζεται ότι ο χρόνος εκτέλεσης τόσο της καλύτερης όσο και της χειρότερης
περίπτωσης της selection sort είναι Θ(n2). Εποµένως, µόνο η πρόταση 5 είναι λαν-
θασµένη, αφού δεν υπάρχουν στιγµιότυπα που ο αλγόριθµος να χρειάζεται χρόνο
τουλάχιστον n3.
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 193

Σωστό Λάθος
1. Ο χρόνος εκτέλεσης της selection sort είναι Θ(n2). ✓
❏ ❏
2. Ο χρόνος εκτέλεσης της selection sort είναι Ο(n2). ✓
❏ ❏
3. Ο χρόνος εκτέλεσης της selection sort είναι Ω(n). ✓
❏ ❏
4. Ο χρόνος εκτέλεσης της selection sort είναι Ο(n3). ✓
❏ ❏
5. Ο χρόνος εκτέλεσης χειρότερης περίπτωσης
της selection sort είναι Ω(n3). ❏ ✓

6. Ο χρόνος εκτέλεσης καλύτερης περίπτωσης
της selection sort είναι Θ(n2). ✓
❏ ❏
7. Ο χρόνος εκτέλεσης χειρότερης περίπτωσης
της selection sort είναι Θ(n2). ✓
❏ ❏
Ο χρόνος εκτέλεσης χειρότερης και µέσης περίπτωσης του linear search είναι Θ(n).
Στην καλύτερη περίπτωση, ο χρόνος εκτέλεσης του linear search είναι Θ(1). Επο-
µένως, οι µόνο οι προτάσεις 8 και 11 είναι λανθασµένες.
8. Ο χρόνος εκτέλεσης της linear search είναι Θ(n). ❏ ✓

9. Ο χρόνος εκτέλεσης χειρότερης περίπτωσης
της linear search είναι Θ(n). ✓
❏ ❏
10.Ο χρόνος εκτέλεσης µέσης περίπτωσης
της linear search είναι Θ(n). ✓
❏ ❏
11.Ο χρόνος εκτέλεσης καλύτερης περίπτωσης
της linear search είναι Ω(n). ❏ ✓

12.Ο χρόνος εκτέλεσης χειρότερης περίπτωσης
της linear search είναι Ω(n). ✓
❏ ❏
13.Ο χρόνος εκτέλεσης καλύτερης περίπτωσης
της linear search είναι Ο(n). ✓
❏ ❏
14.Ο χρόνος εκτέλεσης καλύτερης περίπτωσης
της linear search είναι Ο(1). ✓
❏ ❏
15.Ο χρόνος εκτέλεσης χειρότερης περίπτωσης
της linear search είναι Ω(1). ✓
❏ ❏
194 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

2.2
(A). log log n, log n, log 2 n, n , n log n, 2 n , 22 n , n!, n n , 2 n! .
(B).
f(n) g(n) Ο ο Ω ω Θ
(α) 2n + k 2n + 2k – nk ΝΑΙ ΟΧΙ ΝΑΙ ΟΧΙ ΝΑΙ
3
(β) (logn)3 log(nlog( n ) ) ΟΧΙ ΟΧΙ ΝΑΙ ΝΑΙ ΟΧΙ
(γ) kn (3k)n/3 ΟΧΙ ΟΧΙ ΝΑΙ ΝΑΙ ΟΧΙ
(δ) (kn)1– ε n1– ε ΝΑΙ ΟΧΙ ΝΑΙ ΟΧΙ ΝΑΙ
(ε) n3 – 10n 8log n ΝΑΙ ΟΧΙ ΝΑΙ ΟΧΙ ΝΑΙ

2.3

Â
n
Το άθροισµα C(n) δεν µπορεί να είναι µεγαλύτερο από το άθροισµα n3 £ n4 .
i =1

Â
n
Επίσης, ισχύει ότι C (n ) ≥ n 3 / 8 ≥ n 4 / 16 .
i = n/2

Εποµένως, C(n) = Θ(n4), και πιθανολογούµε ότι το C(n) θα είναι ίσο µε κάποιο
πολυώνυµο τετάρτου βαθµού An4 + Bn3 + Cn2 + Dn + E. Για να προσδιορίσουµε
τους συντελεστές του πολυωνύµου, υπολογίζουµε τις τιµές του αθροίσµατος για
µικρές τιµές του n. Με αυτό τον τρόπο καταλήγουµε στο ακόλουθο σύστηµα πέντε
εξισώσεων µε πέντε αγνώστους.
n = 1: A + B + C + D + E = 1
n = 2: 16A + 8B + 4C + 2D + E = 9
n = 3: 81A + 27B + 9C + 3D + E = 36
n = 4: 256A + 64B + 16C + 4D + E = 100
n = 5: 625A + 125B + 25C + 5D + E = 225
Το παραπάνω σύστηµα έχει µοναδική λύση την A = 1/4, B = 1/2, C = 1/4, D = E =
0. Εποµένως, καταλήγουµε στο συµπέρασµα ότι

n 4 + 2n 3 + n2 n2 (n + 1)2
Â
n
C (n ) = i3 = = ,
i =1 4 4
το οποίο και θα επιβεβαιώσουµε µε µαθηµατική επαγωγή. Λόγω της µεθόδου µε την
οποία υπολογίσαµε τους συντελεστές του πολυωνύµου, η παραπάνω ισότητα ισχύ-
ει για n = 1, 2, 3, 4 και 5. Υποθέτουµε ότι ισχύει για n, και θα αποδείξουµε ότι ισχύ-
ει για n + 1. Πράγµατι,
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 195

n +1 n

Âi
i =1
3
= (n + 1) + 3
Âi
i =1
3

n2 (n + 1)2
= (n + 1) 3 +
4
(n + 1) ( 4n + 4 + n2 ) (n + 1)2 (n + 2 )2
2
= =
4 4
όπου στην πρώτη ισότητα βγάλαµε την περίπτωση i = n + 1 εκτός αθροίσµατος, στη
δεύτερη ισότητα εφαρµόσαµε την επαγωγική υπόθεση και, στη συνέχεια, κάναµε τις
πράξεις.

2.4
Για να αποδείξουµε την ανισότητα θα χρησιµοποιήσουµε µαθηµατική επαγωγή.
Παρατηρούµε ότι, για c ≥ 1, η ανισότητα ισχύει πάντα για n = 0. ∆εχόµαστε ότι ισχύ-
ει για n και θα αποδείξουµε ότι ισχύει για n + 1.
n +1 n

Â3 = 3
i =0
i n +1
+ Â3
i =0
i

n +1
£3 + c3 n
Ê cˆ
£ 3 n +1 Á1 + ˜
Ë 3¯

Παρατηρούµε ότι η ποσότητα 3 n +1 ÊÁ1 + c ˆ˜ είναι το πολύ ίση µε c3n + 1, για κάθε c ≥ 3/2.
Ë 3¯
Η τιµή 3/2 είναι η ελάχιστη τιµή της σταθεράς c για την οποία ισχύει η ανισότητα.

Με απόλυτα παρόµοιο τρόπο, µπορούµε να αποδείξουµε ότι, για κάθε α > 1 και για

Â
a n
κάθε σταθερά c ≥ , ισχύει ai £ ca n .
a -1 i =0

2.5
Αναπτύσσοντας την αναδροµική εξίσωση, έχουµε

T (n ) = 1 + T (n / 2 )
= 1 + 1 + T (n / 4 )
M
= 11
+41+
2L4+
31 + T (n / 2 ) .
i

i φορές
196 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

Θέτοντας i = log n, η ανάπτυξη της αναδροµής τερµατίζεται, αφού 2log n = n. Επο-


µένως, T(n) = log n + 1.

2.6
Η πρώτη εξίσωση µπορεί να λυθεί µε τη µέθοδο της επανάληψης. Έχουµε:

T (n ) = 3 + T (n - 1)
= 3 + 3 + T (n - 2 )
M
= 31+4
32
4 +L
44+33 + T (n - i ) .
i φορές

Θέτοντας i = n – 1, η ανάπτυξη της αναδροµής σταµατάει.


Εποµένως, T(n) = 3(n – 1) + Θ(1) = Θ(n).
Αναπτύσσοντας τη δεύτερη αναδροµική εξίσωση, έχουµε T(n) = 2n(n – 1) + Θ(1).
Εποµένως, Τ(n) = Θ(n2).
Η τρίτη αναδροµική εξίσωση περιγράφει το χρόνο εκτέλεσης χειρότερης περίπτω-
σης της merge sort. Έχουµε ήδη αποδείξει ότι T(n) = Θ(n log n).
Για την τέταρτη αναδροµική εξίσωση, υποθέτουµε, ορµώµενοι από την εξίσωση που
περιγράφει το χρόνο εκτέλεσης χειρότερης περίπτωσης της δυαδικής αναζήτησης, ότι
T(n) = log3 n. Για να επαληθεύει αυτή η λύση την αρχική συνθήκη, θεωρούµε ότι Τ(3)
= 1. Υποθέτουµε ότι T(n/3) = log3 (n/3) και αντικαθιστώντας στην εξίσωση, έχουµε:

n
T (n ) = log 3 + 1 = log 3 n - 1 + 1 = log 3 n .
3
Εποµένως, Τ(n) = Θ(log n).
Αναπτύσσοντας την πέµπτη αναδροµική εξίσωση, έχουµε:

T (n ) = n + T (n / 2 )
= n + n / 2 + T (n / 4 )
M
= n + n / 2 + L + n / 2i -1 + T (n / 2i ) .

Θέτοντας i = log n η ανάπτυξη της αναδροµής σταµατά. Θεωρώντας σαν αρχική συν-
θήκη Τ(1) = 1, έχουµε:
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 197

log n log n
T (n ) = Â n / 2 = nÂ1 / 2 £ 2n .
i =0
i

i =0
i

Εποµένως, T(n) = Θ(n).


Αναδροµική Εξίσωση Λύση
1. T(n) = T(n – 1) + 3 T(n) + Θ(n)
2. T(n) = T(n – 1) + 2n T(n) + Θ(n2)
3. T(n) = 2T(n/2) + n T(n) + Θ(n logn)
4. T(n) = T(n/3) + n T(n) + Θ(logn)
5. T(n) = T(n/2) + n T(n) + Θ(n)

2.7
Λύνουµε την πρώτη αναδροµική εξίσωση εφαρµόζοντας το Θεώρηµα της Κυριαρχίας.
Έχουµε log56 > 1 και f (n ) = O (nlog 5 6 - e ) , για κάποια αρκετά µικρή σταθερά ε > 0.
Εποµένως, εφαρµόζεται η πρώτη περίπτωση του θεωρήµατος, και T (n ) = Q (nlog 5 6 ) .

Για τη δεύτερη εξίσωση έχουµε log65 < 1 και f (n ) = n = W (nlog 5 6 + e ) , για κάποια
αρκετά µικρή σταθερά ε > 0. Επίσης, 5(n/6) £ 5/6 f(n). Συνεπώς, εφαρµόζεται η τρίτη
περίπτωση του Θεωρήµατος της Κυριαρχίας, και Τ(n) = Θ(n).
Για την τρίτη εξίσωση έχουµε f (n ) = n = Q (nlog 9 3 ) , οπότε και εφαρµόζεται η δεύ-

τερη περίπτωση του Θεωρήµατος της Κυριαρχίας. Άρα, T (n ) = Q ( n log n ) .


Η τέταρτη αναδροµική εξίσωση µπορεί να λυθεί µε τη µέθοδο της επανάληψης.
Έχουµε:

T (n ) = n2 + T (n - 1)
= n2 + (n - 1)2 + T (n - 2 )
M
n
= Âii =2
2
+ T (1) = Q (n 3 ) .
198 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

3n 3n

3n/5 21n/10 3n(9/10)


Θ(log n)
+

3n/25 21n/50 21n/50 147n/100 3n(81/100)

™¯‹Ì· 2.6 +

...
Το δέντρο
3n(9/10)3
της αναδροµής για

...
την εξίσωση
T(n) = T(n/5) +
T(7n/10) + 3n.

Για να λύσουµε την πέµπτη αναδροµική εξίσωση σχεδιάζουµε το δέντρο της ανα-
δροµής (Σχήµα 2.6). Αφού 1/5 + 7/10 = 9/10, η συνεισφορά κάθε επιπέδου είναι ίση
µε τα 9/10 της συνεισφοράς του προηγούµενου επιπέδου (στο νέο επίπεδο, η συνει-
σφορά των αριστερών κλάδων είναι ίση µε το 1/5 της συνεισφοράς του προηγούµε-
νου επιπέδου, ενώ η συνεισφορά των δεξιών κλάδων είναι ίση µε τα 7/10 της συνει-
σφοράς του προηγούµενου επιπέδου). Επίσης, το ύψος του δέντρου είναι µεταξύ
log5n και log10/7n, δηλαδή, Θ(log n). Συνεπώς, έχουµε:

Q (log n ) i
• i
Ê 9ˆ Ê 9ˆ
T (n ) = Â
i =0
Ë 10 ¯ Â
3nÁ ˜ £ 3n Á ˜ = 30n ,
i =0
Ë 10 ¯

όπου το τελευταίο άθροισµα είναι άθροισµα άπειρων όρων γνήσια φθίνουσας γεω-
µετρικής προόδου. Επιπλέον, αξίζει να σηµειωθεί ότι στην παραπάνω εκτίµηση για
το T(n), το ύψος του δέντρου της αναδροµής ουσιαστικά δεν παίζει ρόλο. Άρα, Τ(n)
= Θ(n).
Για να λύσουµε την έκτη αναδροµική εξίσωση σχεδιάζουµε το δέντρο της αναδρο-
µής (Σχήµα 2.7). Παρατηρούµε ότι η συνεισφορά κάθε επιπέδου είναι n (αφού 5/9
+ 4/9 = 1), ενώ το ύψος του δέντρου δεν µπορεί να είναι µικρότερο από log9/4n και
µεγαλύτερο από log9/5n. Εποµένως, T(n) = Θ(n log n).
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 199

n n
+

5n/9 4n/9 n
Θ(log n)

+
™¯‹Ì· 2.7
25n/81 20n/81 20n/81 16n/81 n
Το δέντρο
της αναδροµής για
+ την εξίσωση
...
T(n) = T(5n/9) +

...
T(4n/9) + n.

3.1
Ο χρόνος εκτέλεσης του παραπάνω αλγορίθµου διάταξης, ο οποίος εκτελείται σε
δύο φάσεις, έχει δύο συνιστώσες: Τον χρόνο εκτέλεσης µέσης περίπτωσης για την
παραλλαγή της πιθανοτικής έκδοσης της quicksort, η οποία εκτελείται σε πίνακες
µε τουλάχιστον k στοιχεία, και το χρόνο εκτέλεσης της insertion sort.
Αφού η quicksort σταµατά να εκτελείται όταν ο πίνακας εισόδου έχει k ή λιγότερα
στοιχεία, από τα log n επίπεδα της αναδροµής αφαιρούνται τα τελευταία log k. Επο-
µένως, ο αναµενόµενος αριθµός επιπέδων της αναδροµής για την παραλλαγή της
quicksort είναι log n – log k = log(n/k). Αφού κάθε επίπεδο συνεισφέρει Ο(n) χρόνο,
ο µέσος χρόνος εκτέλεσης της συγκεκριµένης παραλλαγής της quicksort είναι Ο(n
log(n/k)). Ένας άλλος τρόπος απόδειξης του ίδιου αποτελέσµατος είναι να δείξουµε
ότι η αναδροµική εξίσωση

1 Ê ˆ
n -1 n - k -1
S (n ) = Q (n ) + Á
n -1 Ë i=k Â
S (i ) +
i =1
ÂS (n - i )˜
¯

έχει λύση Ο(n log(n/k)), όπου S(i) = Θ(1), για i < k.


Με την ολοκλήρωση της quicksort, κάθε στοιχείο βρίσκεται το πολύ k θέσεις µακριά
από την τελική του θέση στον διατεταγµένο πίνακα. Εποµένως, η κλήση της insertion
sort χρειάζεται χρόνο O(kn), αφού κάθε στοιχείο θα συγκριθεί και θα µετακινηθεί
το πολύ k φορές, µέχρι να φτάσει την τελική του θέση.
Άρα, ο χρόνος εκτέλεσης για τον παραπάνω αλγόριθµο που συνδυάζει την quicksort
µε την insertion sort είναι O(kn + log(n/k)).
200 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

Έστω c1 και c2 οι «κρυµµένες» πολλαπλασιαστικές σταθερές σε αυτή την έκφραση,


δηλαδή ο χρόνος εκτέλεσης είναι c1nk + c2n log(n/k). Η τιµή του k θα επιλεγεί ίση
µε c2/c1 ώστε να ελαχιστοποιηθεί η τιµή της παραπάνω έκφρασης. Στην πράξη, η
τιµή του k θα επιλεγεί ώστε ο µέσος χρόνος εκτέλεσης της quicksort να είναι µικρό-
τερος από τον µέσο χρόνο εκτέλεσης της insertion sort σε έναν πίνακα µε τουλάχι-
στον k στοιχεία.

3.2
Από τον ορισµό, το κάτω φράγµα Ω(n log n) δεν ισχύει για αυτό το πρόβληµα, επει-
δή µόνο ορισµένες από τις n! αναδιατάξεις των στοιχείων µπορούν να συµβούν.
Συγκεκριµένα, για κάθε οµάδα µπορούν να συµβούν k! αναδιατάξεις και, αφού υπάρ-
χουν n/k οµάδες, το σύνολο των πιθανών αναδιατάξεων είναι (k!)n/k.

Επειδή το δέντρο των συγκρίσεων είναι δυαδικό, το ύψος του h δεν µπορεί να είναι
µικρότερο από το λογάριθµο µε βάση 2 του αριθµού των πιθανών αναδιατάξεων.
Εποµένως,

( )
h ≥ log ( k!) n / k =
n
k
k log k = n log k
.

Η ποσότητα n log k αποτελεί ένα κάτω φράγµα στον αριθµό των συγκρίσεων που
χρειάζεται κάθε ντετερµινιστικός αλγόριθµος, ο οποίος είναι βασισµένος σε συγκρί-
σεις στοιχείων, για να λύσει το παραπάνω πρόβληµα.

3.3
Έστω ότι τα ενδιάµεσα στοιχεία A[n/2] και B[n/2] είναι διαφορετικά µεταξύ τους
και, έστω A[n/2] < B[n/2]. Τότε, το ενδιάµεσο στοιχείο του A » B πρέπει να βρί-
σκεται µεταξύ των A[n/2] και B[n/2], αφού όλα τα στοιχεία Α[1, …, n/2] είναι µικρό-
τερα από το ενδιάµεσο και όλα τα στοιχεία Β[n/2, …, n] είναι µεγαλύτερα από το
ενδιάµεσο. Συγκεκριµένα, το ενδιάµεσο στοιχείο του A » B θα είναι το ενδιάµεσο
στοιχείο του πίνακα A[n/2, …, n] » B[1, …, n/2]. Οµοίως, αν A[n/2] > B[n/2], το
ενδιάµεσο στοιχείο του A » B θα είναι το ενδιάµεσο στοιχείο του Α[1, …, n/2] »
B[n/2, …, n]. Ο αλγόριθµος συνεχίζει µε την ίδια µέθοδο, καλώντας αναδροµικά τον
εαυτό του. Στη συνέχεια, δίνεται ο ψευδοκώδικας.
median_of_union(A[p1,...,r1], B[p2,...,r2])
if r1 – p1 £ 1 then
ÀÔÏfiÁÈÛÂ Î·È Â¤ÛÙÚ„ ÙÔ ÂӉȿÌÂÛÔ ÛÙÔȯ›Ô
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 201

‰È·Ù¿ÛÛÔÓÙ·˜ ÙÔÓ ›Ó·Î· ∞[p1,...,r1]»B[p2,...,r2];


q1 = (p1 + r1) / 2; q2 = (p2 + r2) / 2;
if A[q1] < B[q2] then
return median_of_union(A[q1,...,r1], B[p2,...,q2]);
else
return median_of_union(A[p1,...,q1], B[q2,...,r2]);
Παρατηρούµε ότι σε κάθε αναδροµική κλήση, ο αλγόριθµος, χρησιµοποιώντας το
αποτέλεσµα µιας σύγκρισης, υποδιπλασιάζει το µέγεθος του προβλήµατος. Εποµέ-
νως, ο χρόνος εκτέλεσης T(n) του αλγορίθµου δίνεται από την αναδροµική εξίσωση
T(n) = T(n/2) + Θ(1), η οποία γνωρίζουµε ότι έχει λύση T(n) = Θ(log n).

3.4

Âw £ 2,
1
Εξ’ ορισµού, το βεβαρηµένο ενδιάµεσο στοιχείο xk έχει την ιδιότητα i
xi < xk

 w £ 2 . Όταν τα βάρη w = 1/n, i = 1, 2, …, n, οι παραπάνω σχέσεις


1
και i
i
xi > xk

υποδεικνύουν ότι το πολύ n/2 στοιχεία είναι µικρότερα και το πολύ n/2 στοιχεία είναι
µεγαλύτερα από το xk. Εποµένως, το xk είναι και το ενδιάµεσο στοιχείο της ακολου-
θίας x1, …, xn .
Αφού διατάξουµε τα στοιχεία x1, …, xn σε αύξουσα σειρά, βαδίζοντας από το µικρό-
τερο προς το µεγαλύτερο, υπολογίζουµε το άθροισµα των βαρών των στοιχείων που
έχουµε επισκεφθεί µέχρι στιγµής. Το βεβαρυµένο ενδιάµεσο στοιχείο xk είναι το πρώτο
για το οποίο το παραπάνω άθροισµα φθάσει ή ξεπεράσει το 1/2. Ο αλγόριθµος αυτός
χρειάζεται Θ(n log n) χρόνο για τη διάταξη των στοιχείων x1, …, xn σε αύξουσα σειρά
και γραµµικό χρόνο για την εύρεση του xk στη διατεταγµένη ακολουθία.
Θεωρούµε τον ακόλουθο αλγόριθµο:
1. Υπολόγισε το ενδιάµεσο στοιχείο xm της ακολουθίας x1, …, xn χρησιµοποιώντας
τη διαδικασία quickselect.
2. Καλώντας τη διαδικασία partition, διαίρεσε την ακολουθία x1, …, xn σε δύο επι-
µέρους ακολουθίες. Οργάνωσε τη διαίρεση γύρω από το ενδιάµεσο στοιχείο xm.

3. Υπολόγισε τα αθροίσµατα WL = Âw
xi < x m
i και WR = Âw.
xi > x m
i

4. Αν το xm είναι και το βεβαρηµένο ενδιάµεσο στοιχείο, επέστρεψέ το.


202 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

5. ∆ιαφορετικά, πρόσθεσε το µικρότερο από τα αθροίσµατα WL και WR στο βάρος


του xm, και εφάρµοσε αναδροµικά τον αλγόριθµο στην επιµέρους ακολουθία µε
το µεγαλύτερο άθροισµα βαρών (στην οποία έχεις προσθέσει και το στοιχείο xm).
Όσον αφορά στην ορθότητα, στην περίπτωση που το βεβαρηµένο ενδιάµεσο στοι-
χείο είναι ίδιο µε το ενδιάµεσο στοιχείο xm, ο αλγόριθµος το βρίσκει και το επι-
στρέφει (βήµα 4). Σε διαφορετική περίπτωση, η πρόσθεση του βάρους της «ελα-
φρότερης» επιµέρους ακολουθίας στο xm δεν αλλάζει το βεβαρηµένο ενδιάµεσο στοι-
χείο της αρχικής ακολουθίας, αλλά επιτρέπει να περιορίσουµε την αναζήτηση στην
επιµέρους ακολουθία µε το µεγαλύτερο βάρος, όπου πρέπει να βρίσκεται το βεβα-
ρηµένο ενδιάµεσο στοιχείο.
Ο χρόνος εκτέλεσης T(n) του παραπάνω αλγορίθµου δίνεται από την αναδροµική
εξίσωση T(n) = T(n/2) + Θ(n), η οποία έχει λύση T(n) = Θ(n).

3.5

 Â
n -1 n -1
Έστω A( x ) = ai x i και B( x ) = bi x i πολυώνυµα βαθµού (n – 1), και
i =0 i =0

C(x) = A(x)B(x) το γινόµενό τους.

Τα πολυώνυµα A(x) και Β(x) µπορούν να γραφούν σαν A(x) =A1(x) + xn/2 A2(x), όπου

 Â
n / 2 -1 n / 2 -1
A1 ( x ) = ai x i και A2 ( x ) = an / 2 + i x i ,
i =0 i =0

 Â
n / 2 -1 n / 2 -1
και B(x) =B1(x) + xn/2 B2(x), όπου B1 ( x ) = bi x i και B2 ( x ) = bn / 2 + i x i ,
i =0 i =0

αντίστοιχα. Το γινόµενο C(x) µπορεί να υπολογιστεί από τον τύπο:

C ( x ) = ( A1 ( x ) + x n / 2 A2 ( x ))( B1 ( x ) + x n / 2 B2 ( x ))
= A1 ( x ) B1 ( x ) + x n / 2 ( A1 ( x ) B2 ( x ) + A2 ( x ) B1 ( x )) + x n A2 ( x ) B2 ( x )
[
= A1 ( x ) B1 ( x ) + x n / 2 ( A1 ( x ) + A2 ( x ))( B1 ( x ) + B2 ( x )) - A1 ( x ) B1 ( x ) - A2 ( x ) B2 ( x ) ]
+ x A2 ( x ) B2 ( x ) ,
n

εκτελώντας τρεις πολλαπλασιασµούς µεταξύ πολυωνύµων βαθµού (n/2 – 1) και µερι-


κές προσθέσεις πολυωνύµων. Αφού κάθε πρόσθεση πολυωνύµων µπορεί να εκτε-
λεσθεί σε χρόνο Θ(n), ο χρόνος T(n) για τον υπολογισµό του γινοµένου C(x) µε την
παραπάνω µέθοδο δίνεται από την αναδροµική εξίσωση T(n) = 3T(n/2) + Θ(n), η
οποία γνωρίζουµε ότι έχει λύση T(n) = Θ(nlog 3).
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 203

3.6
Αφού τα πολυώνυµα A(x) και B(x) είναι βαθµού 1, το γινόµενό τους C(x) θα είναι
βαθµού 2, εποµένως, προσδιορίζεται µοναδικά από, τουλάχιστον, 3 τιµές. Επειδή ο
αλγόριθµος FFT εφαρµόζεται για δυνάµεις του 2, θα υπολογίσουµε τις τιµές των
πολυωνύµων σε 4 σηµεία (n = 4). Τα διανύσµατα συντελεστών είναι Α = [3, – 1, 0,
0] και Β = [2, 3, 0, 0]. Οι µιγαδικές ρίζες της µονάδας για n = 4 είναι {1, i, – 1, – i},
µε κύρια ρίζα το i.
Για το πολυώνυµο Α, ο FFT καλείται µε παράµετρο [3, – 1, 0, 0], θέτει Α[0] = [3, 0],
Α[1] = [ – 1, 0], ω4 = i και κάνει τις αναδροµικές κλήσεις FFT([3, 0]) και FFT([ – 1, 0]).
Η πρώτη αναδροµική κλήση θέτει ω2 = – 1 και καλεί αναδροµικά FFT([3]) και
FFT([0]). Από αυτές τις κλήσεις επιστρέφονται τα Υ[0] = 3 και Υ[1] = 0, οπότε ο
αλγόριθµος υπολογίζει τα y0 = 3 + 1 ¥ 0 = 3 και y1 = 3 + 1 ¥ 0 = 3. Εποµένως, η
κλήση FFT([3, 0]) επιστρέφει το [3, 3]. Οµοίως, η δεύτερη κλήση υπολογίζει τα y0
= – 1 + 1 ¥ 0 = – 1 και y1 = – 1 + 1 ¥ 0 = – 1, και επιστρέφει [ – 1, – 1].
Επιστρέφουµε στη βασική κλήση του αλγορίθµου, FFT([3, – 1, 0, 0]). Για k = 0, ο
αλγόριθµος υπολογίζει y0 = 3 + 1 ¥ (– 1) = 2 και y2 = 3 + (– 1) ¥ (– 1) = 4. Για k = 1,
ο αλγόριθµος υπολογίζει y1 = 3 + i ¥ (– 1) = 3 – i και y3 = 3 + (– i) ¥ (– 1) = 3 + i. Επο-
µένως, ο αλγόριθµος επιστρέφει το ΥΑ = [2, 3 – i, 4, 3 + i]. Με παρόµοιο τρόπο, η
κλήση FFT([2, 3, 0, 0] για το πολυώνυµο B επιστρέφει το ΥΒ = [5, 2 + 3i, – 1, 2 – 3i].
Οι τιµές του γινοµένου C(x) στις µιγαδικές ρίζες της µονάδας είναι YC = [10, 9 + 7i,
– 4, 9 – 7i]. Ο αντίστροφος FFT καλεί FFT([10, – 4]) και FFT([9 + 7i, 9 – 7i]). Η
πρώτη κλήση επιστρέφει C[0] = [6, 14] και η δεύτερη κλήση επιστρέφει C[1] = [18,
14i]. Για k = 0, η βασική κλήση του αλγορίθµου υπολογίζει c0 = 6 + 18 / 1 = 24 και
c2 = 6 + 18 / (– 1) = – 12. Για k = 1, ο αλγόριθµος υπολογίζει c1 = 14 + 14i / i = 28
και c3 = 14 + 14i / (– i) = 0. ∆ιαιρώντας το αποτέλεσµα µε το n = 4, παίρνουµε το
διάνυσµα των συντελεστών του γινοµένου C = [6, 7, – 3, 0], το οποίο αντιστοιχεί
στο πολυώνυµο C(x) = 6 + 7x – 3x2.

4.1
Για να είναι δυνατή η ανακατασκευή µιας βέλτιστης λύσης πρέπει, κάθε φορά που
ο αλγόριθµος MATRIX – CHAIN – MULT υπολογίζει µία τιµή m[i, j], να αποθηκεύουµε
την τιµή του k για την οποία µπορεί να επιτευχθεί αυτή η τιµή. Με αυτό τον τρόπο,
αφού υπολογισθεί η τιµή m[1, n], µπορούµε να ανακαλέσουµε τις βέλτιστες επιµέ-
ρους λύσεις οι οποίες συνθέτουν µια βέλτιστη λύση.
Για την αποθήκευση των τιµών του k θα χρησιµοποιήσουµε έναν άλλο πίνακα s[1..n,
204 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

1...m]. Η τρέχουσα τιµή s[i, j] δηλώνει την τρέχουσα τιµή του k για την οποία επιτυγ-
χάνεται η τρέχουσα τιµή m[i, j]. Εποµένως, κάθε φορά που µία τιµή εκχωρείται στη
θέση m[i, j], θα πρέπει να εκχωρείται και η αντίστοιχη τιµή του k στη θέση s[i, j].
Αυτή η τροποποίηση µπορεί να γίνει αντικαθιστώντας τις δύο τελευταίες γραµµές
του ψευδοκώδικα για τη διαδικασία MATRIX – CHAIN – MULT µε τις ακόλουθες γραµ-
µές ψευδοκώδικα:
if q < m[i, j] then
m[i, j] ¨ q; s[i, j] ¨ k;
return (m[1, n], s);
Παρατηρείστε ότι αυτές οι αλλαγές δεν µεταβάλουν τις ασυµπτωτικές συµπεριφορές
του χρόνου εκτέλεσης και του αριθµού των θέσεων µνήµης που απαιτεί ο αλγόριθµος.
Η παρακάτω διαδικασία επιστρέφει το γινόµενο C δύο πινάκων Α και Β διαστάσε-
ων d1 ¥ d2 και d2 ¥ d3, αντίστοιχα. Αυτή η διαδικασία υλοποιεί τον αλγόριθµο πολ-
λαπλασιασµού πινάκων που βασίζεται στον ορισµό και χρησιµοποιεί ακριβώς d1 d2
d3 πολλαπλασιασµούς στοιχείων των πινάκων.
MATRIX – MULTIPLY(A, B, d1, d2, d3)
for i ¨ 1 to d1 do
for j ¨ 1 to d3 do
C[i, j] ¨ 0;
for k ¨ 1 to d2 do
C[i, j] ¨ C[i, j] + A[i, k]*B[k, j];
return C;
Τέλος, η παρακάτω αναδροµική διαδικασία χρησιµοποιεί το γεγονός ότι, ο βέλτιστος
αριθµός πολλαπλασιασµών στοιχείων για τον υπολογισµό του γινοµένου Αi..j, 1 £ i
< j £ n, είναι m[i, j] και επιτυγχάνεται όταν το γινόµενο Ai..j υπολογισθεί µε διαίρε-
ση στη θέση s[i, j], δηλαδή Ai..j = Ai..s[i, j] As[i, j] + 1..j .
MATRIX – CHAIN – PRODUCT(Ai,...,Aj, s)
if j > i then
X ¨ MATRIX – CHAIN – PRODUCT(Ai,...,As[i,j], s);
Y ¨ MATRIX – CHAIN – PRODUCT(As[i,j] + 1,...,Aj, s);
return matrix – multiply(X, Y, di – 1, ds[i, j], dj);
else return Ai;
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 205

4.2
Όπως και για τις δύο ακολουθίες, το πρόβληµα της µεγαλύτερης κοινής υπακολουθίας
τριών ακολουθιών Χ, Υ και Ζ έχει την ιδιότητα των βέλτιστων επιµέρους δοµών. Έστω
c[i, j, k] το µήκος της µεγαλύτερης κοινής υπακολουθίας των προθεµάτων Xi, Yj και Zk.
Η αναδροµική εξίσωση που περιγράφει τα στοιχεία του πίνακα c[1..n, 1..m, 1..p] απο-
τελεί επέκταση της αναδροµικής εξίσωσης για την περίπτωση των δύο ακολουθιών.

Ï0 αν i = 0, ή j = 0, ή k = 0.
Ô
c[ i, j , k ] = Ìc[ i - 1, j - 1, k - 1] + 1 αν i , j , k > 0 κ αι xi = y j = zk
Ômax{c[ i, j , k - 1], c[ i, j - 1, k ], c[ i - 1, j , k ]} αν i , j , k > 0 κ αι όχι x = y = z
Ó i j k

Οι παρακάτω διαδικασίες υπολογίζουν µε top – down τρόπο το µήκος c[n, m, p] της


µεγαλύτερης κοινής υπακολουθίας των Χ, Υ και Ζ σύµφωνα µε την παραπάνω ανα-
δροµική εξίσωση.
MEMOIZED – 3LCS – LENGTH(X, Y, Z)
for i ¨ 1 to n do
for j ¨ 1 to m do
for k ¨ 1 to p do
c[i, j, k] ¨ •;
return LOOKUP – 3LCS(Xn, Ym, Zp);

LOOKUP – 3LCS(Xi, Yj, Zk)


if c[i, j, k] < • then return c[i, j, k];
if i = 0 or j = 0 or k = 0 then
c[i, j, k] ¨ 0; return c[i, j, k];
if (xi = yj = zk) then
c[i, j, k] = LOOKUP – 3LCS(Xi – 1, Yj – 1, Zk – 1);

else
tx = LOOKUP – 3LCS(Xi – 1, Yj, Zk);
ty = LOOKUP – 3LCS(Xi, Yj – 1, Zk);
tz = LOOKUP – 3LCS(Xi, Yj, Zk – 1);
c[i, j, k] = max{tx, ty, tz};
return c[i, j, k];
206 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

Παρατηρείστε ότι κάθε στοιχείο του πίνακα c[1..n, 1..m, 1..p] υπολογίζεται ακριβώς
µία φορά σε Θ(1) χρόνο. Επειδή ο πίνακας c έχει nmp στοιχεία, ο χρόνος που απαι-
τείται για τον υπολογισµό του c[n, m, p] είναι Θ(nmp).

4.3
Έστω ότι µε Χi / Yj συµβολίζουµε το πρόθεµα µήκους i / j της συµβολοσειράς Χ / Υ.
Επίσης, έστω c[i, j] το ελάχιστο κόστος για τη µετατροπή της Xi στην Yj. Η Xi µπο-
ρεί να µετατραπεί στην Υj µε έναν από τους ακόλουθους τρόπους:
Μεταβολή της Χi – 1 στην Υj και διαγραφή του χαρακτήρα Χ[i] (κόστος c[i – 1, j] + d).
Μεταβολή της Xi στην Υj – 1 και προσθήκη του χαρακτήρα Υ[j] (κόστος c[i, j – 1] + b).
Μεταβολή της Xi – 1 στην Yj – 1 και αντικατάσταση του X[i] από τον Υ[j], αν αυτό είναι
απαραίτητο (κόστος c[i – 1, j – 1] + α ¥ b, όπου Α = 0 αν X[i] = Y[j] και 1 διαφορετικά).

Βλέπουµε ότι το πρόβληµα της µεταβολής µιας συµβολοσειράς Χ σε µία άλλη Υ έχει
την ιδιότητα των βέλτιστων επιµέρους δοµών. Με βάση τις παραπάνω παρατηρή-
σεις, µπορούµε να διατυπώσουµε την αναδροµική εξίσωση που περιγράφει τα στοι-
χεία του πίνακα c[1..n, 1..m].

Ïid αν j = 0.
Ô
Ô jb αν i = 0.
c[ i, j ] = Ì
Ômin{c[ i - 1, j - 1], c[ i - 1, j ] + d , c[ i, j - 1] + b} αν i, j > 0 κ αι X [i ] = Y [ j ].
ÔÓmin{c[ i - 1, j - 1] + h, c[ i - 1, j ] + d , c[ i, j - 1] + b} αν i, j > 0 κ αι X [i ] π Y [ j ].

Ο παρακάτω αλγόριθµος υπολογίζει το ελάχιστος κόστος c[n, m] για τη µεταβολή της


Χ στην Υ. Ο πίνακας c[1..n. 1..m] έχει ακριβώς nm στοιχεία και, αφού η τιµή κάθε στοι-
χείου υπολογίζεται σε Θ(1) χρόνο, ο χρόνος για τον υπολογισµό του c[n, m] είναι Θ(nm).
MODIFY(X[1,...,n], Y[1,...,m])
for i ¨ 1 to n do c[i, 0] ¨ i ¥ d;
for j ¨ 1 to m do c[0, j] ¨ j ¥ b;
for i ¨ 1 to n do
for j ¨ 1 to m do
if X[i] = Y[j] then c[i, j] ¨ c[i–1, j–1];
else c[i, j] ¨ c[i – 1, j – 1] + h;
if c[i, j] > c[i, j – 1] + b then
c[i, j] ¨ c[i, j – 1] + b;
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 207

if c[i, j] > c[i – 1, j] + d then


c[i, j] ¨ c[i – 1, j] + d;
return c[n, m];
Η παραπάνω διαδικασία χρησιµοποιεί nm + Θ(1) θέσεις µνήµης. Αυτός ο αριθµός
µπορεί να ελαττωθεί σε min{n, m} + Θ(1). Παρατηρούµε ότι για τον υπολογισµό
της τιµής του στοιχείου c[i, j] χρησιµοποιούνται µόνο στοιχεία από την τρέχουσα
γραµµή i και από την προηγούµενη γραµµή i – 1. Ο υπολογισµός του c[i, j] µπορεί
να γίνει έχοντας αποθηκευµένη στη µνήµη µόνο µία γραµµή του πίνακα c[1..n, 1..m].
Όταν υπολογιστεί το c[i, j – 1] µπορούµε να το αποθηκεύσουµε σε µία προσωρινή
θέση µνήµης t. Αφού χρησιµοποιήσουµε τα c[i – 1, j – 1], c[i – 1, j] και c[i, j – 1] για
τον υπολογισµό του c[i, j], το c[i, j – 1] µπορεί να πάρει τη θέση του c[i – 1, j – 1],
το οποίο δεν θα χρησιµοποιηθεί στη συνέχεια. Στην προσωρινή θέση t αποθηκεύε-
ται το c[i, j]. Έτσι, µία γραµµή του πίνακα c και µία προσωρινή θέση µνήµης αρκούν
για τον υπολογισµό όλων των c[i, j]. Χρησιµοποιώντας το µικρότερο από τα n, m
για την αρίθµηση των γραµµών του πίνακα c, επιτυγχάνουµε τη χρήση min{n, m} +
Θ(1) θέσεων µνήµης.

5.1
Το πρόβληµα αυτό είναι πιο γνωστό σαν πρόβληµα χρωµατισµού διαστηµάτων
(interval coloring problem), όπου οι δραστηριότητες αντιστοιχούν σε χρονικά δια-
στήµατα, και κάθε χρώµα σε διαφορετική µονάδα κοινόχρηστου πόρου. Το ζητού-
µενο είναι ο χρωµατισµός των διαστηµάτων µε τον ελάχιστο αριθµό χρωµάτων, ώστε
κάθε ζευγάρι επικαλυπτόµενων διαστηµάτων να έχει διαφορετικά χρώµατα.
Έστω d ο µέγιστος αριθµός διαστηµάτων /δραστηριοτήτων που επικαλύπτονται
κάποια χρονική στιγµή. Προφανώς, χρειαζόµαστε τουλάχιστον d χρώµατα. Ο παρα-
κάτω άπληστος αλγόριθµος αναθέτει στο διάστηµα i, 1 £ i £ n, το µικρότερο χρώµα
που είναι διαθέσιµο τη χρονική στιγµή si. Παρατηρούµε ότι, σε κάθε χρονική στιγ-
µή k, ο αλγόριθµος χρησιµοποιεί ακριβώς τόσα χρώµατα όσες και οι δραστηριότη-
τες που επικαλύπτονται τη στιγµή k. Εποµένως, ο αλγόριθµος χρησιµοποιεί ακριβώς
d χρώµατα, που είναι και ο ελάχιστος αριθµός χρωµάτων.
GREEDY – INTERVAL – COLORING(A = [(s1, f1),...,(sn, fn)])
F ¨ max{fi: 1 £ i £ n}; c ¨ 1;
for k ¨ 0 to F do
for all j Œ {i : 1 £ i £ n and fi = k} do
c ¨ c – 1;
208 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

for all j Œ {i : 1 £ i £ n and si = k} do


C[c] = j; c ¨ c + 1;
return C;
Όπως έχει διατυπωθεί, ο αλγόριθµος έχει χρόνο εκτέλεσης Θ(Fn). Έστω ότι δια-
τάσσουµε όλα τα σηµεία fi και si σε αύξουσα σειρά, όπου όταν fi = sj, i π j, θεωρού-
µε ότι η ολοκλήρωση του διαστήµατος i προηγείται της έναρξης του διαστήµατος j,
αφού έχουµε υποθέσει ότι τα διαστήµατα είναι κλειστά δεξιά και ανοικτά αριστερά.
Τότε ο χρωµατισµός των διαστηµάτων µπορεί να γίνει σε γραµµικό χρόνο, γιατί ο
εντοπισµός κάθε χρονικής στιγµής k που συµβαίνει µια ολοκλήρωση ή έναρξη δια-
στήµατος µπορεί να γίνει σε σταθερό χρόνο. Σε αυτή την περίπτωση, ο χρόνος εκτέ-
λεσης του αλγορίθµου καθορίζεται από το χρόνο για τη διάταξη των χρονικών στιγ-
µών έναρξης και ολοκλήρωσης, που είναι O(n log n).

5.2
∆ιατάσσουµε τα στοιχεία του x σε αύξουσα σειρά, x1 £ x2 £ … £ xn. Αν z είναι το
µικρότερο διαθέσιµο στοιχείο του Χ, προσθέτουµε στη συλλογή το διάστηµα [z, z +
1], διαγράφουµε από το x όλα τα στοιχεία που περιέχονται στο [z, z + 1] και συνεχί-
ζουµε µε το επόµενο διαθέσιµο στοιχείο του Χ.
Αν τα στοιχεία του Χ είναι διατεταγµένα σε αύξουσα σειρά, ο παραπάνω άπληστος
αλγόριθµος υπολογίζει µία συλλογή διαστηµάτων σε χρόνο Θ(n). Εποµένως, ο χρό-
νος εκτέλεσης του παραπάνω αλγορίθµου καθορίζεται από το χρόνο για τη διάταξη
των στοιχείων του Χ, ο οποίος είναι Ο(n log n).
Έστω Α µία βέλτιστη συλλογή διαστηµάτων, η οποία δεν περιέχει το διάστηµα Ι =
[x1, x1 + 1]. Προφανώς, η Α θα περιέχει κάποιο άλλο διάστηµα J το οποίο καλύπτει
το στοιχείο x1. Αφού δεν υπάρχει κανένα στοιχείο µικρότερο του x1, το διάστηµα J
µπορεί να αντικατασταθεί από το Ι και η Α να παραµείνει βέλτιστη λύση. Εποµένως,
πάντα υπάρχει µία βέλτιστη λύση της οποίας το πρώτο διάστηµα συµπίπτει µε την
πρώτη επιλογή του άπληστου αλγόριθµου (ιδιότητα άπληστης επιλογής).
Έστω Χ΄ = Χ / {σηµεία του Χ που καλύπτονται από διάστηµα Ι = [x1, x1 + 1]}. Θα
δείξουµε ότι το σύνολο Α΄ = Α / {Ι} είναι µία βέλτιστη συλλογή διαστηµάτων για το
Χ΄ (ιδιότητα βέλτιστων επιµέρους δοµών). Αν υπήρχε ένα µικρότερο σύνολο Β¢, το
οποίο κάλυπτε όλα τα σηµεία του Χ΄, τότε το Β¢ » {I} θα ήταν µία συλλογή δια-
στηµάτων που καλύπτει όλα τα στοιχεία του Χ, και έχει µικρότερο πληθικό αριθµό
από το Α. Το γεγονός αυτό αντίκειται στην υπόθεση ότι το Α είναι µία βέλτιστη λύση.
Εποµένως, το Α΄ πράγµατι είναι µία βέλτιστη λύση για το στιγµιότυπο Χ΄.
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 209

Εφαρµόζοντας επαγωγικά (ως προς τον αριθµό των βηµάτων του άπληστου αλγο-
ρίθµου) τις ιδιότητες της βέλτιστης επιλογής και των βέλτιστων επιµέρους δοµών,
καταλήγουµε στην απόδειξη ορθότητας του αλγορίθµου, δηλαδή στο συµπέρασµα
ότι η άπληστη στρατηγική υπολογίζει µία βέλτιστη λύση.

5.3
Ο άπληστος αλγόριθµος χρησιµοποιεί όσο περισσότερα εικοσάρικα µπορεί, στη
συνέχεια, όσα περισσότερα τάλιρα µπορεί και, τέλος, συµπληρώνει το υπόλοιπο
ποσόν µε κέρµατα αξίας µία δραχµής.
Αν g2 ο αριθµός εικοσάρικων, g1 ο αριθµός των τάλιρων και g0 ο αριθµός των δραχ-
µών που χρησιµοποιεί ο άπληστος αλγόριθµος, θα ισχύουν οι ακόλουθες σχέσεις:
0 £ Χ – 20 g2 < 20, δηλαδή g 2 = Î X 20û .
Αν Χ¢ = Χ – 20 g2, 0 £ Χ¢ – 5g1 < 5, δηλαδή g1 = Î X ¢ 5û .
Αν Χ≤ = Χ¢ – 5 g1, X≤ – g0 = 0, δηλαδή g0 = Χ≤.
Επίσης, για κάθε βέλτιστη λύση ισχύουν οι ανισότητες:
– 5g1 + g0 < 20, γιατί διαφορετικά θα αντικαθιστούσαµε µερικά τάλιρα και δραχµές
(π.χ. τέσσερα τάλιρα, ή τρία τάλιρα και πέντε δραχµές) µε ένα εικοσάρικο, παίρνο-
ντας µία λύση µε µικρότερο αριθµό κερµάτων.
– g0 < 5, γιατί διαφορετικά θα αντικαθιστούσαµε πέντε δραχµές µε ένα τάλιρο, δίνο-
ντας έτσι τέσσερα κέρµατα λιγότερα.
Προφανώς, καµία βέλτιστη λύση δεν µπορεί να περιέχει περισσότερα από g2 εικο-
σάρικα. Ας υποθέσουµε ότι, για κάποιο Χ, µία βέλτιστη λύση περιέχει o2 < g2 εικο-
σάρικα. Αυτό σηµαίνει ότι Χ – 20 ο2 > 20 και, άρα, η βέλτιστη λύση θα περιέχει ένα
σύνολο από τάλιρα και δραχµές µε αξία ακριβώς 20. Αυτά τα κέρµατα µπορούν να
αντικατασταθούν από ένα εικοσάρικο, δίνοντας µία λύση µε µικρότερο αριθµό κερ-
µάτων. Άρα, κάθε βέλτιστη λύση περιέχει ακριβώς g2 εικοσάρικα. Οµοίως, αποδει-
κνύεται ότι κάθε βέλτιστη λύση, η οποία περιέχει g2 εικοσάρικα, επίσης περιέχει
ακριβώς g1 τάλιρα. Τέλος, κάθε βέλτιστη λύση που περιέχει g2 εικοσάρικα και g1
τάλιρα, δεν µπορεί παρά να περιέχει ακριβώς g0 δραχµές. ∆ηλαδή, όταν τα κέρµα-
τα που έχουµε στη διάθεσή µας έχουν αξίες 20, 5 και 1, ο άπληστος αλγόριθµος υπο-
λογίζει µία βέλτιστη λύση.
Ας υποθέσουµε ότι έχουµε στη διάθεσή µας κέρµατα αξίας 1, 13 και 29 δραχµών,
και θέλουµε να δώσουµε ρέστα αξίας 39 δραχµών. Ο άπληστος αλγόριθµος θα έδινε
ένα κέρµα 29 δραχµών και δέκα κέρµατα µία δραχµής, σύνολο 11 κέρµατα. Η βέλ-
210 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

τιστη λύση αποτελείται από 3 κέρµατα 13 δραχµών. Εποµένως, ο άπληστος αλγό-


ριθµος δεν µπορεί να εγγυηθεί τον υπολογισµό µιας βέλτιστης λύσης για κάθε σύνο-
λο κερµάτων.

6.1
Στην περίπτωση που το G αναπαρίσταται µε λίστα γειτονικότητας, ένας αποδοτικός
αλγόριθµος είναι ο ακόλουθος: Για κάθε κορυφή u, πρόσθεσε στη λίστα των γειτό-
νων της u τις λίστες των γειτόνων όλων των κορυφών v που είναι γειτονικές της u,
(v, u) Œ E. Ο αλγόριθµος αυτός µπορεί να υλοποιηθεί σε χρόνο Ο(|V||E|).
Στην περίπτωση που το G αναπαρίσταται µε πίνακα γειτονικότητας, ένα στοιχείο
A[v, u] του πίνακα είναι µονάδα όταν υπάρχει µονοπάτι µήκους 1 (δηλαδή ακµή)
από τη v στη u. Στο τετράγωνο του πίνακα γειτονικότητας του G, το στοιχείο A2[v,
u] δηλώνει τον αριθµό των µονοπατιών µήκους 2 από τη v στη u. Για αυτό το λόγο,
υπάρχουν περιπτώσεις που A2[v, v] > 0, αφού το στοιχείο Α2[v, v] δηλώνει τον αριθ-
µό των κύκλων µήκους ακριβώς 2 που περιέχουν τη v. Εποµένως, ο πίνακας γειτο-
νικότητας του G2 µπορεί να υπολογιστεί από τον πίνακα (Α2 + Α), θέτοντας όλα τα
στοιχεία της διαγωνίου του στην τιµή 0 και όλα τα υπόλοιπα στοιχεία του, που είναι
µεγαλύτερα της µονάδας, στην τιµή 1. Χρησιµοποιώντας τον αλγόριθµο του Strassen
για τον υπολογισµό του A2, ο υπολογισµός του πίνακα γειτονικότητας του G2 µπο-
ρεί να γίνει σε χρόνο O(|V|log 7).

6.2
Ένα γράφηµα G(V, E) είναι διµερές αν και µόνο αν µόνο αν οι κορυφές µπορούν να
χρωµατιστούν µε δύο χρώµατα (έστω πράσινο και κόκκινο), µε τρόπο ώστε να µην
υπάρχει ακµή µεταξύ κορυφών του ίδιου χρώµατος (επίσης, βλ. Άσκηση Αυτοαξιο-
λόγησης 5.4). Προφανώς, οι χρωµατικές κλάσεις αντιστοιχούν στα σύνολα V1 και
V2 του ορισµού. Υποθέτουµε ότι το γράφηµα G(V, E) είναι µη κατευθυντικό. Ο παρα-
κάτω αλγόριθµος µπορεί εύκολα να γενικευθεί για κατευθυντικά γραφήµατα.
Ο αλγόριθµος συνίσταται στη εκτέλεση ενός Ψαξίµατος Πρώτα σε Πλάτος από µία
οποιαδήποτε κορυφή s Œ V. Μετά το τέλος του ΨΠΠ, οι κορυφές που βρίσκονται σε
µονή απόσταση από την s (δηλαδή έχουν ανακαλυφθεί στην επανάληψη k, όπου k
µονός αριθµός) χρωµατίζονται πράσινες, και οι υπόλοιπες κορυφές χρωµατίζονται
κόκκινες. Ενόσω υπάρχουν κορυφές που δεν έχουν προσπελαστεί / χρωµατιστεί, σβή-
νουµε από το γράφηµα τις χρωµατισµένες κορυφές, διαλέγουµε µία νέα αρχική κορυ-
φή s¢ και επαναλαµβάνουµε την παραπάνω διαδικασία στο γράφηµα που ορίζεται
από τις µη χρωµατισµένες κορυφές. Όταν όλες οι κορυφές χρωµατιστούν, ελέγχου-
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 211

µε αν όλες οι ακµές έχουν άκρα διαφορετικού χρώµατος. Ο χρόνος εκτέλεσης του


αλγόριθµου καθορίζεται από το χρόνο εκτέλεσης του ΨΠΠ και είναι Ο(|V| + |Ε|).

6.3
Έστω ένα κατευθυντικό γράφηµα G(V, E) και µία πίσω ακµή (u, v). Συνεπώς, υπάρ-
χει ένα µονοπάτι από την κορυφή v στη u που χρησιµοποιεί ακµές του δέντρου, το
οποίο συµπληρώνεται σε κύκλο από την ακµή (u, v).
Αντίστροφα, αν το γράφηµα G(V, E) περιέχει έναν κύκλο c. Έστω v η πρώτη κορυ-
φή του c που ανακαλύπτεται από το ΨΠΒ και, έστω (u, v) η ακµή του κύκλου c που
καταλήγει στη v. Η κορυφή u θα πρέπει να ενταχθεί στο υποδέντρο του ΨΠΒ µε ρίζα
τη v, γιατί υπάρχει µονοπάτι από τη v στην u, το οποίο αποτελεί µέρος του κύκλου
c, και όταν η v ανακαλύπτεται, όλες οι κορυφές του c είναι λευκές. Εποµένως, η (u,
v) θα γίνει µία πίσω ακµή.

6.4
Αρχικά, θα αποδείξουµε ότι δύο κορυφές u, v Œ V ανήκουν στην ίδια συνεκτική συνι-
στώσα C του G αν και µόνο αν βρίσκονται στο ίδιο δέντρο του ΨΠΒ(G).
Έστω ότι οι u και v ανήκουν στην ίδια συνεκτική συνιστώσα C. Τότε, οποιοδήποτε
µονοπάτι από τη u στη v διέρχεται µόνο από κορυφές της C, επειδή κάθε κορυφή,
που βρίσκεται σε κάποιο µονοπάτι από τη u στη v, είναι προσπελάσιµη τόσο από τη
u, όσο και από τη v. Έστω r Œ C η πρώτη κορυφή της C που ανακαλύπτεται από το
ΨΠΒ(G). Αφού όλες οι υπόλοιπες κορυφές της C είναι προσπελάσιµες από την r και
έχουν λευκό χρώµα κατά τη χρονική στιγµή d[r], κάθε κορυφή της C πρέπει να ανα-
καλυφθεί από το ΨΠΒ πριν τη χρονική στιγµή f[r]. ∆ηλαδή, οι κορυφές u, v Œ C
ανήκουν στο δέντρο του ΨΠΒ(G) µε ρίζα την r.
Αντίστροφα, κάθε δύο κορυφές u, v που ανήκουν στο ίδιο δέντρο του ΨΠΒ(G), είναι
προσπελάσιµες η µία από την άλλη. Εποµένως, ανήκουν και στην ίδια συνεκτική
συνιστώσα του G.
Αφού η ένταξη στο ίδιο δέντρο του ΨΠΒ είναι ικανή και αναγκαία συνθήκη για να
ανήκουν δύο κορυφές στην ίδια συνεκτική συνιστώσα, το ΨΠΒ δεν µπορεί να εντά-
ξει κορυφές από διαφορετικές συνεκτικές συνιστώσες στο ίδιο δέντρο. Συνεπώς, το
ΨΠΒ δεν µπορεί να παράγει ούτε λιγότερα, αλλά ούτε και περισσότερα δέντρα από
τις συνεκτικές συνιστώσες.
Για τον υπολογισµό της συνεκτικής συνιστώσας στην οποία εντάσσεται κάθε κορυ-
φή, διατηρούµε µία µεταβλητή c σφαιρικής εµβέλειας που αρχικοποιείται στο 0. Ο
212 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

ψευδοκώδικας της βασικής επανάληψης στη διαδικασία ΨΠΒ πρέπει να µεταβληθεί


ως εξής:
for all v ΠV do
if color[v] = §∂À∫√ then
c ¨ c + 1; 涵 – ∂¶π™∫∂æ∏(v);
Επίσης, πρέπει η πρώτη γραµµή της διαδικασίας ΨΠΒ – ΕΠΙΣΚΕΨΗ να συµπληρωθεί
µε την ανάθεση cc[v] § c;
Αυτές οι µεταβολές αναθέτουν, σε όλες τις κορυφές v που βρίσκονται στο ίδιο δέντρο
του ΨΠΒ(G), τον ίδιο αριθµό c στο πεδίο cc[v]. Εποµένως, κάθε ζευγάρι κορυφών u,
v, έχει cc[v] = cc[u] αν και µόνο αν βρίσκεται στο ίδιο δέντρο του ΨΠΒ(G), το οποίο
συµβαίνει αν και µόνο αν οι u και v ανήκουν στην ίδια συνεκτική συνιστώσα του G.

7.1
(1) Έστω µια γλώσσα L που αποφασίζεται από µία DTM Μ = (Q, Σ, δ, q0) µε µία
ταινία. Μπορούµε να ορίσουµε µια DTM Μ¢ που αποδέχεται την L, τροποποιώ-
ντας τη συνάρτηση µετάβασης δ, ώστε για κάθε ζευγάρι (q, σ), q Œ Q – F, σ Œ
Σ, που κάνει την Μ να µεταβεί στην κατάσταση ΟΧΙ, η Μ¢ να παραµένει στην
κατάσταση q (π.χ. δ¢(q, σ) = (q, σ, S)).

(2) Αν εναλλάξουµε αµοιβαία τις καταστάσεις ΝΑΙ και ΟΧΙ µιας DTM Μ που απο-
φασίζει την L, κατασκευάζουµε µία DTM Μ¢ που αποφασίζει το συµπλήρωµα
L της L.

(3) Οι προτάσεις (1) και (2) αποδεικνύουν τη µία κατεύθυνση. Αντίστροφα, έστω
δύο DTM Μ και Μ¢ που αποδέχονται την L και την L , αντίστοιχα. Κάθε x Œ Σ*,
ανήκει είτε στην L είτε στην L . Εποµένως, για κάθε είσοδο x, µία από τις Μ και
Μ¢ θα τερµατίζει στην κατάσταση ΝΑΙ. Για κάθε είσοδο x, µπορούµε να εκτε-
λούµε τις Μ και Μ¢ παράλληλα (δηλαδή, κάθε βήµα της Μ ακολουθείται από ένα
βήµα της Μ¢), µε το x να γίνεται αποδεκτό όταν Μ(x) = ΝΑΙ, και να απορρίπτε-
ται όταν Μ¢(x) = ΝΑΙ.

7.2
Θα κατασκευάσουµε µία DTM M¢ που αποφασίζει την L σε χρόνο Ο(t(n)). Με είσο-
δο x, η Μ¢ προσοµοιώνει την DTM Mt που αντιστοιχεί στη συνάρτηση περιορισµού
t(n), γράφοντας το αποτέλεσµα της Μt σε χωριστή ταινία εργασίας. Στη συνέχεια, η
Μ¢ προσοµοιώνει τη λειτουργία της Μ µε είσοδο x για t(|x|) βήµατα. Για να µετρή-
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 213

σει τον αριθµό των βηµάτων, η Μ¢ σβήνει ένα σύµβολο 1 από την ταινία που γρά-
φτηκε η έξοδος της Μt µετά από κάθε βήµα της Μ. Η Μ¢ αποδέχεται το x αν Μ(x) =
ΝΑΙ πριν τελειώσουν τα σύµβολα 1 από την ταινία εξόδου της Μt. Αν το µήκος του
υπολογισµού της Μ ξεπεράσει τα t(|x|) βήµατα, χωρίς η Μ να αποδεχτεί το x, η Μ¢
τερµατίζει απορρίπτοντας το x. Η συµβολοσειρά x Œ L αν και µόνο αν Μ(x) = ΝΑΙ
µετά από το πολύ t(n) βήµατα. Εποµένως, η Μ¢ αποδέχεται κάθε x Œ L και απορρί-
πτει κάθε x œ L. Επίσης, η παραπάνω προσοµοίωση µπορεί να πραγµατοποιηθεί σε
χρόνο Ο(t(|x|).

7.3
Είναι φανερό ότι αν t1(n) είναι ένα οποιοδήποτε πολυώνυµο και t2(n) = 2n, ισχύει
t2(n) = ω(t1(n) log t1(n)). Εποµένως, εφαρµόζοντας το Θεώρηµα 7.1, συµπεραίνου-
µε ότι η κλάση P είναι γνήσιο υποσύνολο της κλάσης DTIME[2n] και, άρα, της
κλάσης EXP.

7.4
Το πρόβληµα του Πολλαπλασιασµού Ακολουθίας Πινάκων λύνεται σε χρόνο Ο(n3),
όπου n ο αριθµός των πινάκων, µε την υπόθεση ότι το διάνυσµα των διαστάσεων
αναπαρίσταται σε χώρο Ο(n), και οι αριθµητικές πράξεις µεταξύ των στοιχείων του
διανύσµατος διαστάσεων εκτελούνται σε σταθερό χρόνο. Άρα, ανήκει στην κλάση
DTIME[n3] και, φυσικά, στην κλάση P.
Το πρόβληµα της Μεγαλύτερης Κοινής Υποακολουθίας λύνεται σε χρόνο O(n2),
όπου n το µήκος της µεγαλύτερης από τις δύο ακολουθίες Χ και Υ, από έναν αλγό-
ριθµο δυναµικού προγραµµατισµού. Εποµένως, ανήκει στην κλάση DTIME[n2] και,
φυσικά, στην κλάση P.

7.5
Έστω δύο γλώσσες L1, L2 Œ P και Μ1, Μ2 δύο DTM πολυωνυµικού χρόνου που απο-
φασίζουν αυτές τις γλώσσες. Η ένωση των L1 και L2 είναι L1 » L2 = {x Œ Σ*: x Œ L1
ή x Œ L2}. Για κάθε είσοδο x, εκτελούµε τις M1(x) και Μ2(x), και απορρίπτουµε το x
αν και µόνο αν M1(x) = ΟΧΙ και M2(x) = ΟΧΙ. Αντίστοιχα, L1 « L2 = {x Œ Σ*: x Œ L1
και x Œ L2}. Για κάθε x Œ Σ*, εκτελούµε τις Μ1(x) και M2(x), και αποδεχόµαστε το x
αν και µόνο αν M1(x) = ΝΑΙ και M2(x) = ΝΑΙ. Όσον αφορά στο συµπλήρωµα της L1,
για κάθε x Œ Σ*, εκτελούµε την M1(x) και αποδεχόµαστε το x, αν και µόνο αν Μ1(x)
= ΟΧΙ. Αφού η Μ1 και η Μ2 λειτουργούν σε πολυωνυµικό χρόνο, το ίδιο συµβαίνει
και µε όλους τους παραπάνω συνδυασµούς τους.
214 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

7.6
Έστω ένα στιγµιότυπο του προβλήµατος του διµερούς γραφήµατος, δηλαδή ένα γρά-
φηµα G(V, E). Θα περιγράψουµε έναν αλγόριθµο πολυωνυµικού χρόνου, ο οποίος
υπολογίζει µία λογική πρόταση φG, η οποία βρίσκεται σε ΣΚΜ µε 2 άτοµα ανά όρο
και είναι ικανοποιήσιµη, αν και µόνο αν το γράφηµα G είναι διµερές.
Έστω V = {1, 2, …, n}. Σε κάθε κορυφή i Œ V του G αντιστοιχούµε µία λογική µετα-
βλητή xi, και για κάθε ακµή (i, j) Œ E, προσθέτουµε στη φG τους όρους (ÿxi Ú xj) Ÿ
(xi Ú ÿxj), που αντιστοιχούν στη λογική πρόταση (xi ≈ xj). ∆ηλαδή, για να είναι η φG
ικανοποιήσιµη πρέπει, για κάθε δύο κορυφές που συνδέονται µε ακµή, ακριβώς µία
από τις δύο αντίστοιχες λογικές µεταβλητές µπορεί να έχει την τιµή TRUE. Ένα παρά-
δειγµα της παραπάνω κατασκευής φαίνεται στο Σχήµα 7.3.

4 (ÿx1Úx4)Ÿ(x1Úÿx4)Ÿ
(ÿx2Úx4)Ÿ(x2Úÿx4)Ÿ
2
™¯‹Ì· 7.3 (ÿx3Úx4)Ÿ(x3Úÿx4)Ÿ
Παράδειγµα
5 (ÿx2Úx5)Ÿ(x2Úÿx5)
κατασκευής
της λογικής
πρότασης φG. 3

Έστω ότι το G(V, E) είναι διµερές, και V1, V2 τα δύο σύνολα στα οποία διαχωρίζο-
νται οι κορυφές του. Η ανάθεση xi ¨ TRUE, αν i Œ V1 και xj ¨ FALSE, αν j Œ V2, ικα-
νοποιεί την η φG, αφού δεν υπάρχει ακµή (i, j), µε i Œ V1 και j Œ V1 ή i Œ V2 και j Œ
V2. Αντίστροφα, αν η φG είναι ικανοποιήσιµη, έστω Α : {x1, x2, …, xn} a {0, 1} µια
ανάθεση τιµών στις λογικές µεταβλητές που ικανοποιεί την φG. Θέτουµε V1 = {i Œ
V: A(xi) = TRUE } και V2 = {j Œ V : A(xj) = FALSE }. Από την κατασκευή της λογικής
πρότασης, αφού η ανάθεση Α ικανοποιεί την φG, δεν µπορεί να υπάρχουν ακµές µετα-
ξύ των κορυφών του V1 ή του V2. Εποµένως, το G(V, E) είναι διµερές.

8.1
Έστω δύο γλώσσες L1, L2 Œ NP. Εξ¢ ορισµού, υπάρχουν NDTM Ν1, Ν2 πολυωνυµι-
κού χρόνου που αποφασίζουν τις L1 και L2, αντίστοιχα. Είναι L1 » L2 = {x Œ Σ* : x
Œ L1 ή x Œ L2 }. Για να αποφασίσουµε αν κάποιο x ανήκει ή όχι στη L1 » L2, αρχι-
κά εκτελούµε τη N1(x) και αποδεχόµαστε το x αν η Ν1 το αποδέχεται. Αν όλοι οι κλά-
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 215

δοι υπολογισµού της Ν1(x) καταλήγουν σε απόρριψη, εκτελούµε τη N2(x) και απο-
δεχόµαστε το x µόνο αν η N2 το αποδέχεται. Αν και όλοι οι κλάδοι της Ν2 καταλή-
γουν σε απόρριψη, απορρίπτουµε το x.
Αντίστοιχα, για τη L1 « L2 = { x Œ Σ* : x Œ L1 και x Œ L2 }, εκτελούµε τη N1(x), και
από κάθε υπολογισµό αποδοχής της Ν1, εκτελούµε τη Ν2(x). Αποδεχόµαστε το x µόνο
αν τόσο η N1 όσο και η N2 αποδέχονται το x.
Όσον αφορά στην πολυωνυµική αναγωγή, αφού υπάρχει µετασχηµατισµός R, τέτοι-
ος, ώστε ένα x Œ L1 αν και µόνο αν R(x) Œ L2, µπορούµε για κάθε x, να υπολογίσουµε
σε πολυωνυµικό ντετερµινιστικό χρόνο το R(x) και, στη συνέχεια, να αποφασίσου-
µε σε πολυωνυµικό µη ντετερµινιστικό χρόνο (γιατί L2 Œ NP) αν R(x) Œ L2, εποµέ-
νως, αν x Œ L1. Η διαδικασία χρειάζεται πολυωνυµικό µη ντετερµινιστικό χρόνο και,
συνεπώς, L1 Œ NP.

8.2
Η πρόταση (1) αποτελεί ανοικτό πρόβληµα γιατί είναι αληθής αν υποθέσουµε ότι P
= NP, αφού τότε κάθε γλώσσα στο NP θα ανήκει και στο P, αλλά είναι ψευδής αν
υποθέσουµε ότι P π NP (π.χ. το πρόβληµα της Προσπελασιµότητας ανήκει στο P,
ανάγεται πολυωνυµικά σε κάθε NP – πλήρες πρόβληµα, αλλά κανένα NP – πλήρες
πρόβληµα δεν ανήκει στο P, εφόσον P π NP).
Η πρόταση (2) είναι αληθής, γιατί εκφράζει την κλειστότητα του P ως προς την
πολυωνυµική αναγωγή (∆ραστηριότητα 7.9).
Η πρόταση (3) είναι αληθής και αποδεικνύεται µε απαγωγή σε άτοπο. Έστω ότι η L1
είναι NP – πλήρης. Τότε, επειδή η πολυωνυµική αναγωγή είναι µεταβατική (∆ρα-
στηριότητα 7.8) και L1 µ L2, θα έπρεπε και η L2 να είναι NP – πλήρης, το οποίο έχου-
µε υποθέσει ότι δεν ισχύει.
Η πρόταση (4) είναι αληθής, γιατί αφού L2 Œ NP (υποθέτουµε ότι η L2 είναι NP πλή-
ρης) η L1 είναι NP – πλήρης, πρέπει η L2 να ανάγεται πολυωνυµικά στην L1, όπως
συµβαίνει και µε κάθε άλλη γλώσσα στο NP.

8.3
Κάθε γράφηµα εισόδου, του οποίου όλες οι κορυφές έχουν βαθµό 2, αποτελείται από
έναν ή περισσότερους, ξένους µεταξύ τους απλούς κύκλους. Χωρίς βλάβη της γενι-
κότητας µπορούµε να θεωρήσουµε ότι το γράφηµα εισόδου G(V, E) είναι συνεκτι-
κό, δηλαδή αποτελείται από έναν απλό κύκλο, διαφορετικά µπορούµε να αντιµετω-
πίσουµε κάθε κύκλο ξεχωριστά.
216 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

Ένας απλός αλγόριθµος γραµµικού χρόνου είναι, ξεκινώντας από µια οποιαδήποτε
κορυφή, να εξετάσουµε όλες τις κορυφές µε τη σειρά που εµφανίζονται στον κύκλο.
Κάθε κορυφή περιλαµβάνεται στο σύνολο ανεξαρτησίας αν καµία από τις γειτονι-
κές της δεν έχει ήδη περιληφθεί. Με αυτό τον τρόπο υπολογίζουµε ένα σύνολο ανε-

ξαρτησίας µεγέθους Î| V |û το οποίο είναι µέγιστο.


2
Η απάντηση στο ερώτηµα αν το γράφηµα εισόδου G(V, E) έχει ένα σύνολο ανεξαρ-

τησίας µεγέθους Κ δίνεται συγκρίνοντας το φράγµα Κ µε την ποσότητα Î| V |û .


2
Παρατηρείστε ότι µπορούµε να απαντήσουµε σωστά σε σταθερό χρόνο (δηλαδή χωρίς

προηγουµένως να εκτελέσουµε τον αλγόριθµο, απλώς συγκρίνοντας τα Κ και Î| V |û .


2
8.4
Το πρόβληµα της Μέγιστης Κλίκας ανήκει στο NP, γιατί µια NDTM πολυωνυµικού
χρόνου µπορεί να «µαντέψει» ένα σύνολο κορυφών και να επιβεβαιώσει ότι πρό-
κειται για µία κλίκα µεγέθους, τουλάχιστον Κ.

Το πρόβληµα της Μέγιστης Κλίκας στο γράφηµα G(V, E) είναι ίδιο µε το πρόβλη-
µα του Μέγιστου Συνόλου Ανεξαρτησίας στο συµπληρωµατικό γράφηµα G (V , E ) .
Το συµπληρωµατικό γράφηµα G (V , E ) ενός γραφήµατος G(V, E) έχει το ίδιο σύνο-
λο κορυφών V, ενώ δύο κορυφές συνδέονται µε ακµή αν και µόνο αν δεν συνδέο-
νται µε ακµή στο G, δηλαδή E = {(u, v ) ŒV ¥ V :(u, v ) œ E } .
Εποµένως, ένα σύνολο κορυφών V¢ στο γράφηµα G είναι κλίκα αν και µόνο αν το
V¢ είναι σύνολο ανεξαρτησίας στο συµπληρωµατικό γράφηµα G . Συνεπώς, το γρά-
φηµα G έχει µία κλίκα µεγέθους τουλάχιστον Κ, αν και µόνο αν το γράφηµα G έχει
ένα σύνολο ανεξαρτησίας µεγέθους, τουλάχιστον Κ. Άρα, το πρόβληµα της Μέγι-
στης Κλίκας είναι NP – πλήρες.
∞·ÓÙ‹ÛÂȘ ¢Ú·ÛÙËÚÈÔًوÓ

1.1
procedure russe_II(A, B)
X ¨ A; Y ¨ B; product ¨ 0;
while X >= 1 do
if X ÂÚÈÙÙfi˜ then product ¨ Y;
X ¨ X div 2;
Y ¨ Y + Y;
return product;
Η νέα κωδικοποίηση εκτελείται ταχύτερα, γιατί σε µία επανάληψη πραγµατοποιεί
τόσο τους αναγκαίους υποδιπλασιασµούς του πολλαπλασιαστή και διπλασιασµούς
του πολλαπλασιαστέου, όσο και τις προσθέσεις. Επίσης, η νέα κωδικοποίηση χρη-
σιµοποιεί µόλις 3 θέσεις µνήµης (µεταβλητές X, Y, product).

1.2
procedure linear_search(A[1,...,n], x)
i ¨ 1;
while i <= n do
if A[i] = x then return i;
i ¨ i + 1;
return 0;

1.3
Για να βρούµε την απάντηση υπολογίζουµε τις τιµές των δύο συναρτήσεων για δια-
φορετικές τιµές του n. Στην αρχή, διπλασιάζουµε την τιµή του n για να εντοπίσουµε
γρήγορα τα όρια ενός διαστήµατος µέσα στο οποίο η ποσότητα (100n2 – 2n) γίνεται
από θετική αρνητική. Στη συνέχεια, εντοπίζουµε την αναζήτηση σε αυτό το διάστηµα.

n 2n 100n2
2 4 400
4 16 1600
8 256 6400
218 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

16 65536 25600
12 4096 14400
14 16384 19600
15 32768 22500

1.4
524613Æ254613 t2 = 2
254613Æ245613 t3 = 2
245613Æ245613 t4 = 1
245613Æ125463 t5 = 5
124563Æ123456 t6 = 4

1 23456Æ123456 t2 = 1
123456Æ123456 t3 = 1
123456Æ123456 t4 = 1
123456Æ123456 t5 = 1
123456Æ123456 t6 = 1

6 54321Æ564321 t2 = 2
564321Æ456321 t3 = 3
456321Æ345621 t4 = 4
345621Æ234561 t5 = 5
134561Æ123456 t6 = 6

1.5
Insertion Sort Αλγόριθµος B
103 0,02 sec 0,5 sec
104 2 sec 7 sec
105 3 min, 20 sec 1 min, 23 sec
106 5 h, 33 min, 20 sec 16 min, 37 sec
107 555 h, 33 min, 20 sec 3 h, 13 min, 47 sec
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 219

2.1
Έστω ότι f(n) = O(g(n)) και f(n) = Ω(g(n)). Από τους ορισµούς των συµβολισµών Ο
και Ω, υπάρχουν σταθερές co και no, και cω και nω, τέτοιες ώστε:
0 £ f(n) £ co g(n), για όλα τα n ≥ no, και 0 £ cω g(n) £ f(n), για όλα τα n ≥ nω.
Θέτοντας nΘ = max(no, nω), έχουµε ότι 0 £ co g(n) £ f(n) £ cω g(n), για όλα τα n ≥ nΘ
και, εποµένως, f(n) = Θ(g(n)).
Αντίστροφα, αν f(n) = Θ(g(n)), τότε από τον ορισµό του συµβολισµού Θ, υπάρχουν
σταθερές c1, c2, και n0, τέτοιες ώστε 0 £ c1 g(n) £ f(n) £ c2 g(n), για όλα τα n ≥ n0.
Εποµένως, για όλα τα n ≥ n0, είναι 0 £ f(n) £ c2 g(n), οπότε f(n) = O(g(n)), και 0 £ c1
g(n) £ f(n), οπότε f(n) = Ω(g(n)).

2.2
1 2 3 4

(α). Όχι. Όχι. Ναι. Όχι.


(f(n) = n, (f(n) = n, (Εξ’ ορισµού του (Εξ’ ορισµού του
g(n) =n logn, n = 1) g(n) =n logn, n =4) συµβολισµού Ω) συµβολισµού Ω)

(β). Όχι. Όχι. Ναι. Όχι.


(f(n) = n, (f(n) = n, (Εξ’ ορισµού του (Εξ’ ορισµού του
g(n) =n logn, n = 1) g(n) =n logn, n =4) συµβολισµού Θ) συµβολισµού Θ)

(γ). Όχι. Όχι. Όχι. Όχι.


(f(n) = n, (f(n) = n, (f(n) = n, (f(n) = n,
g(n) =n logn, n = 1) g(n) =n logn, n =4) g(n) = n). g(n) = n).

(δ). Όχι. Όχι. Όχι. Όχι.


(f(n) = n, (f(n) = n, (f(n) = n, (f(n) = n,
g(n) =n) g(n) =n) g(n) = n). g(n) = n).

2.3

 Â
n n
Ο ισχυρισµός (n - i + 1) = i προφανώς ισχύει για n = 1. Για να δείξουµε
i =1 i =1

ότι ισχύει για κάθε τιµή του n, υποθέτουµε ότι ισχύει για ένα συγκεκριµένο n, και
θα αποδείξουµε ότι ισχύει για n + 1. Πράγµατι,
n +1 n n n n +1

 (n - i + 1) = 1 +  [(n + 1) - i + 1] =1 + n +  (n - i + 1) = n + 1 +  i =  i ,
i =1 i =1 i =1 i =1 i =1
220 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

όπου στην πρώτη ισότητα βγάλαµε εκτός αθροίσµατος την περίπτωση i = n + 1, στη δεύ-
τερη ισότητα βγάλαµε εκτός αθροίσµατος µία µονάδα για καθένα από τους n όρους [(n
+ 1) – i + 1] (οι οποίοι έγιναν n – i + 1), στην τρίτη ισότητα εφαρµόσαµε την επαγωγική
υπόθεση και στην τέταρτη ισότητα βάλαµε στο άθροισµα την περίπτωση i = n + 1.

2.4
Ο ισχυρισµός ισχύει για n = 1. Υποθέτουµε ότι ισχύει για n, και θα δείξουµε ότι ισχύ-
ει για n + 1. Πράγµατι,
n +1 n

Âi
i =1
2
= (n + 1) +
2
Âi i =1
2

n(n + 1)( 2n + 1)
= (n + 1)2 +
6
(n + 1)( 2n + 7n + 6 ) (n + 1)[(n + 1) + 1][ 2(n + 1) + 1]
2
= =
6 6
2.5
Για κάθε i > 1, έχουµε 1/ i2 < 1 / i (i – 1). Συνεπώς,

Ê 1 1ˆ
n n n n

   Â
1 1 1
=1+ £1+ =1+ Á - ˜
i =1
i2 i =2
i2 i =2
i(i - 1) i =2
Ë i -1 i ¯

Ê 1 1ˆ
n

Το άθροισµα  ÁË i - 1 - i ˜¯ ανήκει στην κατηγορία των τηλεσκοπικών αθροισµάτων.


i =2

Â
n
Ένα τηλεσκοπικό άθροισµα έχει τη µορφή ( ai - ai +1 ) . Το αποτέλεσµα αυτού
i =1

του αθροίσµατος είναι α1 – αn + 1, επειδή οι όροι α2, α3, … αn προστίθενται και αφαι-
ρούνται ακριβώς µία φορά ο καθένας.

Ê 1 1ˆ
n n

 Âi
1 1 1
Εποµένως, Á - ˜ = 1 - , και £ 2- = O (1) .
i =2
Ë i -1 i ¯ n i =1
2
n
2.6
merge(A, p, q, r)
array X[p, ..., r]
X[p, ..., q] ¨ A[p, ..., q];
X[q + 1, ..., r] ¨ A[q + 1, ..., r];
i ¨ p; j ¨ q + 1;
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 221

for k ¨ p to r do
if i > q then
A[k] ¨ X[j]; j ¨ j + 1;
if j > r then
A[k] ¨ X[i]; i ¨ i + 1;
if (i £ q) and (j £ r) and (X[i] > X[j]) then
A[k] ¨ X[j]; j ¨ j + 1;
else
A[k] ¨ X[i]; i ¨ i + 1;
Στον παραπάνω ψευδοκώδικα, χρησιµοποιούµε τον πίνακα x σαν περιοχή προσωρι-
νής αποθήκευσης, και αντιγράφουµε τα στοιχεία των υποπινάκων A[p, …, q] και A[q
+ 1, …, r] στις αντίστοιχες θέσεις του πίνακα X. Οι µεταβλητές i και j δείχνουν κάθε
φορά στα µικρότερα στοιχεία των υποπινάκων Χ[p, …, q] και Χ[q + 1, …, r] τα οποία
δεν έχουν τοποθετηθεί ακόµα στον πίνακα Α[p, …, r], ενώ η µεταβλητή k δείχνει
πόσα στοιχεία έχουν τοποθετηθεί στον συνενωµένο πίνακα. Σε κάθε επανάληψη,
τοποθετούµε το µικρότερο από τα στοιχεία X[i] (p £ i £ q) και X[j] (q + 1 £ j £ r)
στον συνενωµένο πίνακα Α, ενώ όταν τελειώσουν τα στοιχεία κάποιου από τους υπο-
πίνακες, γεµίζουµε τον πίνακα Α µε τα υπόλοιπα στοιχεία του άλλου υποπίνακα.
Επειδή οι υποπίνακες X[p, …, q] και X[q + 1, …, r] είναι διατεταγµένοι σε αύξου-
σα σειρά, ο πίνακας A[p, …, r] που προκύπτει σαν αποτέλεσµα τη συνένωσης, είναι
επίσης διατεταγµένος σε αύξουσα σειρά.
Όσον αφορά στον χρόνο εκτέλεσης της διαδικασίας merge, η αντιγραφή των υποπι-
νάκων στον πίνακα X κοστίζει γραµµικό χρόνο, ενώ κάθε επανάληψη του βρόγχου
for κοστίζει σταθερό χρόνο. Επειδή ο βρόγχος for εκτελείται ακριβώς r – p + 1
φορές, ο χρόνος εκτέλεσης της διαδικασίας merge είναι όντως γραµµικός στο µέγε-
θος του πίνακα Α που προκύπτει από τη συνένωση των δύο υποπινάκων.

2.7
binary_search(array A[p,...,n], x)
m ¨ (p + n) / 2;
if A[m] = x then return(m);
if n = 1 then return(0); {Το x δεν βρέθηκε}
if A[m] < x then binary_search(A[m + 1, ..., n], x);
else binary_search(A[1, ..., m], x);
Έστω T(n) είναι ο χρόνος εκτέλεσης χειρότερης περίπτωσης για δυαδική αναζήτη-
ση σε έναν πίνακα n στοιχείων. Το T(n) είναι ίσο µε το άθροισµα του χρόνου για τον
222 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

υπολογισµό του m, τη σύγκριση του A[m] µε το x, και την αναδροµική κλίση της
binary_search σε έναν από τους δύο υποπίνακες, οι οποίοι έχουν το πολύ n/2 στοι-
χεία. (Η χειρότερη περίπτωση της binary search συµβαίνει όταν το x δεν υπάρχει
στον πίνακα Α). Ο χρόνος για τον υπολογισµό του m και τη σύγκριση των A[m] και
x είναι σταθερός, ενώ ο χρόνος για την αναδροµική κλήση της binary_search είναι
το πολύ T(n/2). Όσον αφορά στις αρχικές συνθήκες της αναδροµικής εξίσωσης, όταν
ο πίνακας εισόδου περιέχει µόνο ένα στοιχείο, η αναζήτηση γίνεται σε σταθερό
χρόνο. Εποµένως, ο χρόνος εκτέλεσης χειρότερης περίπτωσης για την δυαδική ανα-
ζήτηση δίνεται από την εξίσωση:

ÏQ (1) αν = 1.
T (n ) = Ì
ÓT (n / 2 ) + Q (1) αν > 1,
2.8
Το δέντρο της αναδροµής για την αναδροµική εξίσωση T (n ) = 4T ( În / 2û ) + n φαί-

νεται στο Σχήµα 2.4. Βλέπουµε ότι η συνεισφορά του επιπέδου i του δέντρου της
αναδροµής (η ρίζα βρίσκεται στο επίπεδο 0) είναι ίση µε n2i. Επιπλέον, το δέντρο
έχει ύψος log n (log n + 1 επίπεδα). Εποµένως,

log n log n
T (n ) =  2 n = n 2 £ 2n ,
i =0
i

i =0
i 2

όπου η τελευταία ανισότητα προκύπτει από την Άσκηση Αυτοαξιολόγησης 2.4. Πράγ-
µατι, αν θεωρήσουµε αρχική συνθήκη Τ(1) = 1 και σαν τιµές του n µόνο ακέραιες δυνά-
µεις του 2, µε µαθηµατική επαγωγή µπορούµε να αποδείξουµε ότι T(n) = n(2n – 1).

n n

n/2 n/2 n/2 n/2 2n

log n ¥4 ¥4 ¥4 ¥4
+

n/4 n/4 n/4 n/4 4n


™¯‹Ì· 2.4
¥4 ¥4 ¥4 ¥4 +
Το δέντρο της
...

...

αναδροµής για την


εξίσωση T(n) =
4T(n/2) + n. Σύνολο: Θ(n2)
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 223

2.9
Έχουµε δει ότι ο χρόνος εκτέλεσης χειρότερης περίπτωσης της δυαδικής αναζήτη-
σης περιγράφεται από την αναδροµική εξίσωση T(n) = T(n/2) + Θ(1), Τ(1) = Θ(1).
Επίσης, στην Άσκηση Αυτοαξιολόγησης 2.4 είδαµε µια παρόµοια αναδροµική εξί-
σωση, η οποία είχε λύση T¢(n) = log n + 1. Υποθέτουµε λοιπόν ότι η λύση της ανα-
δροµικής εξίσωσης που δίνει το χρόνο εκτέλεσης χειρότερης περίπτωσης της δυα-
δικής αναζήτησης είναι T(n) = Θ(log n).
Αν και log 1 = 0, για µικρές τιµές του n που ξεπερνούν τη µονάδα (n = 2, 3, 4, κοκ.)
η λύση Θ(log n) επαληθεύει την αναδροµική εξίσωση. Έστω c1, c2 οι σταθερές που
κρύβει ο συµβολισµός Θ(1) στον ορισµό της αναδροµικής εξίσωσης. Υποθέτουµε
ότι c1 log(n/2) £ T(n/2) £ c2 log(n/2) και, µε τη µέθοδο της αντικατάστασης, θα δεί-
ξουµε ότι c1 log n £ T(n) £ c2 log n. Πράγµατι:

n n
T (n ) £ c2 log + c2 T (n ) ≥ c1 log + c1
2 και 2
£ c2 (log n - 1) + c2 ≥ c1 (log n - 1) + c1
= c2 log n , = c1 log n .

Εποµένως, Τ(n) = Θ(log n).

2.10

n log n n log n
+

(n/2)log(n/2) (n/2)log(n/2) n log(n/2)

log n +

(n/4)log(n/4) ... (n/4)log(n/4) n log(n/4)


™¯‹Ì· 2.5
+
Το δέντρο της ανα-
...

...

δροµής για την


εξίσωση T(n) =
Σύνολο: Θ(n log2n) 2T(n/2) + n log n.

Για να αποκτήσουµε µια ασυµπτωτική εκτίµηση για τη λύση της αναδροµικής εξί-
σωσης, σχεδιάζουµε το δέντρο της αναδροµής (Σχήµα 2.5).
224 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

Από το δέντρο της αναδροµής του Σχήµατος 2.5 συµπεραίνουµε ότι:


log n
Ê nˆ
T (n ) =  n logÁË 2 ˜¯
i =0
i

Èlog n log n ù

Â
= n Í log n -
ÍÎ i = 0

i =0 ú
Â
û
È log n(log n + 1) ù
= n Í log n(log n + 1) - ú
Î 2 û
n log n(log n + 1)
= = Q (n log 2 n ) .
2

3.1
A[p...r]
5 3 2 6 4 1 3 7 5 3 2 6 4 1 3 7

(α) (β)
i j i j

3 3 2 6 4 1 5 7 3 3 2 6 4 1 5 7

i j i j
(γ) (δ)

A[p...q] A[q+1...r]
™¯‹Ì· 3.5
3 3 2 1 4 6 5 7
Η λειτουργία της
partition για τον
πίνακα Α = [5, 3, j i
2, 6, 4, 1, 3, 7]. (ε)

Η αναπαράσταση λειτουργίας της partition για τον πίνακα Α φαίνεται στο Σχήµα 3.5,
όπου τα στοιχεία που έχουν δεν τοποθετηθεί ακόµη στο σωστό υποπίνακα σηµειώ-
νονται µε γκρίζο φόντο. Το στοιχείο γύρω από το οποίο οργανώνεται η διαίρεση είναι
το x = 5. Αρχικά, το στοιχείο 5 (5 ≥ x) δεν επιτρέπει στην περιοχή του αριστερού
άκρου να µεγαλώσει, και το στοιχείο 3 (3 £ x) δεν επιτρέπει στην περιοχή του δεξι-
ού άκρου να µεγαλώσει (Σχήµα 3.5.(β)). Αυτό διορθώνεται µε την αντιµετάθεση των
στοιχείων 5 και 3 (Σχήµα 3.5.(γ)). Τα επόµενα στοιχεία που δεν επιτρέπουν την ανά-
πτυξη των δύο περιοχών είναι τα 6 και 1 (Σχήµα 3.5.(δ)). Μετά την αντιµετάθεση
των 6 και 1, η διαίρεση ολοκληρώνεται µε όριο το σηµείο q = j = 5.
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 225

13 19 9 5 12 8 7 4 11 2 6 21 13 19 9 5 12 8 7 4 11 2 6 21

i i j
6 19 9 5 12 8 7 4 11 2 13 21 6 2 9 5 12 8 7 4 11 19 13 21

i j j i
™¯‹Ì· 3.6
Η λειτουργία της partition για τον πίνακα B = [13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 21]
Η λειτουργία
φαίνεται στο Σχήµα 3.6. της partition για
τον πίνακα Β.
3.2
Από τον ψευδοκώδικα της partition, είναι φανερό ότι κάθε στοιχείο του πίνακα A[p,
…, r], εκτός από τα δύο στοιχεία που βρίσκονται εκατέρωθεν του ορίου q, συγκρί-
νεται ακριβώς µία φορά µε το στοιχείο x γύρω από το οποίο οργανώνεται η διαίρε-
ση. Ο λόγος είναι ότι ο δείκτης j πάντα µειώνεται, ο δείκτης i πάντα αυξάνεται και,
όταν ο j σταµατήσει σε κάποια θέση (συµπεριλαµβανοµένης και θέσης q), ο δείκτης
i θα σταµατήσει πριν τη θέση j, ή στη θέση j + 1 στην τελευταία επανάληψη. Επί-
σης, κάθε στοιχείο αντιµετατίθεται το πολύ µία φορά, ενώ µετά την αντιµετάθεση
δεν συγκρίνεται πάλι µε το στοιχείο x. Εποµένως, αφού σε κάθε στοιχείο του πίνα-
κα A[p,…, r] αντιστοιχεί µία σύγκριση µε το x και το πολύ µία αντιµετάθεση, ο χρό-
νος εκτέλεσης της partition είναι Θ(r – p + 1) = Θ(n).

3.3
Είδαµε ότι ένα στιγµιότυπο εισόδου για την quicksort χρειάζεται χρόνο Θ(n log n)
όταν, σε κάθε της εφαρµογή, η διαδικασία partition παράγει δύο ισοµεγέθεις υποπί-
νακες. Ας θεωρήσουµε τον πίνακα [5, 1, 2, 4, 7, 3, 6, 8]. Αρχικά, η partition παρά-
γει τους υποπίνακες [3, 1, 2, 4] και [7, 5, 6, 8]. Ο υποπίνακας [3, 1, 2, 4] διαιρείται
περαιτέρω στους υποπίνακες [2, 1] και [3, 4], ενώ ο υποπίνακας [7, 5, 6, 8] διαιρεί-
ται περαιτέρω στους υποπίνακες [6, 5] και [7, 8]. Εποµένως, ο πίνακας [5, 1, 2, 4, 7,
3, 6, 8] έχει τα χαρακτηριστικά των στιγµιότυπων που χρειάζονται χρόνο Θ(n log n).
Ένα άλλο παράδειγµα πίνακα µε ανάλογα χαρακτηριστικά είναι ο [9, 1, 2, 4, 7, 3, 6,
8, 13, 5, 10, 12, 15, 11, 14, 16].
Από την άλλη πλευρά, ένα στιγµιότυπο εισόδου για την quicksort χρειάζεται χρόνο
Θ(n2) όταν, σε κάθε βήµα, η διαδικασία partition παράγει έναν υποπίνακα µεγέθους
1 και έναν υποπίνακα µεγέθους n – 1. Τέτοια παραδείγµατα είναι κάθε πίνακας του
οποίου τα στοιχεία είναι διατεταγµένα σε αύξουσα ή φθίνουσα σειρά.
226 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

3.4
Ο χρόνος εκτέλεσης της quicksort T(n) σε αυτή την περίπτωση δίνεται από την ανα-
δροµική εξίσωση T(n) = T(cn) + T(dn) + Θ(n). Έστω y ≥ 1 µία σταθερά τέτοια, ώστε
ο χρόνος εκτέλεσης της διαδικασίας partition να µην ξεπερνά το yn. Παρατηρώντας
το δέντρο της αναδροµής (Σχήµα 3.7), βλέπουµε ότι η συνεισφορά του επιπέδου i
(η ρίζα βρίσκεται στο επίπεδο 0) είναι y(c + d)in = yn. Επιπλέον, το ύψος του δέντρου
είναι µεταξύ logcn και logdn, είναι δηλαδή Θ(log n). Εποµένως, εφόσον c + d = 1,
T(n) = Θ(y n log n) = Θ(n log n), αφού το y είναι σταθερά.

yn yn

Θ(log n) ycn ydn y(c+d)n

™¯‹Ì· 3.7 y c2 n ycdn ycdn y d2 n y(c+d)2+n

Το δέντρο
+
της αναδροµής για

...
την εξίσωση
T(n) = T(cn) +
T(dn) + Θ(n). Σύνολο: Θ(n logn)

3.5
Η ακόλουθη διαδικασία υπολογίζει το ελάχιστο στοιχείο ενός πίνακα A[1, …, n].
Επιπλέον, αν η σύγκριση (key > A[i]) γίνει (key < A[i]), η διαδικασία θα επιστρέφει
το µέγιστο στοιχείο του πίνακα Α[1, …, n].
minimum(A[1, ..., n])
key ¨ A[1];
for i ¨ 2 to n do
if key > A[i] then key ¨ A[i];
return key ;
Η διαδικασία minimum εκτελείται σε γραµµικό χρόνο αφού εκτελεί ακριβώς n – 1
επαναλήψεις. Επίσης, η διαδικασία minimum εκτελεί ακριβώς n – 1 συγκρίσεις µετα-
ξύ στοιχείων του Α.
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 227

Ο αριθµός των n – 1 συγκρίσεων είναι και ο ελάχιστος για την εύρεση του ελάχι-
στου / µέγιστου ενός πίνακα n στοιχείων. Κάθε αλγόριθµος που βρίσκει το ελάχιστο
στοιχείο µπορεί να θεωρηθεί σαν ένα τουρνουά µεταξύ των n στοιχείων. Οι συγκρί-
σεις αντιστοιχούν σε αγώνες του τουρνουά, σε καθέναν από τους οποίους νικητής
είναι το µικρότερο στοιχείο. Όλα τα στοιχεία, εκτός από το µικρότερο, πρέπει να
χάσουν σε τουλάχιστον ένα αγώνα. Εποµένως, απαιτούνται τουλάχιστον n – 1 αγώ-
νες / συγκρίσεις για την εύρεση του ελάχιστου στοιχείου. Αυτό σηµαίνει ότι δεν
υπάρχει αλγόριθµος µε χρόνο εκτέλεσης χειρότερης περίπτωσης o(n) για την εύρε-
ση του ελάχιστου / µέγιστου ενός πίνακα n στοιχείων.

3.6
Παρατηρώντας το δέντρο της αναδροµής (Σχήµα 3.8), βλέπουµε ότι η συνεισφορά
του επιπέδου i (η ρίζα βρίσκεται στο επίπεδο 0) είναι (1/c + 1/d)i Θ(n). Επιπλέον, το
ύψος του δέντρου είναι µεταξύ log(1/c)n και log(1/d)n, είναι δηλαδή Θ(log n). Εποµέ-
νως, είναι:

Q (log n ) Q (log n )
T (n ) = Â
i =0
Q (n )(1 / c + 1 / d )i = Q (n ) Â
i =0
(1 / c + 1 / d )i .

Â
Q (log n )
Όταν 1/c + 1/d < 1, το άθροισµα (1 / c + 1 / d )i είναι ίσο µε µια σταθερά,
i =0

επειδή είναι άθροισµα όρων γνήσια φθίνουσας γεωµετρικής προόδου. Εποµένως, σε


αυτή την περίπτωση T(n) = Θ(n).

Θ(n) Θ(n)
+

(1/c) Θ(n) (1/d) Θ(n) (1/c+1/d)Θ(n)


Θ(log n)
+
™¯‹Ì· 3.8
(1/c2)Θ(n) 2(1/c)(1/d) Θ(n) (1/d2)Θ(n) (1/c+1/d)2Θ(n)
Το δέντρο
της αναδροµής για
+ την εξίσωση
...

T(n) = T(n/c) +
...

T(n/d) + Θ(n).
228 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

Â
Q (log n )
Στην περίπτωση που 1/c + 1/d = 1, είναι (1 / c + 1 / d )i = Q (log n ) , και T(n)
i =0
= Θ(n log n).

3.7
Όταν τα στοιχεία του πίνακα Α χωρίζονται σε οµάδες των 7, το ενδιάµεσο στοιχείο
του δείγµατος είναι µεγαλύτερο από τουλάχιστον 4n/14 στοιχεία, και µικρότερο από
τουλάχιστον 4n/14 στοιχεία. Εποµένως, ο µεγαλύτερος υποπίνακας που µπορεί να
προκύψει από τη διαδικασία της διαίρεσης έχει µέγεθος το πολύ 5n/7. Ο χρόνος εκτέ-
λεσης χειρότερης περίπτωσης T(n) δίνεται από την αναδροµική εξίσωση T(n) =
T(5n/7) + T(n/7) + Θ(n), όπου T(n/7) είναι ο χρόνος για τον υπολογισµό του ενδιά-
µεσου στοιχείου του δείγµατος. Αφού 5/7 + 1/7 = 6/7 < 1, είναι Τ(n) = Θ(n).
Όταν τα στοιχεία χωρίζονται σε οµάδες των 3, ο µεγαλύτερος υποπίνακας µπορεί να
έχει µέγεθος µέχρι 2n/3. Ο χρόνος εκτέλεσης T(n) δίνεται από την αναδροµική εξί-
σωση T(n) = Τ(2n/3) + T(n/3) + Θ(n). Επειδή 2/3 + 1/3 = 1, η λύση αυτής της εξί-
σωσης είναι Τ(n) = Θ(n log n). ∆ηλαδή, όταν τα στοιχεία χωρίζονται σε οµάδες των
3 για τον υπολογισµό του δείγµατος, ο χρόνος χειρότερης περίπτωσης της διαδικα-
σίας quickselect είναι ασυµπτωτικά ίσος µε το χρόνο που χρειάζεται για να διατά-
ξουµε ολόκληρο τον πίνακα n στοιχείων.

3.8
Χρησιµοποιώντας τη διαδικασία quickselect µπορούµε να υπολογίσουµε το ενδιά-
µεσο στοιχείου του πίνακα Α[p, …, r] σε γραµµικό χρόνο. Οργανώνοντας τη διαίρε-
ση του πίνακα Α[p, …, r] γύρω από το ενδιάµεσο στοιχείο, η διαδικασία partition θα
καταλήγει πάντα σε δύο ισοµεγέθεις υποπίνακες. Ο χρόνος εκτέλεσης χειρότερης
περίπτωσης T(n) αυτής της παραλλαγής της quicksort δίνεται από την αναδροµική
εξίσωση T(n) = 2T(n/2) + Θ(n), η οποία γνωρίζουµε ότι έχει λύση T(n) = Θ(n log n).
Η παραλλαγή αυτή δεν χρησιµοποιείται στην πράξη γιατί, αν και έχει ασυµπτωτικά
µικρότερο χρόνο εκτέλεσης χειρότερης περίπτωσης, η πολλαπλασιαστική σταθερά
είναι σηµαντικά µεγαλύτερη, και ο αλγόριθµος είναι σηµαντικά πιο αργός από την
πιθανοτική παραλλαγή της quicksort.

3.9
Horner(A[a0, ...an – 1], x 0)
value ¨ 0; i ¨ n – 1;
while i ≥ 0 do
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 229

value ¨ A[i] + value ¥ x0;


i ¨ i – 1;
return value;
Ο while – βρόγχος εκτελείται ακριβώς n φορές, ενώ κάθε εκτέλεσή του χρειάζεται
σταθερό χρόνο, αφού περιλαµβάνει έναν πολλαπλασιασµό και δύο προσθέσεις. Επο-
µένως, ο χρόνος εκτέλεσης της διαδικασίας Horner είναι Θ(n).

4.1
Προφανώς, ο αριθµός των πινάκων που αντιστοιχεί στο διάνυσµα d είναι n = 6. Η
διαδικασία MATRIX – CHAIN – MULT πρώτα αρχικοποιεί τα στοιχεία m[i, i], i = 1, …,
6, στο 0. Στη συνέχεια, υπολογίζει τις τιµές m[i, j], 1 £ i < j £ 6, εφαρµόζοντας την
αναδροµική εξίσωση:

ÏÔ0 αν i = j
m[i, j] = Ì
min{m[i, k ] + m[ k + 1, j] + di -1d k d j } αν i < j
ÔÓi £ k < j

Η λειτουργία της διαδικασίας matrix – chain – mult αναπαρίσταται στο Σχήµα 4.2, όπου
τα στοιχεία του πίνακα συµπληρώνονται από κάτω προς τα πάνω, και από αριστερά
προς τα δεξιά. Στο Σχήµα 4.2 έχει συµπληρωθεί ο ελάχιστος αριθµός των πολλαπλα-
σιασµών για τον υπολογισµό κάθε γινοµένου Αi..j, και σε παρένθεση, η θέση k στην
οποία γίνεται η διαίρεση, δηλαδή η θέση k για την οποία υπολογίζεται Ai..j = Ai..k Ak + 1..j.

6 1
15.125—
5 (3) 2
11.875— 10.500—
j i
4 (3) (3) 3
9.375— 7.125— 5.375—
3 (3) (3) (3) 4
7.875— 4.375— 2.500— 3.500—
2 (3) (3) (3) (3) 5
15.750— 2.625— 750— 1.000— 5.000—
1 (3) (3) (3) (3) (3) 6
0 0 0 0 0 0 ™¯‹Ì· 4.2
Οι τιµές
του πίνακα m για
A1 A2 A3 A4 A5 A6 το διάνυσµα d.
230 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

Ο ελάχιστος αριθµός των πολλαπλασιασµών για τον υπολογισµό του γινοµένου είναι
15.125. Αυτός επιτυγχάνεται µε διαίρεση στη θέση 3, δηλαδή υπολογίζοντας πρώτα
τα γινόµενα Α1..3 και Α4..6. Ο υπολογισµός του Α1..3 απαιτεί 7.875 πολλαπλασιασµούς
στοιχείων και διαιρείται στη θέση 1, ενώ ο υπολογισµός του Α4..6 απαιτεί 3.500 πολ-
λαπλασιασµούς και διαιρείται στη θέση 5. Τελικά, ο βέλτιστος τρόπος υπολογισµού
είναι ((Α1(Α2 Α3))((Α4 Α5)Α6)).

4.2
RECURSIVE – MATRIX – CHAIN(d[i,...,j])

if i = j then return 0;
m[i,j] ¨ •;
for k ¨ i to j – 1 do
q ¨ RECURSIVE – MATRIX – CHAIN(d[i,...,k]) +
RECURSIVE – MATRIX – CHAIN(d[k + 1,...,j]) +
d[i – 1]d[k]d[j];
if q < m[i, j] then m[i,j] ¨ q;
return m[i,j];
Ο παραπάνω ψευδοκώδικας υπολογίζει αναδροµικά όλες τις τιµές m[i, j], 1 £ i < j £
n, συµπεριλαµβανοµένης και της m[1, n]. Παρατηρούµε ότι για τον υπολογισµό του
m[1, n] γίνονται 2 αναδροµικές κλήσεις για κάθε k = 1, 2, …, n – 1. Η πρώτη ανα-
δροµική κλήση αφορά τον υπολογισµό της τιµής m[1, k] και η δεύτερη της m[k + 1,
n]. Εποµένως, ο χρόνος εκτέλεσης T(n) για τον υπολογισµού της τιµής m[1, n] δίνε-
ται από την αναδροµική εξίσωση:
n -1 n -1
T (n ) ≥ 1 + Âk =1
(T ( k ) + T (n - k ) + 1) = n + 2 ÂT (k ) .
k =1

Με τη µέθοδο της αντικατάστασης, µπορούµε να αποδείξουµε ότι Τ(n) ≥ 2n – 1, για


κάθε n ≥ 1. Πράγµατι, Τ(1) ≥ 20 = 1. Επαγωγικά δεχόµαστε ότι T(n – 1) ≥ 2n – 2 για
κάθε n ≥ 1και, αντικαθιστώντας στην αναδροµική εξίσωση, έχουµε:
n -1 n-2
T (n ) ≥ n + 2 Â
k =1
2 k -1 = n + 2 Â2
k =0
k
= n + 2( 2 n -1 - 1) ≥ 2 n -1 ,

αφού το άθροισµα αποτελείται από (n – 1) πρώτους όρους γεωµετρικής προόδους.


Άρα, T(n) = Ω(2n).
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 231

4.3
Έστω ότι για κάποια 1 < i < n και 1 < j £ m, είναι xi = yj, xi – 1 π yj και xi π yj – 1. Για
να υπολογιστούν οι τιµές των θέσεων c[i, j], c[i – 1, j] και c[i, j – 1] πρέπει να υπο-
λογιστεί η τιµή της θέσης c[i – 1, j – 1]. Άρα, το στιγµιότυπο <Xi – 1, Yj – 1> αποτελεί
κοινό επιµέρους στιγµιότυπο των στιγµιότυπων <Xi, Yj>, <Xi – 1, Yj> και <Xi, Yj – 1>.
Εποµένως, το πρόβληµα της µεγαλύτερης κοινής υπακολουθίας έχει την ιδιότητα
των επικαλυπτόµενων επιµέρους προβληµάτων.

4.4
Η διαδικασία LCS – length ξεκινά αρχικοποιώντας στο 0 την πρώτη γραµµή και την
πρώτη στήλη του πίνακα c (c[0, j] και c[i, 0]). Στη συνέχεια, οι τιµές των στοιχείων
του πίνακα m υπολογίζονται από πάνω προς τα κάτω, και από αριστερά προς τα
δεξιά, δηλαδή κάθε στοιχείο της γραµµής i υπολογίζεται πριν από κάθε στοιχείο της
γραµµής i + 1, και το στοιχείο c[i, j] υπολογίζεται πριν από το στοιχείο c[i, j + 1].
Οι τιµές όλων των στοιχείων του πίνακα c για τις ακολουθίες x και Υ φαίνονται στον
Πίνακα 4.1. Με γκρίζο σηµειώνονται τα κοινά στοιχεία των ακολουθιών που προ-
καλούν αύξηση του µήκους της κοινής υπακολουθίας κατά 1, δηλαδή εφαρµογή του
κανόνα c[i, j] = c[i – 1, j –1] + 1. Η µεγαλύτερη κοινή υπακολουθία των Χ και Υ έχει
µήκος 4. Η βέλτιστη υπακολουθία που υπολογίζεται από την LCS – LENGTH είναι
<Β, Γ, Β, Α>.

¶›Ó·Î·˜ 4.1
Ο πίνακας c για τις ακολουθίες Χ και Υ.

j 0 1 2 3 4 5 6
i yi B ∆ Γ A B A
0 xi 0 0 0 0 0 0 0
1 A 0 0 0 0 1 1 1
2 B 0 1 1 1 2 2 2
3 Γ 0 1 1 2 2 2 2
4 B 0 1 1 2 2 3 3
5 ∆ 0 1 2 2 2 3 3
6 A 0 1 2 2 3 3 4
8 B 0 1 2 2 3 4 4
232 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

4.5
Κάθε στοιχείο c[i, j] εξαρτάται µόνο από τις τιµές των στοιχείων c[i – 1, j – 1], c[i –
1, j] και c[i, j – 1]. Μπορούµε λοιπόν σε χρόνο Θ(1) να ελέγξουµε από ποιον κανό-
να της αναδροµικής εξίσωσης προέκυψε το στοιχείο c[i, j]. Η αναδροµική διαδικα-
σία PRINT – LCS υλοποιεί αυτή ακριβώς την ιδέα.
PRINT – LCS(Xi, Yj)
if i = 0 or j = 0 then return;
if xi = yj then
PRINT – LCS(Xi – 1, Yj – 1); print(xi);
else
if c[i, j] = c[i – 1, j] then
PRINT – LCS(Xi – 1, Yj);
else PRINT – LCS(Xi, Yj – 1);
Ο χρόνος εκτέλεσης της διαδικασίας PRINT – LCS είναι Ο(n + m), αφού σε κάθε βήµα
της αναδροµής ένα τουλάχιστον από τα i και j µειώνεται κατά 1.

5.1
Εφαρµόζουµε τον άπληστο αλγόριθµο που επιλέγει τη δραστηριότητα µε τη µικρό-
τερη διάρκεια στο στιγµιότυπο του παρακάτω πίνακα. Ο αλγόριθµος δίνει λύση C =
{2}, ενώ η βέλτιστη λύση είναι C* = {1, 3}.

i 1 2 3
si 1 4 5
fi 5 6 10

Εφαρµόζουµε τον άπληστο αλγόριθµο που επιλέγει τη δραστηριότητα µε το µικρό-


τερο χρόνο έναρξης στο στιγµιότυπο του παρακάτω πίνακα. Ο αλγόριθµος δίνει λύση
C = {1}, ενώ η βέλτιστη λύση είναι C* = {2, 3, 4, 5, 6, 7, 8}.

i 1 2 3 4 5 6 7 8
si 1 2 3 4 5 6 7 8
fi 10 3 4 5 6 7 8 9

Εφαρµόζουµε τον άπληστο αλγόριθµο που επιλέγει τη δραστηριότητα που επικαλύ-


πτεται µε τον µικρότερο αριθµό άλλων δραστηριοτήτων του A / C στο στιγµιότυπο
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 233

του παρακάτω πίνακα. Ο αλγόριθµος αρχικά επιλέγει τη δραστηριότητα 6 που επι-


καλύπτεται µε δύο άλλες δραστηριότητες. Έχοντας επιλέξει την 6, µπορεί να επιλέ-
ξει το πολύ άλλες δύο δραστηριότητες, π.χ. C = {1, 6, 8}, ενώ η βέλτιστη λύση επι-
λέγει τέσσερις δραστηριότητες, π.χ. C* = {1, 5, 7, 10}.

i 1 2 3 4 5 6 7 8 9 10 11
si 1 1 2 2 3 4 5 6 6 7 7
fi 3 3 4 4 5 6 7 8 8 9 9

5.2
Έστω m[i, T] ο µέγιστος αριθµός δραστηριοτήτων που µπορούν να επιλεγούν από
το σύνολο Ai = {1, …, i} και έχουν χρόνο ολοκλήρωσης το πολύ Τ. Το m[i, T] ορί-
ζεται από την παρακάτω αναδροµική εξίσωση:

Ï0 αν i = 0 ή T £ 0
m[i,T ] = Ì
Ómax{m[i - 1,T ], m[i - 1, si ] + 1} αν i > 0 κ αι T > 0.
Η τιµή της βέλτιστης λύσης δίνεται από το στοιχείο m[n, fn], όπου fn µέγιστος χρό-
νος ολοκλήρωσης. Ο πίνακας έχει nfn στοιχεία, καθένα από τα οποία µπορεί να υπο-
λογιστεί σε σταθερό χρόνο, εποµένως, ο χρόνος εκτέλεσης του αλγορίθµου είναι
Θ(nfn). Επίσης, ο αλγόριθµος χρησιµοποιεί fn + O(1) θέσεις µνήµης, όταν µόνο η
τιµή της βέλτιστης λύσης πρέπει να υπολογισθεί, και nfn + Ο(1) θέσεις µνήµης, όταν
πρέπει να υπολογισθεί και µία βέλτιστη λύση.
Ένας διαφορετικός αλγόριθµος, που αν και ο ορισµός του ακολουθεί το παράδειγµα
του δυναµικού προγραµµατισµού, ουσιαστικά, λειτουργεί όπως ο άπληστος αλγό-
ριθµος, προκύπτει ως εξής: Έστω m[i] = (xi, yi), όπου xi ο αριθµός των δραστηριο-
τήτων που µπορεί να επιλεγεί από το σύνολο Αi = {1, …, i} και yi ο µεγαλύτερος
χρόνος ολοκλήρωσης των διαδικασιών που έχουν επιλεγεί. Το m[i] ορίζεται από την
παρακάτω αναδροµική εξίσωση:

Ê (0, 0 ) αν i = 0.
Á
m[i] = ( xi -1 , yi -1 ) αν i > 0 κ αι si < yi -1.
ÁÁ
Ë ( xi -1 + 1, f i ) αν i > 0 κ αι si ≥ yi -1.

Θεωρώντας ότι f1 £ f2 £ … £ fn, το m[n] µπορεί να υπολογιστεί σε γραµµικό χρόνο


µε χρήση σταθερού αριθµού θέσεων µνήµης.
234 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

5.3
GREEDY – KNAPSACK(B, (s1, p1),...,(sn, pn))
for i ¨ 1 to n do
r[i] ¨ pi / si ;
¢È¿Ù·Í ٷ ·ÓÙÈΛÌÂÓ· ÒÛÙ r[1] ≥ r[2] ≥ ... ≥ r[n];
for i ¨ 1 to n do
if B £ 0 then f[i] ¨ 0;
else if B ≥ si then
f[i] ¨ 1; B ¨ B – si;
else
f[i] ¨ si / B; B ¨ B – f[i]*si;
return f;
Έστω ότι ο άπληστος αλγόριθµος συµπεριλαµβάνει στο σακίδιο ακριβώς f1 s1, 0 <
f1 £ 1, µονάδες από το αντικείµενο 1. Θα αποδείξουµε ότι το κλασµατικό πρόβλη-
µα σακιδίου έχει την ιδιότητα της άπληστης επιλογής, αποδεικνύοντας ότι υπάρχει
µία βέλτιστη λύση Α¢ η οποία, επίσης, συµπεριλαµβάνει στο σακίδιο ακριβώς f1s1
µονάδες του αντικειµένου 1.

Αφού ο άπληστος αλγόριθµος συµπεριλαµβάνει στο σακίδιο (που αρχικά είναι άδειο)
όσες περισσότερες µονάδες από το αντικείµενο 1 µπορεί, δεν υπάρχει καµία λύση
που να συµπεριλαµβάνει στο σακίδιο περισσότερες µονάδες από το αντικείµενο 1
από τη λύση που υπολογίζει ο άπληστος αλγόριθµος. Έστω µία βέλτιστη λύση Α η
οποία συµπεριλαµβάνει στο σακίδιο f1A s1 µονάδες του αντικειµένου 1, όπου
f1A s1 < f1s1 . Η λύση Α¢ δηµιουργείται αντικαθιστώντας ακριβώς f1s1 - f1A s1 µονά-
δες των αντικειµένων που έχουν συµπεριληφθεί στην λύση Α και έχουν τους µικρό-
τερους λόγους αξίας προς µέγεθος, από ίσο αριθµό µονάδων του αντικειµένου 1.
Αυτή η αντικατάσταση δεν µεταβάλει το µέγεθος του σακιδίου, ενώ είναι p(A΄) ≥
p(A), αφού ο λόγος αξίας προς µέγεθος του αντικειµένου 1 είναι µεγαλύτερος ή ίσος
από τους αντίστοιχους λόγους των αντικειµένων που αντικατέστησε στη λύση Α.
Εποµένως, η λύση Α΄ είναι βέλτιστη και περιέχει ακριβώς f1s1 µονάδες του αντι-
κειµένου 1.
Από την ιδιότητα των βέλτιστων επιµέρους δοµών, η λύση Α¢ / {1} πρέπει να είναι
βέλτιστη λύση του επιµέρους στιγµιότυπου που προκύπτει από την αποµάκρυνση f1s1
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 235

µονάδων του αντικειµένου 1 και τη µείωση της χωρητικότητας του σακιδίου σε


B - f1s1 .
Απλή επαγωγική εφαρµογή των ιδιοτήτων της άπληστης επιλογής και των βέλτιστων
επιµέρους δοµών αποδεικνύει ότι ο άπληστος αλγόριθµος υπολογίζει µία βέλτιστη
λύση για το κλασµατικό πρόβληµα του σακιδίου.

5.4
Έστω ένα δυαδικό δέντρο Τ, το οποίο δεν είναι πλήρες, και έστω ένας εσωτερικός
κόµβος z του Τ, ο οποίος έχει ακριβώς έναν κόµβο – παιδί w. Μπορούµε να δηµι-
ουργήσουµε ένα νέο δέντρο Τ¢ αποµακρύνοντας το z και συνδέοντας το w στον
κόµβο – πατέρα του z. Οι κωδικοί που αντιστοιχούν σε όλα τα φύλλα – απόγονους
του z έχουν ένα δυαδικό ψηφίο λιγότερο στο δέντρο Τ¢. Επίσης, το µήκος των κωδι-
κών για τα φύλλα του Τ που δεν είναι απόγονοι του z δεν µεταβλήθηκε. Εποµένως,
το κόστος του Τ¢ είναι µικρότερο από αυτό του Τ, και το Τ δεν είναι βέλτιστο.
Αφού κάθε ακµή του δέντρου αναπαράστασης ενός κώδικα αντιστοιχεί σε ένα δυα-
δικό ψηφίο, όταν το δέντρο δεν είναι πλήρες χρησιµοποιούµε περισσότερα δυαδικά
ψηφία από όσα πραγµατικά χρειάζονται και, άρα, δεν έχουµε έναν βέλτιστο κώδικα.

5.5
Θα χρησιµοποιήσουµε µαθηµατική επαγωγή στον αριθµό των φύλλων του δέντρου
Τ. Για δύο φύλλα x και y, προφανώς, Β(Τ) = f(x) + f(y). ∆εχόµαστε ότι η πρόταση
ισχύει για δέντρα µε n ή λιγότερα φύλλα και θα αποδείξουµε ότι ισχύει και για δέντρα
n + 1 φύλλων.
Έστω ένα δέντρο T µε n + 1 φύλλα, το οποίο αποτελείται από τα υποδέντρα T1 µε
n1 < n + 1 φύλλα, και Τ2 µε n2 < n + 1 φύλλα. Όταν γίνεται συνένωση των υποδέ-
ντρων Τ1 και Τ2, το µήκος των κωδικών που αντιστοιχούν σε όλα τα φύλλα των T1
και Τ2 αυξάνεται κατά 1, εποµένως, το κόστος Β(Τ) είναι ίσο µε το άθροισµα του
κόστους των Τ1 και Τ2, προσαυξηµένο µε το άθροισµα των συχνοτήτων εµφάνισης
όλων των φύλλων του Τ1 και Τ2. Το άθροισµα των συχνοτήτων εµφάνισης των φύλ-
λων ενός υποδέντρου Τ1 είναι ίσο µε τη συχνότητα f(T1) του κόµβου – ρίζα του Τ1.
Εποµένως, Β(Τ) = f(Τ1) + f(Τ2) + Β(Τ1) + Β(Τ2), δηλαδή το Β(Τ) είναι ίσο µε το άθροι-
σµα του κόστους της συνένωσης των Τ1 και Τ2 και του κόστους των δύο υποδέντρων
Τ1 και Τ2. Από την επαγωγική υπόθεση, τα κόστη Β(Τ1) και Β(Τ2) είναι ίσα µε τα
αθροίσµατα του κόστους όλων των συνενώσεων για τη δηµιουργία των Τ1 και Τ2,
αντίστοιχα. Εποµένως, το Β(Τ) είναι πράγµατι ίσο µε το άθροισµα του κόστους όλων
των συνενώσεων για τη δηµιουργία του δέντρου Τ.
236 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

5.6
Θεωρούµε κάποιο βέλτιστο κώδικα και, έστω ότι οι χαρακτήρες του συνόλου C = {c1,
c2, …, cn} είναι διατεταγµένοι σε αύξουσα σειρά των συχνοτήτων εµφάνισης, f(c1) £
f(c2) £ …£ f(cn). Επίσης, έστω ότι για κάποιο j, 1 £ j < n, είναι f(cj) < f(cj + 1) και l(cj) >
l(cj + 1), όπου l(c) είναι το µήκος του κωδικού που αντιστοιχεί στον χαρακτήρα c Œ C.

Μπορούµε να ανταλλάξουµε αµοιβαία τους κωδικούς που αντιστοιχούν στους χαρα-


κτήρες cj και cj + 1. Σαν αποτέλεσµα, οι κωδικοί εξακολουθούν να είναι µοναδικοί, ενώ

Â
n
το άθροισµα f ( c j )l ( c j ) µειώνεται. Το γεγονός αυτό αντίκειται στην υπόθεση
j =1

ότι ο κώδικας που θεωρήσαµε είναι βέλτιστος.


Εποµένως, λανθασµένα υποθέσαµε ότι, όταν οι χαρακτήρες είναι διατεταγµένοι σε
αύξουσα σειρά συχνοτήτων εµφάνισης, δεν είναι ταυτόχρονα διατεταγµένοι και σε
αύξουσα σειρά ως προς το µήκος των κωδικών.

6.1
Παρατηρούµε ότι κάθε ακµή {v, w} συνεισφέρει ακριβώς 2 στο άθροισµα των βαθ-
µών όλων των κορυφών (µία µονάδα στο βαθµό της v και µία µονάδα στο βαθµό της
w), επειδή συντρέχει σε ακριβώς δύο κορυφές (v και w). Εποµένως, το διπλάσιο του
αριθµού των ακµών είναι ίσο µε το άθροισµα των βαθµών όλων των κορυφών. Για
παράδειγµα, στο γράφηµα του Σχήµατος 6.1.(β), το άθροισµα των βαθµών είναι 12
και ο αριθµών των ακµών είναι 6.

6.2
Έστω ότι το G(V, E) είναι δέντρο, δηλαδή συνεκτικό και άκυκλο. Αφού το G είναι
συνεκτικό, οποιεσδήποτε δύο κορυφές του θα ενώνονται µε τουλάχιστον ένα µονο-
πάτι. Έστω ότι οι κορυφές u και v ενώνονται µε δύο µονοπάτια, το p1 και το p2. Έστω
w η πρώτη κορυφή που τα p1 και p2 διαφοροποιούνται, δηλαδή αν η κορυφή που ακο-
λουθεί τη w στο p1 είναι η x και η κορυφή που ακολουθεί τη w στο p2 είναι y, τότε x
π y. Επίσης, έστω w¢ η πρώτη κορυφή µετά τη w η οποία είναι κοινή στα µονοπάτια
p1 και p2. Τα τµήµατα των p1 και p2 µεταξύ w και w¢ σχηµατίζουν κύκλο, γεγονός
που αντίκειται στην υπόθεση ότι το G είναι άκυκλο.
Αντίστροφα, αν οποιεσδήποτε δύο κορυφές του G ενώνονται µε ένα µονοπάτι τότε
είναι συνεκτικό. Επίσης, η ύπαρξη κύκλου µεταξύ δύο κορυφών προϋποθέτει δύο ή
περισσότερα διαφορετικά µονοπάτια µεταξύ τους. Εποµένως, αν οποιεσδήποτε δύο
κορυφές του G ενώνονται µε ένα µοναδικό µονοπάτι, τότε το G είναι δέντρο.
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 237

6.3
Έστω ότι το G(V, E) είναι κλίκα και υπάρχει ένας τρόπος να εκτελεστεί το ΨΠΒ
ώστε να δώσει δέντρο που δεν είναι ήταν ένα απλό µονοπάτι. Θα έπρεπε το ΨΠΒ να
σταµατούσε την εξερεύνηση σε κάποια κορυφή u, να επιστρέψει στον πρόγονο της
u και από εκεί να συνεχίσει σε µία νέα κορυφή v. Αυτό σηµαίνει ότι η ακµή {u, v}
δεν ανήκει στο Ε, γεγονός που αντιβαίνει στην υπόθεση ότι το G είναι κλίκα.
Για ένα µη κατευθυντικό γράφηµα που το ίδιο είναι ένα απλό µονοπάτι, το δέντρο
του ΨΠΒ είναι, σε κάθε περίπτωση, ένα απλό µονοπάτι. Ένα άλλο παράδειγµα είναι
το γράφηµα µε σύνολο κορυφών V = {a, b, c, d} και σύνολο ακµών E = {{a, b}, {b,
c}, {c, d}, {d, a}}.

6.4
Έστω G(V, E) ένα µη κατευθυντικό γράφηµα και {u, v} µία ακµή του G. Χωρίς
βλάβη της γενικότητας, υποθέτουµε ότι d[u] < d[v]. Εποµένως, η κορυφή v έγινε
γκρίζα και, στη συνέχεια, µαύρη, πριν γίνει µαύρη η u, αφού η v περιέχεται στη λίστα
των γειτόνων της u. Αν η ακµή {u, v} πρώτα εξετάστηκε στην κατεύθυνση από τη u
στη v (δηλαδή (u, v)), τότε θα είναι µία ακµή του δέντρου του ΨΠΒ. Αν η ακµή {u,
v} πρώτα εξετάστηκε στην αντίθετη κατεύθυνση (δηλαδή (v, u)), θα είναι µία πίσω
ακµή, αφού η u είναι ακόµη γκρίζα τη στιγµή που η ακµή {u, v} εξετάστηκε από το
ΨΠΒ για πρώτη φορά.

6.5
Εκτελέστε ΨΠΒ(G), και σταµατήστε όταν βρεθεί η πρώτη πίσω ακµή. Αν δεν υπάρ-
χει πίσω ακµή, τότε το γράφηµα δεν έχει κύκλο, και υπάρχουν το πολύ |V| – 1 ακµές.
Εποµένως, ο χρόνος εκτέλεσης του ΨΠΒ είναι O(|V| + |E|) = O(|V|). Αν υπάρχουν
πίσω ακµές, ο αλγόριθµος σταµατάει όταν βρεθεί η πρώτη πίσω ακµή. Μέχρι αυτή
τη στιγµή, ο αλγόριθµος δεν µπορεί να έχει εξετάσει περισσότερες από |V| ακµές.
Άρα, σε κάθε περίπτωση, ο χρόνος εκτέλεσης του αλγόριθµου είναι O(|V|).

7.1
Στο πρόβληµα του Πολλαπλασιασµού Ακολουθίας Πινάκων δίνονται οι πίνακες Α1,
Α2, …, Αn και ένα όριο Β, και πρέπει να αποφασισθεί αν υπάρχει ένας τρόπος επιµε-
ρισµού (θέσεις παρενθέσεων), ώστε ο υπολογισµός του γινοµένου Α = A1 ¥ A2 L ¥
An, να απαιτεί το πολύ Β πολλαπλασιασµούς µεταξύ στοιχειών των πινάκων.
Στο πρόβληµα της Μεγαλύτερης Κοινής Υπο – Ακολουθίας, δεδοµένων δύο ακο-
238 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

λουθιών Χ και Υ, και ενός ορίου Β, πρέπει να αποφασισθεί αν οι Χ και Υ περιέχουν


µία κοινή υπο – ακολουθία µήκους, τουλάχιστον, Β.
Τόσο το πρόβληµα του Πολλαπλασιασµού Ακολουθίας Πινάκων όσο και αυτό της
Μεγαλύτερης Κοινής Υπο – Ακολουθίας είναι ευεπίλυτα, αφού λύνονται από αλγό-
ριθµους δυναµικού προγραµµατισµού σε χρόνο Ο(n3) και O(|X||Y|), αντίστοιχα.

7.2
Έστω Μ = (Q, Σ, q0, δ) η Ντετερµινιστική Μηχανή Turing που µετακινεί την είσο-
δό της µία θέση δεξιά. Είναι Σ = {0, 1} και Γ = {0, 1, u}. Επίσης, θα χρησιµοποιή-
σουµε το σύµβολο > για να δηλώσουµε την αρχή της ταινίας. Οι τελικές καταστά-
σεις είναι F = {ΠΕΡΑΣ}, και όλες οι καταστάσεις είναι Q = {q0, s, s0, s1} » F. Η
συνάρτηση µετάβασης δ φαίνεται στον παρακάτω πίνακα:

pŒQ–F σŒΓ δ(p, σ)


q0 0 (q0, 0, R)
q0 1 (q0, 1, R)
q0 u (s, u, L)
q0 > (q0, >, R)
s 0 (s0, u, R)
s 1 (s1, u, R)
s u (s, u, S)
s > (ΠΕΡΑΣ, >, R)
s0 0 (q0, 0, L)
s0 1 (q0, 0, L)
s0 u (q0, 0, L)
s0 > (ΠΕΡΑΣ, >, R)
s1 0 (q0, 1, L)
s1 1 (q0, 1, L)
s1 u (q0, 1, R)
s1 > (ΠΕΡΑΣ, >, R)

Ακολουθεί ένα παράδειγµα λειτουργίας για συµβολοσειρά εισόδου >1101 (το υπο-
γραµµισµένο σύµβολο δηλώνει τη θέση της κεφαλής).
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 239

(q0, >1101) Æ (q0, >1101) Æ (q0, >1101) Æ (q0, >1101) Æ (q0, >1101) Æ
(q0, >1101u) Æ (s, >1101u) Æ (s1, >110u u) Æ (q0, >110u1) Æ (s, >110u1) Æ
(s0, >11u u1) Æ (q0, >11u01) Æ (s, >11u01) Æ (s1, >1u u01) Æ (q0, >1u101) Æ
(s, >1u101) Æ (s1, >u u101) Æ (q0, >u1101) Æ (s, >u1101) Æ (ΠΕΡΑΣ, >u1101).

7.3
Οι συναρτήσεις f1, f2, και f3 είναι φανερά αύξουσες. Για την f1, η αντίστοιχη DTM Μ1
απλά γράφει το 1c στην ταινία εξόδου, αγνοώντας την είσοδο. Αυτό γίνεται σε χώρο
και χρόνο Ο(c) = Ο(1). Για την f2, η αντίστοιχη DTM Μ2 απλά γράφει ένα σύµβολο
1 στην ταινία εξόδου για κάθε σύµβολο του x. Η Μ2 λειτουργεί σε χρόνο O(n) και
χρησιµοποιεί Ο(n) κελιά επιπλέον των κελιών που καταλαµβάνει η είσοδος x. Η DTM
Μ3 για τη συνάρτηση f3 χρησιµοποιεί και µια ταινία εργασίας, εκτός από τις ταινίες
εισόδου και εξόδου. Αρχικά, η Μ3 χρησιµοποιεί την ταινία εργασίας για να γράψει το
µήκος της εισόδου x στο δυαδικό σύστηµα. Όταν διαβάσει όλο το x, για κάθε σύµ-
βολο που έχει γράψει στην ταινία εργασίας, η Μ3 γράφει ένα σύµβολο 1 στην ταινία
εξόδου. Αν |x| = n, το αποτέλεσµα είναι 1È ù , ενώ η Μ3 λειτουργεί σε χρόνο Ο(n +
log n

log n) και χρησιµοποιεί Ο(log n) κελιά των ταινιών εργασίας και εξόδου.

7.4
Έστω R1 η πολυωνυµική αναγωγή από Π1 στο Π2, και R2 η πολυωνυµική αναγωγή
από το Π2 στο Π3. Για κάθε είσοδο x, υπολογίζουµε το R2(R1(x)), το οποίο είναι ένα
θετικό στιγµιότυπο του Π3 (δηλαδή, γίνεται αποδεκτό από µία DTM που αποφασί-
ζει το Π3) αν και µόνο αν το R1(x) είναι ένα θετικό στιγµιότυπο του Π2 αν και µόνο
αν το x είναι ένα θετικό στιγµιότυπο του Π1. Αφού το R1(x) υπολογίζεται σε πολυω-
νυµικό χρόνο, το µήκος του R1(x) είναι πολυωνυµικό ως προς το µήκος του x (καµία
DTM δεν µπορεί να γράψει περισσότερα σύµβολα από τον αριθµό των βηµάτων που
εκτελεί). Συνεπώς, το R2(R1(x)) υπολογίζεται σε πολυωνυµικό χρόνο ως προς το |x|.
∆ηλαδή, η σύνθεση των πολυωνυµικών αναγωγών R1 και R2 είναι µία πολυωνυµική
αναγωγή από το Π1 στο Π3.

7.5
Έστω R η πολυωνυµική αναγωγή από το Π1 στο Π2. Για να αποφασίσουµε αν κάποιο
x είναι θετικό στιγµιότυπο του Π1, υπολογίζουµε το R(x) και, αποδεχόµαστε το x, αν
και µόνο αν R(x) Œ Π2. Το R(x) υπολογίζεται σε πολυωνυµικό χρόνο και έχει µήκος
πολυωνυµικό ως προς το |x|. Εποµένως, µια DTM που αποφασίζει το Π2µπορεί να
αποφασίσει αν το R(x) Œ Π2 σε πολυωνυµικό χρόνο ως προς το |x|.
240 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞

7.6
Αφού το Π είναι πλήρες για τη C, κάθε πρόβληµα Π¢ Œ C ανάγεται στο Π Œ C¢.
Αφού η C