Aλγόριθµοι και Πολυπλοκότητα
Σηµείωση Το ΕΑΠ είναι υπεύθυνο για την επιµέλεια έκδοσης και την ανάπτυξη των κειµένων σύµφωνα µε τη Μεθοδολογία της εξ Αποστάσεως Εκπαίδευσης. Για την επιστηµονική αρτιότητα και πληρότητα των συγγραµµάτων την αποκλειστική ευθύνη φέρουν οι συγγραφείς, κριτικοί αναγνώστες και ακαδηµαϊκοί υπεύθυνοι που ανέλαβαν το έργο αυτό.
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ Σχολή Θετικών Επιστηµών και Τεχνολογίας Πρόγραµµα Σπουδών
ΠΛHPOΦOPIKH Θεµατική Ενότητα
ΘΕMΕΛΙΩΣΕΙΣ ΕΠΙΣΤΗΜΗΣ Η/Υ Τόµος A'
Aλγόριθµοι και Πολυπλοκότητα ∆ΗΜΗΤΡΙΟΣ ΦΩΤΑΚΗΣ
ΠΑΥΛΟΣ ΣΠΥΡΑΚΗΣ
∆ρ Mηχανικός H/Y & Πληροφορικής
Kαθηγητής Tµήµατος Mηχ. H/Y & Πληροφορικής Πανεπιστηµίου Πατρών
ΠATPA 2001
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ Σχολή Θετικών Επιστηµών και Τεχνολογίας Πρόγραµµα Σπουδών ΠΛHPOΦOPIKH Θεµατική Ενότητα ΘΕΜΕΛΙΩΣΕΙΣ ΕΠΙΣΤΗΜΗΣ Η/Υ Τόµος A' Aλγόριθµοι και Πολυπλοκότητα Συγγραφή ∆HMHTPIOΣ ΦΩTAKHΣ ∆ρ Mηχανικός H/Y & Πληροφορικής
ΠAYΛOΣ ΣΠYPAKHΣ 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ποτελεσµατικότητα αλγορίθµων 1.4.1 Aσυµπτωτική εκτίµηση
................................................................................................
22
..........................................................................................................
22
1.4.2 Aνάλυση αλγορίθµων ............................................................................................................... 24 1.4.3 Aνάλυση χειρότερης και µέσης περίπτωσης 1.5
........................................................
26
......................................................................................
27
...................................................................................................................................................................................
29
Aνάγκη για αποδοτικούς αλγόριθµους
Σύνοψη
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συµπτωτικός συµβολισµός σε µαθηµατικές εκφράσεις 2.2
Aθροίσµατα
.........................
42
.......................................................................................................................................................
43
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
6
2.2.1 Mαθηµατική επαγωγή
..............................................................................................................
44
2.2.2 Yπολογισµός φραγµάτων ...................................................................................................... 45 2.3
Aναδροµικές εξισώσεις ........................................................................................................................... 46 .....................................................................
47
..............................................................................................................
50
2.3.1 Παράδειγµα αναδροµικού αλγορίθµου 2.3.2 Mέθοδος επανάληψης
2.3.3 Mέθοδος αντικατάστασης ..................................................................................................... 52 ................................................................................................................
54
...................................................................................................................................................................................
56
2.3.4 Θεώρηµα κυριαρχίας Σύνοψη
Bιβλιογραφία ..................................................................................................................................................................... 57 K∂º∞§∞π√ 3
¢È·›ÚÂÈ Î·È B·Û›Ï¢Â
Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά, Eισαγωγικές παρατηρήσεις .................................................................................................................................... 59 3.1
Quicksort
.............................................................................................................................................................
3.1.1 Xρήση τυχαιότητας και ανάλυση µέσης τιµής
...................................................
Tο πρόβληµα της επιλογής
67
..................................................................................................................
69
3.2.1 Nτετερµινιστική επιλογή σε γραµµικό χρόνο 3.3
.....................................................
71
Πολλαπλασιασµός αριθµών και πινάκων ................................................................................ 76 3.3.1 Πολλαπλασιασµός διδιάστατων πινάκων
3.4
64
.....................................
3.1.2 Eλάχιστος χρόνος εκτέλεσης αλγορίθµων διάταξης 3.2
61
...............................................................
77
Πολυώνυµα και FFT .................................................................................................................................. 79 ...................................
82
...................................................................................................................................................................................
87
3.4.1 ∆ιακριτός µετασχηµατισµός Fourier (DFT) και FFT Σύνοψη
Bιβλιογραφία ..................................................................................................................................................................... 88 K∂º∞§∞π√ 4
¢˘Ó·ÌÈÎfi˜ ÚÔÁÚ·ÌÌ·ÙÈÛÌfi˜
Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά, Eισαγωγικές παρατηρήσεις .................................................................................................................................... 89
¶EPEXOMENA
7
4.1
Πολλαπλασιασµός ακολουθίας πινάκων
4.2
Xαρακτηριστικά του δυναµικού προγραµµατισµού
4.2
Mεγαλύτερη κοινή υπακολουθία
.................................................................................
91
......................................................
96
....................................................................................................
98
Σύνοψη ................................................................................................................................................................................ 103 Bιβλιογραφία .................................................................................................................................................................. 104 K∂º∞§∞π√ 5
ÕÏËÛÙÔÈ ·ÏÁfiÚÈıÌÔÈ
Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά, Eισαγωγικές παρατηρήσεις ................................................................................................................................ 105 5.1
Eπιλογή ανταγωνιστικών δραστηριοτήτων
........................................................................
107
5.1.1 Aπόδειξη ορθότητας ............................................................................................................... 109 5.2
Xαρακτηριστικά της µεθόδου της απληστίας 5.2.1 Iδιότητα της άπληστης επιλογής
...................................................................
112
..................................................................................
112
5.2.2 Iδιότητα βέλτιστων επιµέρους δοµών
.....................................................................
5.2.3 Mέθοδος απληστίας και δυναµικός προγραµµατισµός 5.3
............................
113
.........................................................................
116
................................................................................................................
119
Συµπίεση δεδοµένων – Kώδικας Huffman 5.3.1 O κώδικας Huffman
113
Σύνοψη ................................................................................................................................................................................ 124 Bιβλιογραφία .................................................................................................................................................................. 125 K∂º∞§∞π√ 6
AÏÁfiÚÈıÌÔÈ ÂÍÂÚ‡ÓËÛ˘ ÁÚ·ÊËÌ¿ÙˆÓ
Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά, Eισαγωγικές παρατηρήσεις ................................................................................................................................ 127 6.1
...........................................................................
129
............................................................................................
133
....................................................................................................................
135
........................................................................................................................................
138
Oρισµοί και αναπαράσταση γραφηµάτων 6.1.1 Αναπαράσταση γραφηµάτων
6.2
Ψάξιµο πρώτα σε πλάτος
6.3
Ψάξιµο σε βάθος
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
8
Σύνοψη ................................................................................................................................................................................ 144 Bιβλιογραφία .................................................................................................................................................................. 144 K∂º∞§∞π√ 7
EÈÛ·ÁˆÁ‹ ÛÙËÓ ˘ÔÏÔÁÈÛÙÈ΋ ÔÏ˘ÏÔÎfiÙËÙ·
Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά, Eισαγωγικές παρατηρήσεις ................................................................................................................................ 145 7.1
Aλγόριθµοι και προβλήµατα
...........................................................................................................
146
7.1.1 Eυεπίλυτα και δυσεπίλυτα προβλήµατα ................................................................ 149 7.2
Nτετερµινιστικές µηχανές Turing
...............................................................................................
7.2.1 Λειτουργικά χαρακτηριστικά των µηχανών Turing 7.2.2 Kαθολικές µηχανές Turing
....................................
153
...............................................................................................
155
7.2.3 Γλώσσες που αποφασίζονται από µηχανές Turing 7.3
......................................
157
Xρονική πολυπλοκότητα και η κλάση P ............................................................................... 158 7.3.1 Iεραρχία κλάσεων χρονικής πολυπλοκότητας 7.3.2 H κλάση P
7.4
151
.................................................
159
.......................................................................................................................................
162
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
8.3
NP–πληρότητα
................................................................................................................................................... ............................................................................................................................................
177 179
¶EPEXOMENA
9
8.3.1 NP – πλήρη προβλήµατα ...................................................................................................... 182 Σύνοψη ................................................................................................................................................................................ 189 Bιβλιογραφία .................................................................................................................................................................. 190 .........................................................................................
191
.......................................................................................................................
217
..........................................................................................................................................................................
243
Aπαντήσεις Aσκήσεων Aυτοαξιολόγησης Απαντήσεις ∆ραστηριοτήτων Γλωσσάρι
¶ÚfiÏÔÁÔ˜ Αυτό το βιβλίο αποτελεί µία σύντοµη εισαγωγή στη Θεωρία Αλγορίθµων και στη Θεωρία Υπολογιστικής Πολυπλοκότητας. Και τα δύο αυτά πεδία της Επιστήµης των Υπολογιστών έχουν να επιδείξουν µερικά πολύ σηµαντικά επιτεύγµατα και γνωρίζουν µεγάλη άνθηση τα τελευταία χρόνια. Για να λυθεί ένα οποιοδήποτε πρακτικό πρόβληµα από έναν Ηλεκτρονικό Υπολογιστή πρέπει πρώτα να αποδελτιωθούν τα χαρακτηριστικά του προβλήµατος και, µε βάση αυτά, να διατυπωθεί το αντίστοιχο υπολογιστικό πρόβληµα, δηλαδή ένα πρότυπο µαθηµατικό πρόβληµα που συγκεντρώνει όλα τα χαρακτηριστικά του αρχικού. Με βάση το µαθηµατικό/υπολογιστικό πρόβληµα, πρέπει να σχεδιαστεί ένας αλγόριθµος και να αναλυθεί η συµπεριφορά του για συνθήκες παρόµοιες µε αυτές που εµφανίζονται στην πράξη. Αν η απόδοση του αλγόριθµου είναι ικανοποιητική, µπορούµε να προχωρήσουµε στην υλοποίηση και την εφαρµογή του. ∆ιαφορετικά, πρέπει να σχεδιάσουµε έναν τροποποιηµένο αλγόριθµο, ο οποίος θα επιτυγχάνει ικανοποιητική απόδοση. Η Θεωρία Αλγορίθµων είναι η περιοχή της Επιστήµης των Υπολογιστών που πραγµατεύεται το σχεδιασµό αποδοτικών αλγορίθµων για την επίλυση υπολογιστικών προβληµάτων. Κάθε αλγόριθµος πρέπει να αναλύεται µαθηµατικά, ώστε να τεκµηριώνεται η ορθότητά του και να µετριέται ποσοτικά η απόδοσή του σε σχέση µε διάφορα είδη υπολογιστικών πόρων, όπως είναι ο χρόνος και η µνήµη. Με αυτό τον τρόπο, οποιοσδήποτε χρειαστεί να εφαρµόσει τον αλγόριθµο θα είναι σίγουρος για την ορθότητα των αποτελεσµάτων του και θα γνωρίζει ακριβώς την ποσότητα των υπολογιστικών πόρων που απαιτεί η εφαρµογή του αλγόριθµου σε συγκεκριµένες συνθήκες. Επιπλέον, τα αποτελέσµατα της ανάλυσης διαφορετικών αλγόριθµων για το ίδιο ή παρόµοια προβλήµατα επιτρέπουν τη σύγκριση µεταξύ τους και την επιλογή του καταλληλότερου για συγκεκριµένες πρακτικές εφαρµογές. Η Θεωρία Αλγορίθµων εφοδιάζει τους σχεδιαστές συστηµάτων λογισµικού µε ένα µεγάλο αριθµό αλγόριθµων για την αποδοτική επίλυση των πιο συνηθισµένων προβληµάτων, όπως αυτά της διάταξης, της αναζήτησης, της επιλογής στοιχείων, κλπ. Επιπλέον, εφοδιάζει τους σχεδιαστές αλγόριθµων µε ένα σύνολο τεχνικών και µεθόδων για το σχεδιασµό και την ανάλυση αποδοτικών αλγόριθµων για προβλήµατα που εµφανίζονται στην πράξη και δεν έχουν αντιµετωπιστεί ικανοποιητικά. Σε αυτό το βιβλίο προσπαθήσαµε να παρουσιάσουµε τόσο µερικά παραδείγµατα αποδοτικών αλγόριθµων για την επίλυση µερικών θεµελιωδών υπολογιστικών προβληµάτων, όσο και µερικές από τις πιο δηµοφιλείς και επιτυχηµένες µεθόδους σχεδιασµού και ανάλυσης αλγόριθµων.
12
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
Παρά τις σηµαντικές προόδους της Θεωρίας Αλγορίθµων και τις επίµονες και µακροχρόνιες προσπάθειες πλήθους ικανών επιστηµόνων, υπάρχουν πολλά σηµαντικά προβλήµατα για τα οποία δεν έχουµε κατορθώσει να σχεδιάσουµε αποδοτικούς αλγόριθµους. Η Θεωρία Υπολογιστικής Πολυπλοκότητας αναπτύχθηκε για να µελετήσει τους λόγους για τους οποίους κάποια υπολογιστικά προβλήµατα είναι δύσκολο ή αδύνατο να λυθούν από έναν Υπολογιστή. Η Θεωρία Υπολογιστικής Πολυπλοκότητας εστιάζει στη µελέτη διαφορετικών υπολογιστικών µοντέλων και στην επίδραση που αυτά έχουν στη δυνατότητα και στην ποσότητα υπολογιστικών πόρων που χρειάζονται για την επίλυση ενός προβλήµατος. Για κάθε υπολογιστικό µοντέλο, η Θεωρία Υπολογιστικής Πολυπλοκότητας µελετά αν ένα υπολογιστικό πρόβληµα µπορεί να επιλυθεί ή όχι. Αν το πρόβληµα µπορεί να επιλυθεί, η Θεωρία Πολυπλοκότητας µελετά την ελάχιστη ποσότητα υπολογιστικών πόρων που απαιτούνται για την επίλυση του προβλήµατος στο συγκεκριµένο µοντέλο. Με βάση τις απαντήσεις στα παραπάνω ερωτήµατα, τα υπολογιστικά προβλήµατα εντάσσονται σε κλάσεις πολυπλοκότητας, οι οποίες αποτελούνται από προβλήµατα που εµφανίζουν παρόµοια συµπεριφορά ως προς την επιλυσιµότητά τους σε κάποιο συγκεκριµένο υπολογιστικό µοντέλο. Η Θεωρία Υπολογιστικής Πολυπλοκότητας µας εφοδιάζει µε ένα σηµαντικό αριθµό κλάσεων πολυπλοκότητας, στις οποίες έχουν ενταχθεί πολλά συνηθισµένα υπολογιστικά προβλήµατα. Επιπλέον, µας εφοδιάζει µε τεχνικές και µεθόδους για την ένταξη και νέων υπολογιστικών προβληµάτων σε αυτές τις κλάσεις πολυπλοκότητας. Έχοντας εντάξει ένα πρόβληµα σε µία κλάση πολυπλοκότητας, γνωρίζουµε κατά πόσον υπάρχει αποδοτικός αλγόριθµος για την επίλυση αυτού του προβλήµατος. Εποµένως, µία από τις αλγοριθµικές εφαρµογές της Υπολογιστικής Πολυπλοκότητας είναι ότι συχνά µας επιτρέπει να αποφύγουµε τη µάταια αναζήτηση αποδοτικών αλγόριθµων για προβλήµατα για τα οποία εικάζεται ή έχει αποδειχθεί ότι τέτοιοι αλγόριθµοι δεν υπάρχουν. Οι παραπάνω εισαγωγικές παρατηρήσεις θέτουν σε γενικές γραµµές το πλαίσιο που κινείται αυτό το βιβλίο. Η ύλη που καλύπτεται στο βιβλίο έχει χωρισθεί σε οκτώ κεφάλαια, τα δύο πρώτα από τα οποία µπορούν να χαρακτηρισθούν εισαγωγικά, τα τέσσερα επόµενα καλύπτουν αλγοριθµικά θέµατα, και τα δύο τελευταία ζητήµατα από τη Θεωρία Πολυπλοκότητας. Το βιβλίο έχει γραφεί ώστε η µελέτη του να προϋποθέτει µόνο µια στοιχειώδη εξοικείωση µε κάποιες θεµελιώδεις µαθηµατικές έννοιες και τεχνικές από την πλευρά του αναγνώστη. Όλες οι έννοιες της Θεωρίας Αλγορίθµων και της Θεωρίας Υπολογιστικής Πολυπλοκότητας ορίζονται την πρώτη φορά που χρησιµοποιούνται, ενώ σε ειδικό κεφάλαιο, περιγράφονται αναλυτικά οι βασι-
¶ƒ√§√°√™
κές µαθηµατικές τεχνικές που χρησιµοποιούνται στην ανάλυση αλγόριθµων. Από τα εισαγωγικά κεφάλαια, το Κεφάλαιο 1 εισάγει τον αναγνώστη στην έννοια του αλγόριθµου και εξηγεί τις έννοιες του σχεδιασµού, της ανάλυσης και της αποτελεσµατικότητας ενός αλγόριθµου, ενώ προσδιορίζει και έναν τρόπο αναπαράστασης των αλγόριθµων που θα παρουσιαστούν στη συνέχεια του βιβλίου. Το Κεφάλαιο 2 παρουσιάζει τα βασικά µαθηµατικά εργαλεία που χρησιµοποιούνται για το σχεδιασµό και την ανάλυση των αλγορίθµων. Τα Κεφάλαια 3, 4 και 5 εστιάζουν σε τρεις βασικές, γενικές µεθόδους σχεδιασµού αλγορίθµων: τη µέθοδο του «∆ιαίρει και Βασίλευε», τη µέθοδο του ∆υναµικού Προγραµµατισµού και τη µέθοδο της Απληστίας. Για κάθε µέθοδο, αναλύονται τα βασικά χαρακτηριστικά της µεθόδου και των προβληµάτων που µπορούν να επιλυθούν αποτελεσµατικά µε αυτή, και παρουσιάζονται παραδείγµατα αλγόριθµων που ακολουθούν αυτή τη µέθοδο και επιλύουν σηµαντικά πρακτικά προβλήµατα. Το Κεφάλαιο 6 εισάγει τον αναγνώστη στη µαθηµατική οντότητα του γραφήµατος, η οποία παίζει κεντρικό ρόλο στη µοντελοποίηση πολλών σηµαντικών πρακτικών προβληµάτων, και παρουσιάζει δύο θεµελιώδεις αλγοριθµικές τεχνικές, αυτές του Ψαξίµατος Πρώτα σε Πλάτος και του Ψαξίµατος Πρώτα σε Βάθος, για την εξερεύνηση και τον έλεγχο γραφηµάτων για συγκεκριµένες ιδιότητες. Τα Κεφάλαια 7 και 8 αποτελούν µία εισαγωγή στη Θεωρία Υπολογιστικής Πολυπλοκότητας. Στο Κεφάλαιο 7 ορίζεται η έννοια του προβλήµατος απόφασης και η αντιστοιχία αυτών των προβληµάτων µε τις τυπικές γλώσσες, το υπολογιστικό µοντέλο των Ντετερµινιστικών Μηχανών Turing, οι πιο σηµαντικές κλάσεις πολυπλοκότητας περιορισµένου ντετερµινιστικού χρόνου και οι κεντρικές έννοιες της αναγωγής µεταξύ υπολογιστικών προβληµάτων και της πληρότητας ενός προβλήµατος για µία κλάση πολυπλοκότητας. Στο Κεφάλαιο 8 παρουσιάζεται η έννοια του µη ντετερµινισµού, ορίζεται το υπολογιστικό µοντέλο των Μη Ντετερµινιστικών Μηχανών Turing και γίνεται µία σύντοµη εισαγωγή στη Θεωρία της NP – πληρότητας, ένα από τα πιο σηµαντικά επιτεύγµατα της Θεωρίας Υπολογιστικής Πολυπλοκότητας. Κλείνοντας αυτό το σύντοµο εισαγωγικό σηµείωµα, θα θέλαµε να εκφράσουµε τις ευχαριστίες µας σε όλους τους συνεργάτες και συναδέλφους µας που βοήθησαν στην ολοκλήρωση αυτού του βιβλίου. Ιδιαίτερα θα θέλαµε να ευχαριστήσουµε τον Καθηγητή κ. Παναγιώτη Πυντέλα, που υπήρξε ο Ακαδηµαϊκός Υπεύθυνος για την επιστηµονική επιµέλεια αυτού του βιβλίου, τον Επίκουρο Καθηγητή κ. ∆ηµήτρη Καββαδία, ο οποίος µε την προσεκτική του ανάγνωση και τα σχόλιά του συνεισέφερε
13
14
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
σηµαντικά στην ουσιαστική βελτίωση της ποιότητας αυτού του τόµου, και τον Αναπληρωτή Καθηγητή κ. Θανάση Χατζηλάκο, ο οποίος βοήθησε σηµαντικά στο να εκδοθεί αυτό το βιβλίο στην παρούσα του µορφή. Παύλος Σπυράκης ∆ηµήτρης Φωτάκης Πάτρα, Ιούνιος 2001
∫
EÈÛ·ÁˆÁÈΤ˜ ¤ÓÓÔȘ ™ÎÔfi˜
∂
1 º
Σκοπός αυτού του κεφαλαίου είναι να οριστούν οι βασικές έννοιες του αλγόριθµου, του προβλήµατος και του στιγµιότυπου, της ανάλυσης των αλγορίθµων, της αρχής του αναλλοίωτου και της ασυµπτωτικής εκτίµησης, οι οποίες θα χρησιµοποιηθούν στη συνέχεια του βιβλίου. ¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù· Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση: • Να περιγράφει απλούς αλγορίθµους σε ψευδοκώδικα και να εξηγεί τη λειτουργία απλών αλγορίθµων που έχουν περιγραφεί σε ψευδοκώδικα. • Να επιλέγει τον καταλληλότερο αλγόριθµο για µια συγκεκριµένη κατηγορία στιγµιότυπων. • Να δίνει µια ασυµπτωτική εκτίµηση χρόνου εκτέλεσης για απλούς αλγορίθµους. ŒÓÓÔȘ ÎÏÂȉȿ • αλγόριθµος • πρόβληµα, στιγµιότυπο και µέγεθος στιγµιότυπου • αρχή του αναλλοίωτου και ασυµπτω-
τική εκτίµηση • ανάλυση αλγορίθµων • ανάλυση χειρότερης και µέσης περίπτωσης
∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ Ένας αποδοτικός αλγόριθµος πρέπει να κάνει ακριβώς αυτό που έχει σχεδιαστεί να κάνει, µε το µικρότερο δυνατό κόστος. Αν και υπάρχουν µια σειρά από τεχνικές και µεθοδολογίες που βοηθούν στο σχεδιασµό αλγορίθµων για διάφορες κατηγορίες προβληµάτων, ο σχεδιασµός ενός αποδοτικού αλγορίθµου είναι συχνά µια πολύ δύσκολη υπόθεση. Μετά το σχεδιασµό του αλγορίθµου, που συνήθως ολοκληρώνεται µε την περιγραφή του σε ψευδοκώδικα, ο σχεδιαστής πρέπει να ελέγξει την ορθότητα του αλγορίθµου, δηλαδή το αν ο αλγόριθµος πραγµατικά κάνει τη δουλειά για την οποία έχει σχεδιαστεί.
∞
§
∞
π
√
KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™
16
Η επιβεβαίωση της ορθότητας ανοίγει το δρόµο για την ανάλυση του αλγορίθµου, δηλαδή για τον προσδιορισµό των υπολογιστικών πόρων που απαιτεί η εκτέλεση του αλγορίθµου. Μεταξύ άλλων, η ανάλυση αφορά στο χρόνο εκτέλεσης του αλγορίθµου. Επειδή µεγαλύτερα στιγµιότυπα ενός προβλήµατος είναι πάντα δυσκολότερο να λυθούν, οι πόροι που καταναλώνει ο αλγόριθµος προσδιορίζονται σαν αύξουσα συνάρτηση του µεγέθους του στιγµιότυπου εισόδου. Η ανάλυση ενός αλγορίθµου συχνά απαιτεί τη χρήση µαθηµατικών τεχνικών για την επίλυση αναδροµικών εξισώσεων, την εύρεση κλειστών τύπων αθροισµάτων, κλπ. Τα αποτελέσµατα της ανάλυσης τεκµηριώνουν την αποδοτικότητα του αλγορίθµου. Ένα τελευταίο στάδιο είναι ο προσδιορισµός κάτω φραγµάτων στην αποδοτικότητα των αλγορίθµων για ένα συγκεκριµένο πρόβληµα. Ο προσδιορισµός ενός κάτω φράγµατος επιτρέπει στο σχεδιαστή να γνωρίζει το βαθµό στον οποίο µπορεί να βελτιωθεί η αποδοτικότητα των αλγορίθµων για το προς επίλυση πρόβληµα. Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες: 1.1. Τι είναι αλγόριθµος; 1.2. Αναπαράσταση αλγόριθµων 1.3. Προβλήµατα και στιγµιότυπα 1.4. Αποτελεσµατικότητα αλγόριθµων 1.5. Ανάγκη για αποδοτικούς αλγόριθµους
1.1 ∆π ∂π¡∞π ∞§°√ƒπ£ª√™;
1.1 ∆È ∂›Ó·È ·ÏÁfiÚÈıÌÔ˜;
Το Λεξικό της Οξφόρδης (Concise Oxford Dictionary) ορίζει ως αλγόριθµο µια διαδικασία ή ένα σύνολο κανόνων µε σκοπό τον υπολογισµό (ιδιαίτερα το µηχανιστικό υπολογισµό). Η εκτέλεση ενός αλγορίθµου δεν θα πρέπει, εποµένως, να απαιτεί τη χρήση της διαίσθησης ή της δηµιουργικότητας, µολονότι τα όρια µεταξύ αλγορίθµων και ανθρώπινων σχεδίων προς εκτέλεση είναι όλο και περισσότερο δυσδιάκριτα, π.χ. η χρήση τυχαιότητας στους αλγορίθµους. Κάθε αλγόριθµος δέχεται ένα σύνολο δεδοµένων εισόδου (input), τα οποία µετασχηµατίζει σε ένα σύνολο δεδοµένων εξόδου (output). Εποµένως, ένας αλγόριθµος µπορεί να θεωρηθεί και σαν ένα εργαλείο για την επίλυση ενός υπολογιστικού προβλήµατος, όπου ο ορισµός του προβλήµατος καθορίζει την επιθυµητή σχέση µεταξύ των δεδοµένων εισόδου και εξόδου. Στο βιβλίο αυτό µε τον όρο αλγόριθµος θα εννοούµε µια «συνταγή» ή ένα καθορισµένο σύνολο κανόνων ή οδηγιών για την επίλυση ενός υπολογιστικού προβλήµατος. Κατά νου θα έχουµε ότι το έργο αυτό θα εκτελεσθεί µέσω µίας εξελιγµένης υπολογιστικής µηχανής (ενός Υπολογιστή – Computer). Όπως συµβαίνει µε κάθε συνηθισµένη «συνταγή», ένας αλγόριθµος πρέπει να έχει πεπερασµένη περιγραφή και να οδηγεί στην επίλυση του προβλήµατος ύστερα από την εκτέλεση πεπερασµένου αριθµού βηµάτων. Όχι νωρίτερα από το 1930, διάφοροι µαθηµατικοί ορισµοί της έννοιας µιας «πεπερασµένης υπολογιστικής διαδικασίας» δόθηκαν από τους Church, Godel, Herbrand, Kleene, Post, Turing, και άλλους. Οι ορισµοί αυτοί είχαν ως βάση µεθόδους που επιφανειακά εµφανίζονταν πολύ διαφορετικές µεταξύ τους (π.χ. τυπικά συστήµατα επεξεργασίας συµβόλων, ιδανικά µοντέλα υπολογιστικών µηχανών). Όµως, όλοι οι ορισµοί αυτοί καταλήγουν στο να είναι ισοδύναµοι, µε την έννοια ότι όλες οι «µορφές» αλγορίθµων υπολογίζουν την ίδια κατηγορία συναρτήσεων, η οποία είναι ακριβώς η κατηγορία των µερικώς αναδροµικών συναρτήσεων (partial recursive functions). Μέχρι τώρα, και παρά τις προόδους της τεχνολογίας, το σύνολο της εµπειρίας µας καταδεικνύει ότι η κλάση των συναρτήσεων αυτών είναι ακριβώς ότι µπορεί να υπολογισθεί συστηµατικά (από υπολογιστές, προγράµµατα, ή πεπερασµένες διαδικασίες). Οι µέθοδοι πολλαπλασιασµού και διαίρεσης (πολυψηφίων) αριθµών που µαθαίνουµε στο σχολείο είναι αλγόριθµοι, αφού αποτελούν µία «συνταγή» για τον µετασχηµατισµό ενός ζεύγους αριθµών στο γινόµενό τους και στο πηλίκο τους αντίστοιχα. Ο πλέον γνωστός ιστορικά αλγόριθµος είναι ο αλγόριθµος του Ευκλείδη για τον υπολογισµό του Μέγιστου Κοινού ∆ιαιρέτη δύο ακεραίων. Οι αλγόριθµοι είναι λοιπόν οι συνταγές µε βάση τις οποίες οι υπολογιστές απαντούν
17
KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™
18
σε προβλήµατα. Η επιλογή ενός αλγορίθµου για κάποιο πρόβληµα εξαρτάται από πολλούς παράγοντες: το µέγεθος του στιγµιότυπου (δηλ. της συγκεκριµένης µορφής) του προβλήµατος, τον τρόπο αναπαράστασης του προβλήµατος, την ταχύτητα και το µέγεθος της µνήµης, καθώς και τη διαθεσιµότητα άλλων υπολογιστικών πόρων (αριθµό επεξεργαστών, δίκτυο κλπ.). ¶·Ú¿‰ÂÈÁÌ·1.1 ∞ÏÁfiÚÈıÌÔ˜ ÔÏÏ·Ï·ÛÈ·ÛÌÔ‡ Έστω ότι πρέπει να πολλαπλασιάσουµε δύο θετικούς ακεραίους µε χρήση µόνο στυλό και χαρτιού. Το ∆ηµοτικό Σχολείο µάς διδάσκει να πολλαπλασιάσουµε τον ένα από τους αριθµούς (τον «µεγαλύτερο» σε µήκος, τον πολλαπλασιαστέο) διαδοχικά µε κάθε ψηφίο του πολλαπλασιαστή από δεξιά προς τα αριστερά. Έπειτα, γράφουµε το κάθε ενδιάµεσο αποτέλεσµα κάτω από το προηγούµενο, κάθε φορά µετατοπίζοντας µια θέση αριστερά. Τέλος, προσθέτουµε κατά στήλη (µε κρατούµενα) για να βρούµε το σωστό αποτέλεσµα. Αυτός είναι ο «κλασσικός» αλγόριθµος πολλαπλασιασµού. Υπάρχουν και άλλοι τρόποι, π.χ. ο πολλαπλασιασµός a la russe: Γράψτε τον πολλαπλασιαστέο και τον πολλαπλασιαστή δίπλα – δίπλα. ∆ηµιουργήστε δύο στήλες (µία για κάθε αριθµό), επαναλαµβάνοντας τον εξής κανόνα, έως ότου ο αριθµός κάτω από τον πολλαπλασιαστέο γίνει 1: Γράψτε στη στήλη κάτω από τον πολλαπλασιαστέο το ακέραιο πηλίκο του τελευταίου αριθµού δια 2 (αγνοώντας το υπόλοιπο), και γράψτε στη στήλη κάτω από τον πολλαπλασιαστή το διπλάσιο του τελευταίου αριθµού (προσθέτοντάς τον στον εαυτό του). Στο τέλος, όταν δηλαδή ο αριθµός κάτω από τον πολλαπλασιαστέο γίνει 1, σβήστε κάθε γραµµή στην οποία ο αριθµός στη στήλη του πολλαπλασιαστέου είναι ζυγός και έπειτα, προσθέστε τους αριθµούς που παραµένουν στη στήλη του πολλαπλασιαστή. Ο Πίνακας 1.1 απεικονίζει τη διαδικασία πολλαπλασιασµού a la russe για τον υπολογισµό του 19 ¥ 45 = 855. ¶›Ó·Î·˜ 1.1
Παράδειγµα πολλαπλασιασµού a la russe. 45 22 11 5 2 1
19 38 76 152 304 608 855
(σβήνω)
(σβήνω)
1 . 2 ∞ ¡ ∞ ¶ ∞ ƒ∞ ™ ∆∞ ™ ∏ ∞ § ° √ ƒ π £ ª ø ¡
Αυτός ο αλγόριθµος είναι κατά βάση ό,τι χρησιµοποιείται σήµερα στο 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
19
KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™
20
που σηµαίνει ότι η οµάδα εντολών <εντολή 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 αριθµών, η είσοδος
KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™
22
είναι µία n – άδα αριθµών, η έξοδος είναι επίσης µία n – άδα αριθµών και, επιπλέον, η έξοδος πρέπει να είναι µία αναδιάταξη των αριθµών εισόδου σε αύξουσα σειρά. Έχοντας ορίσει τη µορφή των δεδοµένων εισόδου, κάθε έγκυρο σύνολο δεδοµένων εισόδου αποτελεί ένα στιγµιότυπο του προβλήµατος. Έτσι, κάθε ζεύγος φυσικών αριθµών είναι ένα στιγµιότυπο του προβλήµατος του πολλαπλασιασµού και κάθε n – άδα αριθµών είναι ένα στιγµιότυπο για το πρόβληµα της διάταξης n αριθµών. Τα προβλήµατα που ενδιαφέρουν τη Θεωρία Αλγορίθµων έχουν άπειρο αριθµό στιγµιότυπων. Ένας αλγόριθµος πρέπει να λειτουργεί σωστά, δηλαδή να δίνει σωστές απαντήσεις, για όλα τα στιγµιότυπα του προβλήµατος το οποίο λύνει. Για να δείξει κάποιος ότι ένας αλγόριθµος είναι λανθασµένος, αρκεί να βρει ένα στιγµιότυπο του προβλήµατος για το οποίο ο αλγόριθµος δίνει λάθος αποτέλεσµα. Από την άλλη πλευρά, συνήθως, είναι δυσκολότερο να δείξει κάποιος ότι ένας αλγόριθµος είναι σωστός, αφού απαιτείται µαθηµατική απόδειξη ότι ο αλγόριθµος δίνει σωστό αποτέλεσµα για όλα τα στιγµιότυπα του προβλήµατος. 1.4 ∞ÔÙÂÏÂÛÌ·ÙÈÎfiÙËÙ· ·ÏÁÔÚ›ıÌˆÓ 1.4.1 ∞Û˘ÌÙˆÙÈ΋ ÂÎÙ›ÌËÛË
Έστω ότι για ένα πρόβληµα υπάρχουν περισσότεροι από ένας αλγόριθµοι που το λύνουν. Ποιον θα επιλέξουµε; Ποιος είναι ο καλύτερος; Η εµπειρική απάντηση είναι να τους προγραµµατίσουµε όλους σε κάποια γλώσσα προγραµµατισµού, να τους δοκιµάσουµε και να επιλέξουµε. Η θεωρητική απάντηση (την οποία αυτό το βιβλίο υπηρετεί) έγκειται στο να προσδιορίσουµε µε µαθηµατικό τρόπο την ποσότητα των απαραίτητων πόρων για την εκτέλεση του αλγορίθµου (π.χ. µνήµη, χρόνος εκτέλεσης, αριθµός επεξεργαστών, κλπ.) ως συνάρτηση του µεγέθους του στιγµιότυπου εισόδου. Το µέγεθος ενός στιγµιότυπου ενός προβλήµατος αντιστοιχεί τυπικά στον αριθµό των δυαδικών ψηφίων (bits) που απαιτούνται για να αναπαρασταθεί το στιγµιότυπο στη µνήµη του υπολογιστή. Στην πραγµατικότητα, για να διευκολυνθούµε στον προσδιορισµό των πόρων που απαιτούνται για την εκτέλεση ενός αλγορίθµου, χρησιµοποιούµε σαν µέγεθος ενός στιγµιότυπου µία ποσότητα που αποτελεί µέτρο των συνιστωσών του. Για παράδειγµα, στο πρόβληµα της διάταξης φυσικών αριθµών, συνήθως, θεωρούµε ότι η αναπαράσταση ενός φυσικού αριθµού έχει µοναδιαίο µέγεθος (π.χ. µια θέση µνήµης). Έτσι, το µέγεθος ενός στιγµιότυπου που περιλαµβάνει n αριθµούς είναι n, ακόµα και αν η αναπαράσταση ενός ακεραίου µπορεί να χρειάζεται περισσότερα του ενός bit. Από την άλλη πλευρά, το µέγεθος των αριθµητικών προβληµάτων καθορί-
1 . 4 ∞ ¶ √ ∆ ∂ § ∂ ™ ª ∞∆ π ∫ √ ∆ ∏ ∆∞ ∞ § ° √ ƒ π £ ª ø ¡
ζεται συνήθως µε βάση τον αριθµό των 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) στο µέγεθος της
23
KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™
24
εισόδου. Όταν το 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
φορές και
j =2
n
τα βήµατα (4) και (5) εκτελούνται
 (t
j
- 1) φορές. Επειδή το βήµα (3) εκτελείται
j =2
τουλάχιστον µία φορά, είναι 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];
Σύµφωνα µε την αρχή του αναλλοίωτου, µπορούµε να θεωρήσουµε ότι το κόστος κάθε βήµατος είναι ίσο µε µια σταθερά που εξαρτάται από την υλοποίηση. Εποµένως, για να έχουµε µια ασυµπτωτική εκτίµηση του χρόνου εκτέλεσης του αλγορίθ-
KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™
26
n
µου αρκεί να υπολογίσουµε την ποσότητα
Ât
j
, η οποία αποτελεί και µέτρο των
j =2
συγκρίσεων µεταξύ φυσικών αριθµών που εκτελεί ο αλγόριθµος insertion sort. Ο µικρότερος χρόνος εκτέλεσης για τον αλγόριθµο insertion sort επιτυγχάνεται όταν οι αριθµοί του πίνακα εισόδου είναι ήδη διατεταγµένοι σε αύξουσα σειρά. Τότε, για n
κάθε 2 £ j £ n, tj = 1. Εποµένως, σε αυτή την περίπτωση
Ât
j
= n - 1 , και ο χρόνος
j =2
εκτέλεσης του αλγορίθµου insertion sort είναι γραµµικός στο µέγεθος της εισόδου. Ο µεγαλύτερος χρόνος εκτέλεσης για τον αλγόριθµο insertion sort επιτυγχάνεται όταν ο πίνακας εισόδου είναι διατεταγµένος σε γνήσια φθίνουσα σειρά. Τότε, σε κάθε επανάληψη j, το στοιχείο Α[j + 1] πρέπει να µπει στη θέση Α[1], και το βήµα n
(3) θα εκτελεστεί j φορές (tj = j). Σε αυτή την περίπτωση
n
Ât = Â j = j
j =2
j =2
n(n + 1) -1 . 2
Εποµένως, στη χειρότερη περίπτωση ο χρόνος εκτέλεσης του αλγορίθµου 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), τεκµηριώθηκε η αναγκαιότητα για ποσοτικό προσδιορισµό των πόρων που απαιτεί η εκτέλεση ενός αλγορίθµου, παρουσιάστηκε η έννοια της ασυµπτωτικής ανάλυσης των αλγορίθµων, ορίστηκε η ανάλυση µέσης και χειρότερης περίπτωσης, και προσδιορίστηκε ο χρόνος εκτέλεσης µερικών στοιχειωδών αλγορίθµων.
KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™
30
µÈ‚ÏÈÔÁÚ·Ê›·
Τα περισσότερα βιβλία για Θεωρία Αλγόριθµων καλύπτουν σε ικανοποιητικό βαθµό σηµαντικά υπερσύνολο της ύλης που παρουσιάζεται σε αυτό το βιβλίο. Μια εξαιρετική σε έκταση και βάθος παρουσίαση της Θεωρίας Αλγόριθµων γίνεται στο βιβλίο: [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
[7] Φ. Αφράτη και Γ. Παπαγεωργίου. Αλγόριθµοι: Μέθοδοι Σχεδίασης και Ανάλυση Πολυπλοκότητας. Εκδόσεις Συµµετρία. [8] Θ. Παπαθεοδώρου. Αλγόριθµοι: Εισαγωγικά Θέµατα και Παραδείγµατα. Εκδόσεις Πανεπιστηµίου Πατρών, 1999.
31
∫
ª·ıËÌ·ÙÈÎfi ˘fi‚·ıÚÔ ™ÎÔfi˜
∂
2 º
Σκοπός αυτού του κεφαλαίου είναι ο ορισµός του συµβολισµού που χρησιµοποιείται για την ασυµπτωτική εκτίµηση, και η παρουσίαση µερικών µεθόδων για τον υπολογισµό αθροισµάτων και την επίλυση αναδροµικών εξισώσεων, τα οποία είναι µαθηµατικά προβλήµατα που συχνά ανακύπτουν κατά την ανάλυση των αλγορίθµων. ¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù· Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση: • Να ορίσει και να χρησιµοποιήσει τον ασυµπτωτικό συµβολισµό. • Να συγκρίνει την τάξη µεγέθους δύο συναρτήσεων µε χρήση του ασυµπτωτικού συµβολισµού. • Να προσδιορίσει την τάξη µεγέθους αθροισµάτων ενδιάµεσου βαθµού δυσκολίας. • Να υπολογίσει ακριβείς ασυµπτωτικές εκτιµήσεις για τη λύση απλών αναδροµικών εξισώσεων. ŒÓÓÔȘ ÎÏÂȉȿ • ασυµπτωτικός συµβολισµός (Θ, Ο, Ω, ο, ω – συµβολισµοί) • µέθοδοι υπολογισµού αθροισµάτων (µαθηµατική επαγωγή, υπολογισµός φραγµάτων) • αναδροµικός αλγόριθµος
• αναδροµική εξίσωση • µέθοδοι επίλυσης αναδροµικών εξισώσεων (επανάληψη, δέντρο της αναδροµής, αντικατάσταση, Θεώρηµα της Κυριαρχίας)
∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ Η ανάλυση των αλγορίθµων διευκολύνεται και, συχνά, βασίζεται στη χρήση µαθηµατικών εργαλείων. Μερικά από αυτά τα εργαλεία είναι απλά και γνωστά, όπως για παράδειγµα, ο υπολογισµός του κλειστού τύπου απλών αθροισµάτων, ενώ άλλα µπορεί να µοιάζουν καινούργια και δυσκολότερα, όπως για παράδειγµα, ο ασυµπτωτικός συµβολισµός και η επίλυση αναδροµικών εξισώσεων. Η κατανόηση και η εξοικείωση µε το συµβολισµό και τις µαθηµατικές τεχνικές που
∞
§
∞
π
√
K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
34
χρησιµοποιούνται στην ανάλυση των αλγορίθµων επιτρέπει να επικεντρώνουµε στην ουσία του σχεδιασµού του αλγορίθµου και να εντοπίζουµε τα χαρακτηριστικά εκείνα που κάνουν τον αλγόριθµο αποδοτικό. ∆ιαφορετικά, η προσπάθεια της αποκωδικοποίησης των µαθηµατικών λεπτοµερειών και συµβόλων αποσπά την προσοχή µας από τις ουσιώδεις αλγοριθµικές ιδέες, που αποτελούν το κλειδί για την αποδοτική επίλυση των προβληµάτων. Σε αυτό το κεφάλαιο εισάγεται ο συµβολισµός και παρουσιάζονται τα µαθηµατικά εργαλεία που, συνήθως, χρησιµοποιούνται στην ανάλυση των αλγορίθµων. Η κατανόηση των παραδειγµάτων που µελετώνται είναι σηµαντική, αφού αρκετά από αυτά ανακύπτουν στην ανάλυση αλγορίθµων που θα µελετήσουµε στη συνέχεια. Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες: 2.1. Ασυµπτωτικός Συµβολισµός 2.2. Αθροίσµατα 2.3. Αναδροµικές Εξισώσεις
2.1 ∞™Àª¶∆ø∆π∫√™ ™Àªµ√§π™ª√™
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) ανήκει στην κλάση συναρτή-
35
K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
36
σεων Θ(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) c1g(n)
f(n)
f(n) c g(n)
n0 f(n)=Θ(g(n)) (α)
n
n0
n
n0
f(n)=O(g(n)) (β)
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 ∞™Àª¶∆ø∆π∫√™ ™Àªµ√§π™ª√™
Γι΄ αυτή την επιλογή παραµέτρων, είναι, για κάθε 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 i =0
a i ni , όπου τα αi είναι σταθερές και αd > 0, είναι p(n) = Θ(nd).
Επίσης, αφού κάθε σταθερά είναι ένα πολυώνυµο µηδενικού βαθµού, κάθε σταθερά µπορεί να εκφραστεί σαν Θ(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) βρίσκεται κάτω από
37
K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
38
τη 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), αφού υπάρχουν στιγµιότυπα εισόδου για τα
K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
40
οποία ο αλγόριθµος χρειάζεται τετραγωνικό χρόνο. Ανακεφαλαιώνοντας, ο χρόνος εκτέλεσης χειρότερης περίπτωσης της 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 τείνει στο άπειρο. Σε διαφορετική µαθηµατική διατύπωση, αυτό γράφεται nlim Æ•
f (n ) = 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} .
K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
42
Ένας ισοδύναµος τρόπος να διατυπωθεί ο παραπάνω ορισµός είναι ότι η συνάρτηση f(n) = ω(g(n)) αν και µόνο αν g(n) = o(f(n)). Ο συµβολισµός f(n) = ω(g(n)) δηλώνει ότι lim
nƕ
f (n ) = • , εφόσον το όριο υπάρχει. ∆ηλαδή, η συνάρτηση f(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
(β)
(log n ) 3
log(nlog( n ) )
(γ)
kn
(3k)n/3
(δ)
(kn)1– ε
n1– ε
(ε)
n3– 10n
8log n
ο
Ω
ω
Θ
3
2.2 ∞ıÚÔ›ÛÌ·Ù·
Όταν η λειτουργία ενός αλγορίθµου βασίζεται σε κατασκευές, όπως βρόγχοι for ή while, ο χρόνος εκτέλεσης του αλγορίθµου µπορεί να εκφραστεί σαν το άθροισµα των χρόνων που θα διαρκέσει η κάθε επανάληψη. Για παράδειγµα, ο αλγόριθµος insertion sort αποτελείται από ένα for βρόγχο, ο οποίος εκτελείται n – 1 φορές στη χειρότερη περίπτωση, και η j–οστή επανάληψη του βρόγχου διαρκεί χρόνο ανάλογο του j. Εποµένως, ο χρόνος εκτέλεσης χειρότερης περί-
K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
44
πτωσης του αλγορίθµου insertion sort είναι ανάλογος του αθροίσµατος
Â
n j =2
j.
Επίσης, ο αλγόριθµος selection sort (Άσκηση Αυτοαξιολόγησης 1.1) αποτελείται από ένα for βρόγχο, του οποίου η i – οστή επανάληψη χρειάζεται χρόνο ανάλογο του i. Συνεπώς, ο χρόνος εκτέλεσης του αλγορίθµου insertion sort είναι ανάλογος του αθροίσµατος
Â
n -1 i =1
(n - i + 1) .
Στη συνέχεια αυτής της ενότητας θα ανακεφαλαιώσουµε δύο γενικές τεχνικές για τον υπολογισµό και την εκτίµηση απλών αθροισµάτων. Συγκεκριµένα, θα αναφερθούµε στη χρήση µαθηµατικής επαγωγής για τον υπολογισµό γνωστών αθροισµάτων, και στον υπολογισµό φραγµάτων, ενώ πολλές φορές θα χρειαστεί να συνδυάσουµε αυτές τις τεχνικές για να έχουµε το επιθυµητό αποτέλεσµα. 2.2.1 ª·ıËÌ·ÙÈ΋ ·ÁˆÁ‹
Η µαθηµατική επαγωγή χρησιµοποιείται για να επιβεβαιώσουµε ήδη γνωστά αποτελέσµατα, ή αποτελέσµατα που έχουν προκύψει µε άλλες τεχνικές. Για παράδειγµα, έστω το άθροισµα
Â
n -1 i =1
(n - i + 1) , το οποίο ανέκυψε κατά την ανάλυση του
αλγορίθµου selection sort. Μια απλή ανάπτυξη του αθροίσµατος δίνει Ê (n - i + 1) = n + (n - 1) + (n - 2 ) + L + 3 + 2 = Á Ë i =1
n -1
Â
n
ˆ
 i˜¯ - 1 . i =1
¢Ú·ÛÙËÚÈfiÙËÙ· 2.3 Χρησιµοποιείστε µαθηµατική επαγωγή για να επιβεβαιώσετε ότι
Â
n i =1
(n - i + 1) =
Â
n i =1
i .
Στην ανάλυση της selection sort χρησιµοποιήσαµε απ’ ευθείας το γεγονός ότι n
Âi = i =1
n(n + 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
Εποµένως, η ισότητα
Âi = i =1
n(n + 1) είναι αληθής για κάθε τιµή του n. 2
2.2.2 ÀÔÏÔÁÈÛÌfi˜ ÊÚ·ÁÌ¿ÙˆÓ
Μερικές φορές δεν γνωρίζουµε το αποτέλεσµα του αθροίσµατος ώστε να εφαρµόσουµε απ’ ευθείας µαθηµατική επαγωγή. Σε αυτή την περίπτωση πρέπει να βγάλουµε κάποια συµπεράσµατα για τη µορφή του κλειστού τύπου του αθροίσµατος, πριν τον υπολογίσουµε ακριβώς. Μία µέθοδος για την εξαγωγή συµπερασµάτων σχετικά µε τον κλειστό τύπο του αθροίσµατος είναι ο υπολογισµός άνω και κάτω φραγµάτων. Ας υποθέσουµε ότι θέλουµε να υπολογίσουµε το άθροισµα Q(n) = φανώς, το Q(n) = Ω(n2). Επιπλέον, αν θεωρήσουµε µόνο τους όρους
Â
n i =1
i 2 . Προ-
για i ≥ n/2, µπορούµε να υπολογίσουµε το ακόλουθο κάτω φράγµα για το Q(n): n
n
Âi ≥ Ân 2
i = n/2
Επίσης, ισχύει ότι
Â
n i =1
i2 £
2
i = n/2
Â
n i =1
/ 4 = n 3 / 8 = W (n 3 )
.
n2 = n 3 . Εποµένως, Q(n) = Θ(n3).
Έχοντας αυτό σαν δεδοµένο, είναι εύλογο να υποθέσουµε ότι ο κλειστός τύπος του 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 Αυτό το γραµµικό σύστηµα τεσσάρων εξισώσεων µε τέσσερις αγνώστους έχει µονα-
K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
46
δικές λύσεις τις Α = 1/3, Β = 1/2, C = 1/6, και D = 0. Συνεπώς, ένας υποψήφιος κλειστός τύπος για το άθροισµα Q(n) είναι: n
Â
i2 =
i = n/2
n 3 n2 n 2n 3 + 3n2 + n n(n + 1)( 2n + 1) + + +0= = . 3 2 6 6 6
Έχοντας έναν υποψήφιο κλειστό τύπο για το άθροισµα Q(n), µπορούµε να χρησιµοποιήσουµε µαθηµατική επαγωγή για να αποδείξουµε την ορθότητα του ισχυρισµού µας. ¢Ú·ÛÙËÚÈfiÙËÙ· 2.4 Χρησιµοποιείστε µαθηµατική επαγωγή για να επιβεβαιώσετε ότι
Â
n i =1
i2 =
n(n + 1)( 2n + 1) . 6
¢Ú·ÛÙËÚÈfiÙËÙ· 2.5 ∆είξτε ότι
Â
n
1 i 2 = O (1) .
i =1
ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 2.3 Υπολογίστε τον κλειστό τύπο του αθροίσµατος C (n ) =
Â
n i =1
i3 .
ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 2.4 Αποδείξτε ότι
Â
n i =0
3i £ c ¥ 3 n , για κάποια σταθερά c ≥ 1. Ποιά είναι η ελάχιστη
τιµή του c για την οποία ισχύει η ανισότητα; Αποδείξτε την αντίστοιχη ανισότητα, όταν αντί του 3 έχετε µια οποιαδήποτε σταθερά a > 1 . 2.3 ∞Ó·‰ÚÔÌÈΤ˜ ÂÍÈÛÒÛÂȘ
Οι αναδροµικές εξισώσεις εµφανίζονται κατά την ανάλυση αναδροµικών αλγορίθµων, δηλαδή αλγορίθµων οι οποίοι λειτουργούν καλώντας τον εαυτό τους. Οι αναδροµικοί αλγόριθµοι εφαρµόζουν την τεχνική «διαίρει και βασίλευε» (divide and
2.3 ∞¡∞¢ƒ√ªπ∫∂™ ∂•π™ø™∂π™
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),
47
K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
48
όπου 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]
[5, 2, 4, 8]
[5, 2]
[4, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 3, 7, 6]
[1, 3]
[7, 6]
[2, 4, 5, 8]
[2, 5]
[4, 8]
[1, 3, 6, 7]
[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) T (n ) = Ì ÔÓT ( În / 2û ) + T ( Èn / 2ù ) + Q (n )
αν n = 1, αν n > 1.
K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
50
Μία άλλη τεχνική λεπτοµέρεια που συχνά θα αγνοούµε είναι οι αρχικές συνθήκες της αναδροµικής εξίσωσης. Ο λόγος είναι ότι, για τις περισσότερες περιπτώσεις, οι αλγόριθµοι που θα αναλύσουµε έχουν T(n) = Θ(1), για µικρές τιµές του n, και ο προσδιορισµός συγκεκριµένης σταθεράς για τις αρχικές συνθήκες δεν επηρεάζει την ασυµπτωτική συµπεριφορά του T(n). 2.3.2 ª¤ıÔ‰Ô˜ ·ӿÏ˄˘
Η βασική ιδέα της µεθόδου της επανάληψης (iteration method) είναι να εκφράσουµε την αναδροµική εξίσωση σαν άθροισµα, αναπτύσσοντάς την και, στη συνέχεια, να υπολογίσουµε τον κλειστό τύπο του αθροίσµατος. Για παράδειγµα, ας θεωρήσουµε την παρακάτω αναδροµική εξίσωση, η οποία έχει τη µορφή της εξίσωσης που περιγράφει το χρόνο εκτέλεσης της merge sort. Ï2 T (n ) = Ì Ó2T (n / 2 ) + n
αν n = 2, αν n = 2 k , k > 1.
Η υπόθεση ότι το n πρέπει να είναι δύναµη 2 γίνεται για να αποφύγουµε την περίπτωση που το n/2 δεν είναι ακέραιος. Αναπτύσσοντας την αναδροµική εξίσωση έχουµε: T (n ) = n + 2T (n / 2 ) 2n + 22 T ( n / 4 ) 2 2n 22 n =n+ + + 2 4 T (n / 8 ) 2 4 M =n+
2n 22 n 2i -1 n + + L + i -1 + 2i T (n / 2i ) 2 4 2 i i = ni + 2 T (n / 2 ) =n+
Θέτοντας 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 i =0
1 < 2 σαν άθροισµα όρων γεωµετρικής προόδου µε λόγο 1/2, 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
Το δέντρο της αναδροµής για την εξίσωση T(n) = 2T(n/2) + n2.
...
...
+
Σύνολο: Θ(n2)
¢Ú·ÛÙËÚÈfiÙËÙ· 2.8 Με χρήση του δέντρου της αναδροµής, δώστε µια ακριβή ασυµπτωτική εκτίµηση της λύσης της αναδροµικής εξίσωσης T (n ) = 4T ( În / 2û ) + n
K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
52
ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 2.5 Λύστε την παρακάτω αναδροµική εξίσωση χρησιµοποιώντας τη µέθοδο της επανάληψης. Ï1 T (n ) = Ì ÓT (n / 2 ) + 1
αν n = 1, αν n = 2 k , k ≥ 1 .
2.3.3 ª¤ıÔ‰Ô˜ ·ÓÙÈηٿÛÙ·Û˘
Η βασική ιδέα της µεθόδου της αντικατάστασης (substitution method) είναι να µαντέψουµε τη µορφή της λύσης και να χρησιµοποιήσουµε µαθηµατική επαγωγή για να υπολογίσουµε µε ακρίβεια τις σταθερές, όταν αυτό απαιτείται, και να αποδείξουµε ότι η λύση είναι σωστή. Η µέθοδος είναι ισχυρή και απλή, αλλά µπορεί να εφαρµοστεί µόνο στις περιπτώσεις που µπορούµε να µαντέψουµε τη µορφή της λύσης. Επιπλέον, η µέθοδος της αντικατάστασης µπορεί να εφαρµοστεί για την απόδειξη ασυµπτωτικών εκτιµήσεων σχετικά µε τη λύση µιας αναδροµικής εξίσωσης. Σε περιπτώσεις που δεν φαίνεται εύκολο να µαντέψουµε τη µορφή της λύσης, µπορούµε να εφαρµόσουµε τη µέθοδο της επανάληψης, υπολογίζοντας απλώς κάποια φράγµατα στο άθροισµα που προκύπτει. Στη συνέχεια, µπορούµε να χρησιµοποιήσουµε αυτά τα φράγµατα για την εφαρµογή της µεθόδου της αντικατάστασης. Για παράδειγµα, ας θεωρήσουµε την αναδροµική εξίσωση T(n) = 2T(n/2) + Θ(n), που δίνει το χρόνο εκτέλεσης χειρότερης περίπτωσης για τη merge sort. Έχουµε δει ότι η εξίσωση Ï2 T ' (n ) = Ì Ó2T ' (n / 2 ) + n
αν n = 2, αν 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ˆ T (n ) £ 2Á c2 log ˜ + c2 n 2¯ Ë 2 £ c2 n(log n - 1) + c2 n = c2 n log n ,
και
Ê n nˆ T (n ) ≥ 2Á c1 log ˜ + c1n 2¯ Ë 2 ≥ c1n(log n - 1) + c1n = 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 πρέπει να επιλεγεί αρκετά µεγάλη, ώστε να πληρούνται οι αρχικές συνθήκες.
K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
54
ÕÛÎËÛË 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). Το Θεώρηµα της Κυριαρχίας διακρίνει τις ακόλουθες τρεις περιπτώσεις:
( ( ) ) 2. Αν f(n) = Q (n ) , τότε T(n) = Q (n log n) . 3. Αν f(n) = W (n ) , για κάποια σταθερά ε > 0, και αν υπάρχει σταθερά n , 1. Αν f(n) = O nlog b a - e , για κάποια σταθερά ε > 0, τότε T(n) = Q nlog b a . log b a
log b a + e
log b a
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
K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
56
ÕÛÎËÛË 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
µÈ‚ÏÈÔÁÚ·Ê›·
Όλα τα βιβλία που αναφέρθηκαν στην αντίστοιχη παράγραφο του προηγούµενου κεφαλαίου καλύπτουν το υλικό αυτού του κεφαλαίου παρουσιάζοντας το µαθηµατικό υπόβαθρο που απαιτείται για την ανάλυση απλών συνδυαστικών αλγόριθµων. Για περαιτέρω ανάγνωση, προτείνεται το παρακάτω βιβλίο: [1] C.L. Liu. Introduction to Combinatorial Mathematics. McGraw – Hill, 1968. Αν και παλιό, διαπραγµατεύεται µε εξαιρετικό τρόπο όλες τις θεµελιώδεις έννοιες και τεχνικές των ∆ιακριτών Μαθηµατικών, επικεντρώνει στην ουσία, και έχει πολύ καλή συλλογή από λυµένα παραδείγµατα και ασκήσεις.
57
∫
¢È·›ÚÂÈ Î·È µ·Û›Ï¢ ™ÎÔfi˜
∂
3 º
Σκοπός αυτού του κεφαλαίου είναι η αναλυτική παρουσίαση της µεθόδου σχεδιασµού αλγορίθµων «διαίρει και βασίλευε». Η παρουσίαση της µεθόδου γίνεται µέσα από παραδείγµατα αλγορίθµων που επιλύουν προβλήµατα προερχόµενα από διαφορετικά πεδία, ώστε να τονισθεί η σηµασία, η αποτελεσµατικότητα και το ευρύ φάσµα εφαρµογών της µεθόδου. ¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù· Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση: • Να εφαρµόζει τη µέθοδο «διαίρει και βασίλευε» για την επίλυση προβληµάτων ενδιάµεσου βαθµού δυσκολίας. • Να εφαρµόζει, να συνθέτει ή να τροποποιεί γνωστούς αλγορίθµους για την επίλυση άλλων απλών προβληµάτων. • Να υπολογίζει κάτω φράγµατα στο χρόνο εκτέλεσης χειρότερης περίπτωσης αλγορίθµων που επιλύουν απλά προβλήµατα. ŒÓÓÔȘ ÎÏÂȉȿ • µέθοδος «διαίρει και βασίλευε» • δέντρο συγκρίσεων • πρόβληµα της επιλογής • ντετερµινιστικός και πιθανοτικός
αλγόριθµος • αναπαράσταση πολυωνύµων µε συντελεστές και µε ζεύγη σηµείων – τιµών • διακριτός µετασχηµατισµός Fourier και FFT
∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ Στο προηγούµενο κεφάλαιο, είδαµε µερικά παραδείγµατα αναδροµικών αλγορίθµων, των οποίων η λειτουργία βασίζεται στη µέθοδο «διαίρει και βασίλευε» (divide and conquer). Η ιδέα του «διαίρει και βασίλευε» παρέχει µια απλή και ισχυρή τεχνική σχεδιασµού αλγορίθµων, η οποία βρίσκει εφαρµογή σε πληθώρα προβληµάτων από διαφορετικά πεδία (π.χ. προβλήµατα διάταξης, πολλαπλασιασµού πινάκων, πολλαπλασιασµού πολυωνύµων, µετασχηµατισµός Fourier).
∞
§
∞
π
√
KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
60
Η µέθοδος του «διαίρει και βασίλευε» συνίσταται στη διάσπαση του στιγµιότυπου εισόδου σε µικρότερα, επιµέρους στιγµιότυπα του ίδιου προβλήµατος, στην επίλυση των επιµέρους στιγµιότυπων και στον υπολογισµό µιας λύσης για το αρχικό στιγµιότυπο εισόδου από τις λύσεις των επιµέρους στιγµιότυπων. Η επίλυση των επιµέρους στιγµιότυπων, συνήθως, γίνεται µε επίκληση του ίδιου αλγορίθµου. Σε αυτές τις περιπτώσεις, το αποτέλεσµα της µεθόδου «διαίρει και βασίλευε» είναι ένας αναδροµικός αλγόριθµος. Μερικές φορές, όταν το µέγεθος των επιµέρους στιγµιότυπων γίνει αρκετά µικρό, είναι προτιµότερη η εφαρµογή κάποιου άλλου, µη αναδροµικού αλγορίθµου, για την επίλυση των επιµέρους στιγµιότυπων. Η µέθοδος «διαίρει και βασίλευε» βρίσκει εφαρµογή σε όσα προβλήµατα η λύση ενός αρχικού στιγµιότυπου εισόδου µπορεί να συντεθεί από τις λύσεις επιµέρους στιγµιότυπων, που έχουν προέλθει από τη διάσπαση του αρχικού. Για παράδειγµα, στον αλγόριθµο διάταξης merge sort, κατασκευάζουµε τη διατεταγµένη ακολουθία εξόδου από τις δύο διατεταγµένες, επιµέρους ακολουθίες, που έχουν προέλθει από τη διαίρεση της (µη διατεταγµένης) ακολουθίας εισόδου. Η διάταξη των επιµέρους ακολουθιών γίνεται µε την αναδροµική εφαρµογή του αλγορίθµου merge sort. Εκτός από την απλότητα στη σύλληψη και την εφαρµογή, ένα σηµαντικό πλεονέκτηµα της µεθόδου «διαίρει και βασίλευε» είναι ότι οδηγεί σε αλγορίθµους που είναι εύκολο να αναλυθούν. Η ανάλυση ενός αλγορίθµου που βασίζεται στη µέθοδο «διαίρει και βασίλευε» συνίσταται στη διατύπωση και την επίλυση της αναδροµικής εξίσωσης που διέπει τη λειτουργία του αλγορίθµου. Η αναδροµική εξίσωση, συνήθως, προκύπτει απευθείας από την ιδέα στην οποία βασίζεται ο αλγόριθµος. Επιπλέον, είναι γνωστά πολλά ισχυρά µαθηµατικά εργαλεία για την επίλυση αναδροµικών εξισώσεων. Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες: 3.1. Quicksort 3.2. Το πρόβληµα της επιλογής 3.3. Πολλαπλασιασµός αριθµών και πινάκων 3.4. Πολυώνυµα και FFT
3.1 QUICKSORT
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].
61
KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
62
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).
KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
64
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), έχουµε: 1 S (n ) = Q (n ) + n -1
n -1
Â( i =1
)
2 S (i ) + S (n - i ) = Q (n ) + n -1
n -1
 S (i ) . i =1
Προφανώς, S(n) = Ω(n log n) και S(n) = O(n2), αφού ο µέσος χρόνος εκτέλεσης πρέ-
KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
66
πει να βρίσκεται µεταξύ της καλύτερης και της χειρότερης περίπτωσης. Έστω 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 στην αναδροµική εξίσωση, έχουµε: 16 c S (n ) £ cn + n -1 £ cn +
n -1
 i log i i =1
16 c Ê n(n - 1) log n n(n - 2 ) ˆ Á ˜ n -1 Ë 2 8 ¯
£ 8 cn log n , για κάθε n ≥ 3, όπου στη δεύτερη ανισότητα χρησιµοποιήσαµε το γεγονός ότι n -1
 i log i £ i =1
n(n - 1) log n n(n - 2 ) . 2 8
Για να αποδείξουµε το παραπάνω φράγµα, χρειάζεται να χωρίσουµε το άθροισµα
Â
n -1 i =1
i log i σε δύο µέρη. n -1
n / 2 -1
i =1
i =1
n -1
 i log i =  i log i +  i log i i = n/2
£ (log n - 1) = log n £
n / 2 -1
n -1
i =1
i = n/2
 i + log n  i
n -1
n / 2 -1
i =1
i =1
Âi - Â i
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 αριθµούς.
KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
68
a1£a2 Nαι
Όχι
a2£a3 Nαι ™¯‹Ì· 3.1
Το δέντρο συγκρίσεων της insertion sort για 3 αριθµούς.
a1£a3 Όχι
Nαι
a1£a3
a1, a2, a3 Nαι a1, a3, a2
Όχι a2£a3
a2, a1, a3 Όχι
Nαι
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);
KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
70
Μια απάντηση σε αυτό το ερώτηµα προκύπτει από την επανεξέταση της λειτουργίας της 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
1 S (n ) = Q (n ) + n -1
n -1
 S (max{i, n - i}) 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, κλπ. Πράγµατι, αντικαθιστώντας στην αναδροµική εξίσωση, έχουµε: S (n ) £ cn +
n -1
Â
2 4 ci n - 1 i = n/2
= cn +
n -1 n / 2 -1 ˆ 8c Ê i i˜ Á n - 1 Ë i =1 i =1 ¯
= cn +
8 c Ê n(n - 1) n(n - 2 ) ˆ Á ˜ n -1 Ë 2 8 ¯
 Â
8 c n(3n - 2 ) ◊ n -1 8 £ cn + 3 cn = 4 cn .
£ 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 ÙÔ ÔÔ›Ô ı· ÔÚÁ·Óˆı›
KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
72
Ë ‰È·›ÚÂÛË ÙÔ˘ ∞[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
Οµάδες
[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η γραµµή. Επιπλέον, η θέση
3
KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
74
των στηλών είναι τέτοια ώστε το ενδιάµεσο στοιχείο µιας στήλης να µην είναι µεγαλύτερο από το ενδιάµεσο στοιχείο της επόµενης. Συνεπώς, το ενδιάµεσο στοιχείο του δείγµατος βρίσκεται στην (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 5 6 10 11
™¯‹Ì· 3.2
Το µέγεθος του µικρότερου υποπίνακα είναι τουλάχιστον 3n/10.
1 2 7 9 15
... ... ... ... ...
3 8 12 13 14
x
... ... ... ... ...
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 στα οποία έχουµε αντιστοιχήσει θετικά βάρη w1, w2, …, wn τέτοια ώστε
Â
n i =1
wi = 1 . Το πρόβληµα της εύρεσης του βεβαρυµένου
ενδιάµεσου
στοιχείου
(weighted median) είναι να βρεθεί ένα στοιχείο xk που ικανοποιεί τις σχέσεις:
 w £ 2 , και  w £ 2 1
1
i
xi < xk
i
xi > xk
Σηµειώστε ότι τα στοιχεία x1, …, xn δεν είναι διατεταγµένα. Αποδείξτε ότι: • Το ενδιάµεσο στοιχείο των x1, …, xn είναι ίδιο µε το βεβαρυµένο ενδιάµεσο στοιχείο, όταν τα βάρη wi = 1/n, i = 1, 2, …, n. • Το βεβαρυµένο ενδιάµεσο στοιχείο µπορεί να υπολογιστεί σε χρόνο O(n log n) διατάσσοντας την ακολουθία x1, …, xn .
KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
76
• Το βεβαρυµένο ενδιάµεσο στοιχείο µπορεί να υπολογιστεί σε γραµµικό χρόνο χρησιµοποιώντας έναν «διαίρει και βασίλευε» αλγόριθµο γραµµικού χρόνου για τον υπολογισµό του ενδιάµεσου στοιχείου ενός πίνακα.
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 ¶√§§∞¶§∞™π∞™ª√™ ∞ƒπ£ªø¡ ∫∞π ¶π¡∞∫ø¡
είναι ίσο µε 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 ik
kj
, i = 1,..., n, j = 1,..., n .
k =1
Κάθε στοιχείο του πίνακα C µπορεί να υπολογιστεί µε βάση τον παραπάνω τύπο σε Θ(n)
77
KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
78
χρόνο, και αφού ο C έχει n2 στοιχεία, ο χρόνος εκτέλεσης του αλγορίθµου είναι Θ(n3). Στα τέλη της δεκαετίας του 1960, ο V. Strassen παρουσίασε έναν αλγόριθµο για τον πολλαπλασιασµό δύο πινάκων µε χρόνο εκτέλεσης O(nlog 7) = O(n2.81). Ο αλγόριθµος αυτός χρησιµοποιεί τη µέθοδο «διαίρει και βασίλευε» µε έµµεσο τρόπο, όπως και ο αλγόριθµος πολλαπλασιασµού πολυψηφίων αριθµών που παρουσιάστηκε στην προηγούµενη ενότητα. Υποθέτουµε ότι το n είναι ζυγός. Τότε ο καθένας από τους πίνακες Α, Β και C µπορεί να διαιρεθεί σε τέσσερις υποπίνακες µεγέθους n/2 ¥ n/2 ως εξής: ÈA A = Í 11 Î A21
È B11 A12 ù ú , B=Í A22 û Î B21
ÈC11 C12 ù B12 ù ú , kai C = Í ú , 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
Σε αυτή την ενότητα θα περιγράψουµε αλγορίθµους για την εκτέλεση πράξεων πολυωνύµων, όπως πρόσθεση, πολλαπλασιασµός και υπολογισµός τιµών. Έστω A( x ) =
Â
n -1 i =0
ai x i και B( x ) =
Â
n -1 i =0
bi x i πολυώνυµα βαθµού (n – 1). Το
άθροισµα δύο πολυωνύµων A(x) και B(x) βαθµού (n – 1) είναι ένα πολυώνυµο βαθµού (n – 1) C ( x ) =
Â
n -1 i =0
ci x i , το οποίο έχει συντελεστές ci = αi + bi. Το γινόµενο
δύο πολυωνύµων A(x) και B(x) βαθµού (n – 1) είναι ένα πολυώνυµο βαθµού (2n – 2) C ( x ) =
Â
2 n-2 i =0
ci x i , το οποίο έχει συντελεστές ci =
Â
i j =0
a j bi - j . Η τιµή ενός
πολυωνύµου στο σηµείο x0 προκύπτει αν όπου x αντικαταστήσουµε την τιµή x0, και κάνουµε τις αριθµητικές πράξεις. Ο απλούστερος τρόπος για να αναπαρασταθεί ένα πολυώνυµο είναι µε το διάνυσµα των συντελεστών τουA=[α0, α1, …, αn–1]. Αυτή η µέθοδος ονοµάζεται αναπαράστα-
KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
80
ση µε τους συντελεστές (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
b0,b1...,bn–1 Yπολογισµός σε (2n–1) σηµεία Θ(n log n)
Aναπαράσταση µε συντελεστές
Παρεµβολή σε (2n–1) σηµεία Θ(n log n) ™¯‹Ì· 3.3
A(zi),B(zi), 0 £i £ 2n–2
Πολλαπλασιασµός Θ(n)
C(zi)=A(zi)B(zi), Aναπαράσταση µε 0 £i £ 2n–2 ζεύγη σηµείων - τιµών
Για να πολλαπλασιάσουµε δύο πολυώνυµα σε Θ(n log n) χρόνο, αρχικά υπολογίζουµε τις τιµές τους σε 2n σηµεία, στη συνέχεια εφαρµόζουµε το γραµµικό αλγό-
Αλγόριθµος πολλαπλασιασµού πολυωνύµων σε χρόνο Θ(n log n).
KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
82
ριθµο πολλαπλασιασµού για πολυώνυµα που αναπαρίστανται µε ζεύγη σηµείων – τιµών και, τέλος, µε χρήση παρεµβολής σε 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
Οι µιγαδικές ρίζες της µονάδας για n = 8.
ω58
ω68 –i
ω78
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 k 2 2 pik / n 2 ) = e 2 pik /( n / 2 ) = w nk / 2 . – 1, έχουµε (w n ) = (e
Επιπλέον, (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, όπου, για κάθε k = 0, 1, …, n – 1, είναι y k =
Â
n -1 j =0
a jw nkj . ∆ηλαδή, το
διάνυσµα A µπορεί να θεωρηθεί σαν το διάνυσµα των συντελεστών ενός πολυωνύµου A( x ) =
Â
n -1 i =0
ai x i , και κάθε στοιχείο yk του διανύσµατος Y είναι η τιµή του
πολυωνύµου Α(x) στο σηµείο w nk , δηλαδή στην k στη σειρά n – οστή ρίζα της µονάδας.
KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
84
Γρήγορος Μετασχηµατισµός 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
της µονάδας, πρέπει να λύσουµε το σύστηµα εξισώσεων y k = A(w nk ) =
Â
n -1 j =0
a jw nkj ,
για κάθε k = 0, 1, …, n – 1. ∆ηλαδή, πρέπει να λύσουµε το σύστηµα n εξισώσεων µε n αγνώστους Y = V ¥ A, όπου ο πίνακας V έχει µέγεθος n ¥ n και V [ k , j] = w nkj . Συγκεκριµένα, È y0 ù ú Í Í y1 ú Í y2 ú ú Í Í y3 ú ÍM ú ú Í ÍÎ y n -1 úû
=
È1 1 1 1 Í 2 wn w n3 Í1 w n Í1 w n2 w n4 w n6 Í 3 w n6 w n9 Í1 w n ÍM M M M Í 3( n -1) 2 ( n -1) n -1 wn wn ÍÎ1 w n
ù K 1 ú n -1 K wn ú K w n2 ( n -1) ú ú K w n3( n -1) ú ú O M ú K w n( n -1)( n -1) úû
È a0 ù ú Í Í a1 ú Í a2 ú ú Í Í a3 ú ÍM ú ú Í ÍÎ 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 είναι ίσο µε: (VV -1 )[ k , j] =
n -1
Â
1 w nkmw n- jm n m=0 n -1
Â
=
1 w nm( k - j ) n m=0
=
1 (w nk - j )m n m=0
n -1
Â
Αν 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
 m=0
(w nq )m =
(w nq ) n - 1 (w nn ) q - 1 (1) q - 1 = = q = 0, w nq - 1 w nq - 1 wn -1
όπου χρησιµοποιήσαµε το γεγονός ότι το αρχικό άθροισµα αποτελείται από τους n πρώτους όρους γεωµετρικής προόδου. Άρα, για κάθε k π j, (VV–1)[k, j]=0 και ο πίνακας V– 1 µε στοιχεία V -1[ k , j] = w n- kj / n είναι όντως ο αντίστροφος πίνακας του V.
KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
86
Εποµένως, οι συντελεστές του πολυωνύµου A(x) δίνονται από τον τύπο
Â
ak = (1 / n )
n -1 j =0
y jw n- kj , για κάθε 0 £ k £ n – 1, ο οποίος µοιάζει πολύ µε αυτόν του
υπολογισµού των τιµών 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
™‡ÓÔ„Ë Σε αυτό το κεφάλαιο παρουσιάστηκε αναλυτικά η µέθοδος «διαίρει και βασίλευε» µέσα από παραδείγµατα αλγορίθµων. Αρχικά, παρουσιάστηκε ο αλγόριθµος quicksort για τη διάταξη ενός πίνακα αριθµών. Η quicksort επιλέγει ένα στοιχείο x του πίνακα και διαιρεί τον πίνακα εισόδου σε δύο υποπίνακες, ώστε κανένα στοιχείο του ενός να µην ξεπερνά το x και κανένα στοιχείο του δεύτερου να µην είναι µικρότερο από το x. Η βασική ντετερµινιστική εκδοχή της quicksort έχει χρόνο εκτέλεσης Ω(n log n) και Ο(n2), ενώ η πιθανοτική εκδοχή της quicksort έχει χρόνο εκτέλεσης µέσης περίπτωσης Θ(n log n). Επίσης, αποδείξαµε ότι κάθε ντετερµινιστικός αλγόριθµος, του οποίου η λειτουργία βασίζεται σε συγκρίσεις µεταξύ των στοιχείων εισόδου, χρειάζεται (στη χειρότερη περίπτωση) χρόνο Ω(n log n) για να διατάξει έναν πίνακα n στοιχείων. Στη συνέχεια, είδαµε έναν πιθανοτικό και έναν ντετερµινιστικό αλγόριθµο γραµµικού χρόνου για το πρόβληµα της επιλογής. Η λειτουργία και των δύο αλγορίθµων βασίζεται στην ιδέα της διαίρεσης του πίνακα εισόδου µε βάση ένα στοιχείο και στην αναδροµική επίλυση του προβλήµατος στον έναν από τους δύο υποπίνακες. Οι αλγόριθµοι διαφέρουν στον τρόπο επιλογής του στοιχείου γύρω από το οποίο οργανώνεται η διαίρεση. Η µέθοδος «διαίρει και βασίλευε» βρίσκει εφαρµογή στον πολλαπλασιασµό πολυψήφιων αριθµών, τον πολλαπλασιασµό πινάκων και στον πολλαπλασιασµό πολυωνύµων. Ειδικά για τα πολυώνυµα, είδαµε έναν αποδοτικό αλγόριθµο πολλαπλασιασµού που βασίζεται στη µετατροπή από της αναπαράσταση από διάνυσµα συντελεστών σε ζεύγη σηµείων – τιµών. Η µετατροπή γίνεται µε τον αλγόριθµο FFT, ο οποίος βασίζεται στη µέθοδο «διαίρει και βασίλευε» και υπολογίζει το ∆ιακριτό Μετασχηµατισµό Fourier ενός διανύσµατος σε χρόνο Θ(n log n).
87
KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
88
µÈ‚ÏÈÔÁÚ·Ê›·
Η µέθοδος «διαίρει και βασίλευε» καλύπτεται πολύ καλά στο: [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), όπως και η µέθοδος «διαίρει και βασίλευε», επιλύει ένα πρόβληµα συνδυάζοντας τις λύσεις κατάλληλα επιλεγµένων, επιµέρους προβληµάτων. Στην περίπτωση του δυναµικού προγραµµατισµού, ο όρος «προγραµµατισµός» περιγράφει τη διαδικασία υπολογισµού / συµπλήρωσης των στοιχείων ενός πίνακα, και όχι τη δηµιουργία ενός προγράµµατος για εκτέλεση σε υπολογιστή.
∞
§
∞
π
√
K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™
90
Όπως είδαµε στο προηγούµενο κεφάλαιο, η µέθοδος «διαίρει και βασίλευε» διαιρεί το πρόβληµα σε ανεξάρτητα επιµέρους προβλήµατα, επιλύει τα επιµέρους προβλήµατα αναδροµικά και συνδυάζει τις λύσεις τους για να υπολογίσει µια λύση για το αρχικό πρόβληµα. Η µέθοδος του δυναµικού προγραµµατισµού εφαρµόζεται όταν τα επιµέρους προβλήµατα που πρέπει να επιλυθούν δεν είναι ανεξάρτητα, αλλά τα ίδια περιέχουν κοινά επιµέρους προβλήµατα. Αυτό το χαρακτηριστικό ονοµάζεται ιδιότητα των επικαλυπτόµενων επιµέρους προβληµάτων (overlapping subproblems). Σε αυτά τα προβλήµατα, ένας αλγόριθµος «διαίρει και βασίλευε» κάνει περισσότερη δουλειά από όση χρειάζεται, αφού επιλύει πολλές φορές το ίδιο επιµέρους πρόβληµα. Αντίθετα, ένας αλγόριθµος δυναµικού προγραµµατισµού είναι πιο αποδοτικός, επειδή επιλύει µία φορά κάθε διαφορετικό επιµέρους πρόβληµα και αποθηκεύει τη λύση σε έναν πίνακα για µελλοντική χρήση. Αυτό το χαρακτηριστικό κάνει τους αλγορίθµους δυναµικού προγραµµατισµού ιδιαίτερα απαιτητικούς σε αποθηκευτικό χώρο / θέσεις µνήµης, οι οποίες χρησιµοποιούνται για την αποθήκευση των λύσεων των επιµέρους προβληµάτων. Η µέθοδος του δυναµικού προγραµµατισµού, συνήθως, εφαρµόζεται σε προβλήµατα βελτιστοποίησης (optimization problems). Ένα πρόβληµα βελτιστοποίησης έχει πολλές αποδεκτές λύσεις, σε καθεµία από τις οποίες αντιστοιχεί µία τιµή. Το ζητούµενο είναι ο υπολογισµός της λύσης µε τη βέλτιστη (µέγιστη ή ελάχιστη) τιµή. Ο δυναµικός προγραµµατισµός εφαρµόζεται σε προβλήµατα βελτιστοποίησης των οποίων οι βέλτιστες λύσεις αποτελούνται από τις βέλτιστες λύσεις συγκεκριµένων επιµέρους δοµών (optimal substructures). Ο σχεδιασµός ενός αλγορίθµου δυναµικού προγραµµατισµού για κάποιο συγκεκριµένο πρόβληµα βελτιστοποίησης, συνήθως, ακολουθεί τα παρακάτω βήµατα: Μελέτη του προβλήµατος ως προς την ιδιότητα των βέλτιστων επιµέρους δοµών και χαρακτηρισµός της δοµής µιας βέλτιστης λύσης. ∆ιατύπωση της αναδροµικής εξίσωσης που περιγράφει την τιµή µιας βέλτιστης λύσης. Υπολογισµός της τιµής µιας βέλτιστης λύσης, προχωρώντας από τα µικρότερα στα µεγαλύτερα επιµέρους προβλήµατα (bottom – up στρατηγική). Υπολογισµός µιας βέλτιστης λύσης. Το βήµα αυτό µπορεί να παραληφθεί, αν ενδιαφερόµαστε µόνο για την τιµή µιας βέλτιστης λύσης. Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες: 4.1. Πολλαπλασιασµός Ακολουθίας Πινάκων 4.2. Χαρακτηριστικά ∆υναµικού Προγραµµατισµού 4.3. Μεγαλύτερη Κοινή Υπό – Ακολουθία
4.1 ¶√§§∞¶§∞™π∞™ª√™ ∞∫√§√À£π∞™ ¶π¡∞∫ø¡
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. Υπάρχουν πέντε διαφορετικοί τρόποι να τοποθετήσουµε παρενθέσεις που καθορίζουν τη σειρά υπολογισµού αυτού του γινοµένου. Επιπλέον, κάθε διαφορετική σειρά υπολογισµού απαιτεί την εκτέλεση διαφορετικού αριθµού πολλαπλασιασµών µεταξύ στοιχείων των πινάκων. Αν θεωρήσουµε τον αριθµό των πολλαπλασιασµών στοιχείων σαν µέτρο της ταχύτητας µε την οποία υπολογίζεται το γινόµενο, η σειρά υπολογισµού καθορίζει σε σηµαντικό βαθµό την ταχύτητα. Στον παρακάτω πίνακα βλέπουµε τις πέντε διαφορετικές σειρές υπολογισµού, δηλαδή τους πέντε διαφορετικούς τρόπους µε τους οποίους µπορούν να τοποθετηθούν οι παρενθέσεις και τον αριθµό πολλαπλασιασµών στοιχείων που απαιτεί η κάθε µία.
91
K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™
92
Σειρά υπολογισµού
Αριθµός Πολλαπλασιασµών
(((Α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 ¶√§§∞¶§∞™π∞™ª√™ ∞∫√§√À£π∞™ ¶π¡∞∫ø¡
Ένας προφανής αλγόριθµος για το πρόβληµα του πολλαπλασιασµού ακολουθίας πινάκων είναι να υπολογίσουµε τον αριθµό των πολλαπλασιασµών στοιχείων για όλες τις έγκυρες τοποθετήσεις παρενθέσεων και να διαλέξουµε αυτή µε την ελάχιστη τιµή. Έστω P(n) ο αριθµός των τοποθετήσεων παρενθέσεων που θα δοκιµάσει αυτός ο αλγόριθµος για µία ακολουθία πινάκων µεγέθους n. Αφού µπορούµε να διαιρέσουµε (τοποθετώντας παρενθέσεις) την ακολουθία µεταξύ των πινάκων i και i + 1, i = 1, 2, …, n – 1, και, στη συνέχεια, να τοποθετήσουµε παρενθέσεις στις δύο επιµέρους ακολουθίες ανεξάρτητα, είναι: P (n ) =
n -1
 P (i )P (n - i ) , i =1
µε αρχική συνθήκη P(1) = 1. Μπορεί να αποδειχθεί ότι P(n) = C(n – 1), όπου C(n) είναι ο n – οστός αριθµός Catalan: C (n ) =
Ê 4n ˆ 1 Ê 2nˆ = 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 πολλαπλασιασµούς στοιχεί-
93
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) επιµέρους προβλήµατα, 2 καθένα από τα οποία µπορεί να λυθεί σε γραµµικό χρόνο.
τις τιµές 1 £ i < j £ n. ∆ηλαδή έχουµε να λύσουµε
Για να υπολογίσουµε το 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) φορές, 2 ενώ ο χρόνος εκτέλεσής του είναι Ο(n). Εποµένως, ο χρόνος εκτέλεσης του παραπάδεύτερου for – βρόγχου που σχετίζεται µε τη µεταβλητή i εκτελείται
νω αλγορίθµου είναι Ο(n3). Επίσης, ο αλγόριθµος χρησιµοποιεί Θ(n2) θέσεις µνήµης, αφού υπολογίζει και αποθηκεύει τα στοιχεία m[i, j], για κάθε 1 £ i < j £ n. ¢Ú·ÛÙËÚÈfiÙËÙ· 4.1 Παρουσιάστε τη λειτουργία της διαδικασίας MATRIX – CHAIN – MULT για το διάνυσµα διαστάσεων d = [30, 35, 15, 5, 10, 20, 25].
K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™
96
¢Ú·ÛÙËÚÈ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 2...2
3...4
2...3
3...3
4...4
2...2
1...2 4...4
1...1
2...2
3...4 3...3
3...3
1...3 4...4
1...1
2...3
1...2
3...3
2...2
3...3
1...1
2...2
Είναι συχνά δυνατόν να συνδυαστεί η αποδοτικότητα του δυναµικού προγραµµατισµού µε την ευκολία στο σχεδιασµό που προσφέρει η µέθοδος «διαίρει και βασίλευε», η οποία προχωρεί από µεγαλύτερα προς ολοένα µικρότερα επιµέρους προβλήµατα (top – down στρατηγική). Η ιδέα είναι να χρησιµοποιήσουµε έναν πίνακα επιµέρους λύσεων, αλλά η στρατηγική για τη συµπλήρωση αυτού του πίνακα να µιµείται την πορεία του αναδροµικού αλγορίθµου. Αρχικά, κάθε στοιχείο του πίνακα περιέχει µία ειδική τιµή, η οποία δηλώνει ότι το αντίστοιχο επιµέρους πρόβληµα δεν έχει επιλυθεί ακόµη. Όταν ο αναδροµικός αλγόριθµος δηµιουργήσει και επιλύσει το επιµέρους πρόβληµα για πρώτη φορά, αποθηκεύουµε τη λύση στον πίνακα των επιµέρους λύσεων. Κάθε φορά που εµφανίζεται το ίδιο επιµέρους πρόβληµα, αντί να το λύσουµε πάλι, όπως θα έκανε ο αναδροµικός αλγόριθµος, ανατρέχουµε στην αντίστοιχη εγγραφή του πίνακα των επιµέρους λύσεων, σύµφωνα µε τις επιταγές του δυναµικού προγραµµατισµού. Αυτή η τεχνική ονοµάζεται 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);
4...4
™¯‹Ì· 4.1
Οι κλήσεις του αναδροµικού αλγορίθµου υπολογισµού του m[1, 4].
K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™
98
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 ª ∂ °∞ § À ∆ ∂ ƒ ∏ ∫ √ π ¡ ∏ À ¶ ∞ ∫ √ § √ À £ π ∞
<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 δεν θα συµπεριληφθεί στην Ζ, δοκιµάζουµε και τις δύο περιπτώσεις και κρατάµε την καλύτερη. Βλέπουµε ότι το πρόβληµα της µεγαλύτερης κοινής υπακολουθίας έχει την ιδιότη-
99
K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™
100
τα των βέλτιστων επιµέρους δοµών, αφού κάθε βέλτιστη λύση για το στιγµιότυπο (Χ, Υ) περιέχει τη βέλτιστη λύση ενός από τα επιµέρους στιγµιότυπα (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 Ô αν i, j > 0 κ αι xi = y j c[i, j] = Ìc[i - 1, j - 1] + 1 Ô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], σε κάθε επανάληψη
K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™
102
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 τρόπο υπολογισµού µιας αναδροµικής εξίσωσης µε την αποθήκευση των λύσεων των επιµέρους προβληµάτων, ώστε κάθε πρόβληµα να λυθεί µία και µόνη φορά.
K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™
104
Σε αυτό το κεφάλαιο είδαµε παραδείγµατα εφαρµογής δυναµικού προγραµµατισµού για την επίλυση των προβληµάτων: Πολλαπλασιασµού ακολουθίας πινάκων, όπου ψάχνουµε τη σειρά µε την οποία πρέπει να υπολογιστεί το γινόµενο µιας ακολουθίας πινάκων, ώστε να ελαχιστοποιηθεί ο αριθµός των πολλαπλασιασµών µεταξύ των στοιχείων τους. Μεγαλύτερης κοινής υπακολουθίας, όπου δεδοµένων δύο ακολουθιών Χ και Υ, ψάχνουµε την µεγαλύτερη σε µήκος ακολουθία Ζ, η οποία είναι υπακολουθία τόσο της Χ όσο και της Υ. µÈ‚ÏÈÔÁÚ·Ê›·
Η µέθοδος του δυναµικού προγραµµατισµού παρουσιάζεται πολύ καλά στο: [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) πάντα επιλέγει αυτό, που µε βάση την τρέχουσα κατάσταση, δείχνει καλύτερο. ∆ηλαδή, ένας άπληστος αλγόριθµος κάνει τοπικά βέλτιστες επιλογές, ελπίζοντας ότι αυτή η στρατηγική θα οδηγήσει σε µια συνολικά βέλτιστη λύση.
∞
§
∞
π
√
KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
106
Αν και για µερικά προβλήµατα είναι επιτυχηµένη, η στρατηγική των τοπικά βέλτιστων επιλογών δεν οδηγεί στις βέλτιστες λύσεις για αρκετά προβλήµατα. Η επιτυχία της εφαρµογής της µεθόδου της απληστίας βασίζεται στην ύπαρξη των ιδιοτήτων της άπληστης επιλογής (greedy – choice property) και των βέλτιστων επιµέρους δοµών (optimal substructure). Η ιδιότητα της άπληστης επιλογής εξασφαλίζει ότι οι τοπικά βέλτιστες επιλογές µπορούν να οδηγήσουν σε µια βέλτιστη λύση, ενώ η ιδιότητα των βέλτιστων επιµέρους δοµών πρέπει να ισχύει για τα επιµέρους προβλήµατα που δηµιουργούνται από τις τοπικά βέλτιστες επιλογές. Οι άπληστοι αλγόριθµοι είναι συνήθως απλοί στη σύλληψη, εύκολοι στο σχεδιασµό και ιδιαίτερα αποδοτικοί από πλευράς υπολογιστικών απαιτήσεων (π.χ. χρόνος εκτέλεσης, αριθµός θέσεων µνήµης). Το δυσκολότερο κοµµάτι της ανάλυσης είναι η απόδειξη ότι ο άπληστος αλγόριθµος πραγµατικά καταλήγει σε µία βέλτιστη λύση. Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες: 5.1. Επιλογή ανταγωνιστικών δραστηριοτήτων 5.2. Χαρακτηριστικά µεθόδου της απληστίας 5.3. Συµπίεση δεδοµένων – κώδικας Huffman
5 . 1 ∂ ¶ π § √ ° ∏ ∞ ¡ ∆∞ ° ø ¡ π ™ ∆ π ∫ ø ¡ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡
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. Ένα άλλο κριτήριο θα µπο-
107
KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
108
ρούσε να είναι η ελαχιστοποίηση του αριθµού των δραστηριοτήτων µε τις οποίες επικαλύπτεται αυτή που θα επιλεγεί. Αρχικά, θεωρούµε ότι οι δραστηριότητες είναι διατεταγµένες σε αύξουσα σειρά ως προς τους χρόνους ολοκλήρωσης τους, δηλαδή είναι 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, ο οποίος σε κάθε βήµα επιλέγει τη δραστηριότητα µε τον µικρότερο χρόνο ολοκλήρωσης, υπολογίζει πάντα µία βέλτιστη λύση για το πρόβληµα επιλογής δραστηριοτήτων.
KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
110
Θεώρηµα 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.
KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
112
ÕÛÎËÛË 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 à ∞ ƒ∞ ∫ ∆ ∏ ƒ π ™ ∆ π ∫ ∞ ∆ ∏ ™ ª ∂ £ √ ¢ √ À ∆ ∏ ™ ∞ ¶ § ∏ ™ ∆ π ∞ ™
µέλλον. Εποµένως, σε αντίθεση µε το δυναµικό προγραµµατισµό που ακολουθεί 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), είτε ένας άπληστος αλγόριθµος αρκεί για την επίλυση ενός προβλήµατος που απαιτεί την εφαρµογή δυναµικού προγραµµατισµού. Σε τέτοιες περιπτώσεις, η ιδιότητα της άπληστης επιλογής διευκολύνει στην επιλογή µεταξύ δυναµικού προγραµµατισµού και απληστίας.
113
KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
114
Για παράδειγµα, ας θεωρήσουµε δύο παραλλαγές του προβλήµατος του σακιδίου (knapsack problem). Στο πρόβληµα του σακιδίου, δεδοµένων ενός σακιδίου µεγέθους Β και n αντικειµένων, καθένα από τα οποία έχει µέγεθος si > 0 και αξία pi > 0, i = 1, 2, …, n, θέλουµε να υπολογίσουµε µία µέγιστης συνολικής αξίας συλλογή αντικειµένων Α, τα οποία µπορούν να χωρέσουν στο σακίδιο (δηλαδή Αυτή η µορφή λέγεται και 0 – 1 πρόβληµα του σακιδίου (0 – 1
Â
i ŒA
si £ B ).
knapsack problem), γιατί κάθε αντικείµενο µπορεί να επιλεγεί καµία ή µία φορά. Στο κλασµατικό πρόβληµα του σακιδίου (fractional knapsack problem), τα δεδοµένα είναι τα ίδια, αλλά στη συλλογή αντικειµένων Α µπορεί να συµπεριληφθεί οποιοδήποτε ποσοστό fi, 0 £ fi £ 1, ενός αντικειµένου i, 1 £ i £ n. Σε αυτή την περίπτωση, η αξία της συλλογής είναι p( A) = πρέπει s(A) £ B.
Â
n i =1
f i pi , ενώ το µέγεθός της είναι s( A) =
Â
n i =1
f i si , και
Έστω ότι µία βέλτιστη λύση 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, που έχουν µικρότερο λόγο αξίας προς µέγεθος, αλλά πετυχαίνουν την πλήρωση του σακιδίου.
KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
116
Συνεπώς, όταν ένα αλγόριθµος για τη 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.
KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
118
1,00 0
1
0,86 0
0,14 1
0,58 0 α:0,45
0 0,28
1
0,14
0
β:0,13
1
γ:0,12
0
δ:0,16
1
ε:0,09
ζ:0,05
1,00 0
1
α:0,45
0,55 0
1
0,25 0
™¯‹Ì· 5.2
γ:0,12
Τα δυαδικά δέντρα που αναπαριστούν τους κώδικες του Πίνακα 5.1.
0,30 1
0
β:0,13
1
0,14 0
ζ:0,05
δ:0,16 1 ε:0,09
Ένας κώδικας σταθερού µήκους αναπαρίσταται από ένα δυαδικό δέντρο του οποίου όλα τα φύλλα βρίσκονται στην ίδια απόσταση από τη ρίζα (ύψος). Ένας βέλτιστος κώδικας αναπαρίσταται από ένα πλήρες δυαδικό δέντρο, δηλαδή από ένα δυαδικό δέντρο του οποίου κάθε κόµβος είτε είναι φύλλο είτε έχει ακριβώς δύο απογόνους. Στο Σχήµα 5.2, το δέντρο που αντιστοιχεί στον κώδικα σταθερού µήκους δεν είναι πλήρες, αφού κανένας κωδικός δεν έχει πρόθεµα 11. Αντίθετα, το δέντρο που αντιστοιχεί στον βέλτιστο κώδικα µεταβλητού µήκους είναι πλήρες. ¢Ú·ÛÙËÚÈfiÙËÙ· 5.4 Αποδείξτε ότι ένα δυαδικό δέντρο που δεν είναι πλήρες, δεν µπορεί να αντιστοιχεί σε ένα βέλτιστο κώδικα.
5.3 ™Àª¶π∂™∏ ¢∂¢√ª∂¡ø¡ – ∫ø¢π∫∞™ HUFFMAN
Έστω ένα πλήρες δυαδικό δέντρο Τ το οποίο αναπαριστά έναν κώδικα για ένα σύνολο χαρακτήρων 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|).
119
KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
120
(1)
ζ:0,05
ε:0,09
(2)
γ:0,12
β:0,13
γ:0,12
β:0,13 0,14
0
0,14 0
0 γ:0,12
0
β:0,13
0,30 1
α:0,45
0
1
0,14
β:0,13
δ:0,16 1
ζ:0,05
α:0,45
ε:0,09
0,55 0
1
1
0
0,25 0 γ:0,12
0,30 1 δ:0,16
0,14
β:0,13 0
1
ζ:0,05
(6)
α:0,45 1
γ:0,12
ζ:0,05
0
(5)
α:0,45
0,25
δ:0,16
0,25
(4)
δ:0,16
ζ:0,05
1
ε:0,09
α:0,45
1
ε:0,09 (3)
δ:0,16
0
1,00
ε:0,09
1 0,55
α:0,45 0
1
0,25 ™¯‹Ì· 5.3
Παράδειγµα λειτουργίας του αλγορίθµου Huffman.
0 γ:0,12
0,30 1
0
1
0,14
β:0,13 0 ζ:0,05
δ:0,16 1 ε:0,09
5.3 ™Àª¶π∂™∏ ¢∂¢√ª∂¡ø¡ – ∫ø¢π∫∞™ HUFFMAN
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 είναι:
121
KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
122
B(T ) - B(T1 ) =
 f ( c )d ( c ) -  f ( c )d
T1 ( c )
T
cŒC
cŒ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
Λήµµα 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.
123
KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
124
¢Ú·ÛÙËÚÈfiÙËÙ· 5.6 Αποδείξτε ότι για κάθε βέλτιστο κώδικα, αν οι χαρακτήρες είναι διατεταγµένοι σε αύξουσα σειρά ως προς τις συχνότητες εµφάνισης, τα µήκη των αντίστοιχων κωδικών είναι επίσης διατεταγµένα σε αύξουσα σειρά.
ÕÛÎËÛË A˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 5.3 Έστω ότι έχουµε στη διάθεσή µας κέρµατα αξίας µίας, πέντε και είκοσι δραχµών, και θέλουµε να δώσουµε ρέστα αξίας Χ δραχµών, χρησιµοποιώντας τον ελάχιστο αριθµό κερµάτων. Περιγράψτε ένα άπληστο αλγόριθµο και αποδείξτε ότι αυτός υπολογίζει µία βέλτιστη λύση. ∆ώστε ένα παράδειγµα συνόλου κερµάτων για τα οποία ο άπληστος αλγόριθµος δεν εγγυάται τον υπολογισµό µιας βέλτιστης λύσης.
™‡ÓÔ„Ë Σε αυτό το κεφάλαιο παρουσιάστηκε η µέθοδος της απληστίας για την επίλυση προβληµάτων βελτιστοποίησης. Ένας άπληστος αλγόριθµος λειτουργεί σε βήµατα, ακολουθώντας την επιλογή που φαίνεται καλύτερη σε κάθε βήµα. Όταν το πρόβληµα έχει τις ιδιότητες της άπληστης επιλογής και των βέλτιστων επιµέρους δοµών, µπορούµε να αποδείξουµε ότι η άπληστη στρατηγική των τοπικά βέλτιστων επιλογών, πράγµατι, καταλήγει σε µία συνολικά βέλτιστη λύση. Το πρώτο παράδειγµα άπληστου αλγορίθµου αφορούσε στην επίλυση ενός προβλήµατος επιλογής δραστηριοτήτων, οι οποίες έχουν συγκεκριµένους χρόνους έναρξης και λήξης και ανταγωνίζονται για τη δέσµευση ενός κοινόχρηστου πόρου. Αποδείξαµε ότι ο άπληστος αλγόριθµος που κάθε φορά επιλέγει τη δραστηριότητα που ολοκληρώνεται πρώτη υπολογίζει ένα µέγιστου πληθικού αριθµού σύνολο αµοιβαία συµβατών δραστηριοτήτων. Στη συνέχεια, µελετήσαµε δύο παραλλαγές του προβλήµατος του σακιδίου, αµφότερες οι οποίες έχουν την ιδιότητα των βέλτιστων επιµέρους δοµών. Η 0 – 1 παραλλαγή δεν έχει την ιδιότητα της άπληστης επιλογής και απαιτεί την εφαρµογή δυναµικού προγραµµατισµού για τον υπολογισµό µιας βέλτιστης λύσης, ενώ η κλασµατική παραλλαγή επιλύεται βέλτιστα από έναν απλό, άπληστο αλγόριθµο που βασίζεται στο λόγο αξίας προς µέγεθος κάθε αντικειµένου. Ένα άλλο παράδειγµα εφαρµογής της µεθόδου της απληστίας είναι ο αλγόριθµος του Huffman για τον υπολογισµό ενός βέλτιστου κώδικα µεταβλητού µήκους για ένα σύνολο χαρακτήρων C.
B I B § I O ° PA º I A
µÈ‚ÏÈÔÁÚ·Ê›·
Η µέθοδος της απληστίας παρουσιάζεται πολύ καλά στα: [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.
125
∫
∞ÏÁfiÚÈıÌÔÈ ∂ÍÂÚ‡ÓËÛ˘ °Ú·ÊËÌ¿ÙˆÓ ™ÎÔfi˜
∂
6 º
Σκοπός αυτού του κεφαλαίου είναι η εισαγωγή στους αλγόριθµους που επεξεργάζονται γραφήµατα. Τους βασικούς ορισµούς ακολουθεί η παρουσίαση δύο εναλλακτικών τρόπων αναπαράστασης ενός γραφήµατος ώστε να µπορεί να επεξεργαστεί από έναν αλγόριθµο. Στη συνέχεια, παρουσιάζονται και αναλύονται οι αλγόριθµοι Ψαξίµατος Πρώτα σε Πλάτος και Ψαξίµατος Πρώτα σε Βάθος, οι οποίοι χρησιµοποιούνται για την εξερεύνηση και την ανίχνευση πολλών θεµελιωδών ιδιοτήτων ενός γραφήµατος. ¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù· Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση:
• Να αναπαριστά ένα γράφηµα µε την λίστα γειτονικότητας και τον πίνακα γειτονικότητας. • Να εφαρµόζει την τεχνική του Ψαξίµατος Πρώτα σε Βάθος για την εξερεύνηση ενός γραφήµατος. • Να εφαρµόζει την τεχνική του Ψαξίµατος Πρώτα σε Πλάτος και να αναφέρει τις ιδιότητές της. • Να εφαρµόζει τις τεχνικές του Ψαξίµατος Πρώτα σε Βάθος και Ψαξίµατος Πρώτα σε Πλάτος για την επίλυση απλών προβληµάτων. ŒÓÓÔȘ ÎÏÂȉȿ • γράφηµα • κατευθυντικό και µη κατευθυντικό γράφηµα • λίστα γειτονικότητας και πίνακας γει-
τονικότητας • ψάξιµο πρώτα σε βάθος • ψάξιµο πρώτα σε πλάτος • συνεκτικό γράφηµα
∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ Ένα γράφηµα είναι ένα σύνολο κορυφών, κάποιες από τις οποίες ενώνονται µε ακµές / γραµµές. Αυτή η πολύ απλή µαθηµατική οντότητα επιτρέπει την κοµψή µοντελοποίηση πολλών και σηµαντικών υπολογιστικών προβληµάτων. Επιπλέον, το γράφη-
∞
§
∞
π
√
K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡
128
µα έχει µελετηθεί εκτενώς σαν µαθηµατική οντότητα στα πλαίσια της Θεωρίας Γραφηµάτων, τα αποτελέσµατα της οποίας µας οδηγούν συχνά στο σχεδιασµό κοµψών και αποδοτικών αλγόριθµων για πολλά υπολογιστικά προβλήµατα που µοντελοποιούνται µε τη βοήθεια γραφηµάτων. Όµως, για να γίνει δυνατή η αποδοτική επεξεργασία ενός γραφήµατος από έναν αλγόριθµο, πρέπει το γράφηµα να αναπαρασταθεί σε µία κατάλληλη δοµή δεδοµένων. Σε αυτό το κεφάλαιο θα παρουσιάσουµε της µορφές αναπαράστασης ενός γραφήµατος µε τη Λίστα Γειτονικότητας και τον Πίνακα Γειτονικότητας των κορυφών του. Αυτές οι µορφές αναπαράστασης είναι οι πλέον συνηθισµένες και χρησιµοποιούνται από την συντριπτική πλειοψηφία των γνωστών αλγόριθµων. Από τους αλγόριθµους που επεξεργάζονται γραφήµατα, οι πλέον στοιχειώδεις είναι οι αλγόριθµοι εξερεύνησης γραφηµάτων. Με τον όρο εξερεύνηση δηλώνεται η συστηµατική επίσκεψη των κορυφών του γραφήµατος ακολουθώντας τις ακµές που υπάρχουν µεταξύ τους. Όπως θα δούµε, οι αλγόριθµοι εξερεύνησης γραφηµάτων µπορούν να ανιχνεύσουν πολλές βασικές ιδιότητες ενός γραφήµατος και να εφαρµοστούν για τη λύση πολλών προβληµάτων. Για παράδειγµα, ένα δίκτυο υπολογιστών µπορεί να αναπαρασταθεί από ένα γράφηµα, όπου οι κορυφές αναπαριστούν υπολογιστές και άλλες ενεργές συσκευές, και οι ακµές τις δικτυακές συνδέσεις. Το θεµελιώδες πρόβληµα της αξιοπιστίας ενός δικτύου ανάγεται στον έλεγχο συνεκτικότητας ενός τέτοιου γραφήµατος όταν κάποιες ακµές τεθούν εκτός λειτουργίας. Η συνεκτικότητα είναι µία θεµελιώδης ιδιότητα ενός γραφήµατος η οποία µπορεί εύκολα να ανιχνευθεί µε την εφαρµογή ενός αλγόριθµου εξερεύνησης. Επιπλέον, οι αλγόριθµοι εξερεύνησης παρέχουν χρήσιµη πληροφορία για τη δοµή ενός γραφήµατος. Έτσι, πολλοί αλγόριθµοι γραφηµάτων ξεκινούν τη λειτουργία τους µε την εφαρµογή ενός αλγόριθµου εξερεύνησης για να αποκτήσουν τέτοιου είδους πληροφορία που είναι απαραίτητη για τα επόµενα στάδια της λειτουργίας τους. Σε αυτό το κεφάλαιο, θα παρουσιαστούν οι αλγόριθµοι του Ψαξίµατος Πρώτα σε Πλάτος (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.
Παραδείγµατα κατευθυντικών και µη κατευθυντικών γραφηµάτων.
K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡
130
∆ύο κορυφές που συνδέονται από µία µη κατευθυνόµενη ακµή {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 √ ƒ π ™ ª √ π ∫ ∞ π ∞ ¡ ∞ ¶ ∞ ƒ∞ ™ ∆∞ ™ ∏ ° ƒ∞ º ∏ ª ∞∆ ø ¡
από τη 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, που ορίζονται από µία διαµέριση των κορυφών
131
K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡
132
του 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). Όταν το γράφηµα G είναι µη κατευθυντικό, µπορούµε να µειώσουµε τον αριθµό των θέσεων µνήµης στο µισό, αποθηκεύοντας µόνο τα στοιχεία Α[i, j], όπου 1 £ i < j £ |V|, αφού η σχέση γειτονικότητας είναι συµµετρική για τα µη κατευθυντικά γραφήµατα.
1
2
3
4
5
6
1
3 /
2
1
4 /
3
2
4
4
2
4 /
5
6 /
6
6 /
5 /
1 2 3 4 5 6
1 0 1 0 0 0 0
2 0 0 1 1 0 0
™¯‹Ì· 6.3
Παράδειγµα αναπαράστασης κατευθυντικού γραφήµατος. 3 1 0 0 0 0 0
4 0 1 1 0 0 0
5 0 0 1 0 0 0
6 0 0 0 1 1 1
K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡
134
Στο Σχήµα 6.3 απεικονίζεται ένα παράδειγµα αναπαράστασης ενός κατευθυντικού γραφήµατος µε λίστα γειτονικότητας και πίνακα γειτονικότητας, ενώ στο Σχήµα 6.4 απεικονίζεται ένα παράδειγµα αναπαράστασης ενός µη κατευθυντικού γραφήµατος.
™¯‹Ì· 6.4
Παράδειγµα αναπαράστασης µη κατευθυντικού γραφήµατος. 1
2
Όταν το γράφηµα G είναι αραιό (sparse), δηλαδή έχει αριθµό ακµών ασυµπτωτικά µικρότερο από |V|2, |Ε| = ο(|V|2), η αναπαράσταση µε λίστα γειτονικότητας χρησιµοποιεί ασυµπτωτικά λιγότερες θέσεις µνήµης από αυτή µε πίνακα γειτονικότητας. Αντίθετα, όταν το γράφηµα G είναι πυκνό (dense), δηλαδή όταν |E| = Θ(|V|2), ο αριθµός των θέσεων µνήµης που χρησιµοποιείται από τις δύο αναπαραστάσεις δεν διαφέρει σηµαντικά. Από την άλλη πλευρά, η αναπαράσταση µε πίνακα γειτονικότητας πλεονεκτεί γιατί, δεδοµένων δύο κορυφών v, w Œ V, η ύπαρξη της ακµής (v, w) µπορεί να διαπιστωθεί σε σταθερό χρόνο εξετάζοντας το αντίστοιχο στοιχείο του πίνακα, ενώ στην περίπτωση της λίστας γειτονικότητας πρέπει να εξετάσουµε όλα τα στοιχεία της λίστας A[v], τα οποία µπορεί να είναι µέχρι και |V|.
3
4
5
6
1
2
3 /
2
1
3 /
3
1
2
4
3
6 /
5
3 /
6
4 /
4
5 /
1 2 3 4 5 6
1 0 1 1 0 0 0
2 1 0 1 0 0 0
3 1 1 0 1 1 0
4 0 0 1 0 0 1
5 0 0 1 0 0 0
6 0 0 0 1 0 0
Στους αλγόριθµους που ακολουθούν, θα θεωρούµε ότι το γράφηµα εισόδου αναπαρίσταται µε λίστα γειτονικότητας, εκτός αν ρητά αναφέρεται κάτι διαφορετικό.
ÕÛÎËÛË 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 æ ∞ • π ª √ ¶ ƒ ø ∆∞ ™ ∂ ¶ § ∞∆ √ ™
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, πρέπει πρώτα να έχουν βαφτεί γκρίζες ή µαύρες όλες οι γειτονικές της.
135
K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡
136
Για να εξασφαλίζεται η κατά πλάτος διεύρυνση του συνόλου των κορυφών που το ΨΠΠ έχει επισκεφθεί, η σειρά µε την οποία οι γκρίζες κορυφές βάφονται µαύρες είναι ίδια µε τη σειρά που οι λευκές κορυφές βάφονται γκρίζες. Γι’ αυτό ο αλγόριθµος διατηρεί µία 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] ¨ color[s] ¨
°∫ƒπ∑√;
NIL;
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 æ ∞ • π ª √ ¶ ƒ ø ∆∞ ™ ∂ ¶ § ∞∆ √ ™
1
s 3
5
2
4
6
137
7
s 1
3
5
7
8
2
4
6
8
Q 4
1
1
s 3
5
7
s 1
3
5
7
2
4
6
8
2
4
6
8
Q 1
5
Q 5
6
6
2
1
s 3
5
7
s 1
3
5
7
2
4
6
8
2
4
6
8
Q 6
2
Q 2
7
1
s 3
5
2
4
6
Q 7
7
8 ™¯‹Ì· 6.5
7
s 1
3
5
7
8
2
4
6
8
Q 8
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. Περιγράψτε έναν αποδοτικό αλγόριθµο που αποφασίζει αν ένα γράφηµα είναι διµερές ή όχι.
K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡
138
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 æ ∞ • π ª √ ¶ ƒ ø ∆∞ ™ ∂ µ ∞ £ √ ™
µοποιούµε τους πίνακες 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|).
139
K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡
140
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
1/8
2/7
1/8
2/7
M
M
Π
4/5
3/6
1/8
2/7
M 4/5
9/
3/6
1/8 M 4/5
3/6
1/8
2/7
2/7
9/
3/6
1/8
2/7
3/6
3/6
1/8
2/7
3/6
9/12
1/8
2/7
9/12
10/11 Π
4/5
3/6
10/11
9/ ∆'
Π
4/5
10/ Π
9/ ∆'
Π
4/5
M
∆'
Π
4/5
10/
4/5
M
Π
4/5
M
∆'
Π
9/
Π
10/11 Π
∆'
Π 3/6
™¯‹Ì· 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). Οι ακµές διασταύρωσης µπορούν να συνδέουν κορυφές στο ίδιο δέντρο, οι οποίες δεν έχουν
K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡
142
σχέση προγόνου – απογόνου ή κορυφές σε διαφορετικά δέντρα του δάσους του ΨΠΒ. Μία ακµή (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 æ ∞ • π ª √ ¶ ƒ ø ∆∞ ™ ∂ µ ∞ £ √ ™
3/6
2/9
143
1/10
Π
M
11/16
1/10
2/9 4/5
∆
∆ 12/13
7/8
M
∆ 14/15
(α)
Π
∆
Π
∆
11/16
12/13
∆
14/15
∆ 3/6
7/8 Π
1,10
∆
11,16
(β) 4/5
2,9 12,13 14,15 3,6
7,8
4,5 (γ)
Θεώρηµα 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 να έχουν αντιστραφεί.
™¯‹Ì· 6.7
Παράδειγµα εφαρµογής ΨΠΒ, και απεικόνιση του Θεωρήµατος 6.2.
K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡
144
ÕÛÎËÛË 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 που αποφασίζει ένα απλό πρόβληµα. • Να αποδεικνύει ότι ένα πρόβληµα ανήκει σε µία κλάση πολυπλοκότητας. • Να περιγράφει απλές αναγωγές µεταξύ υπολογιστικών προβληµάτων. ŒÓÓÔȘ ÎÏÂȉȿ • πρόβληµα απόφασης • ευεπίλυτα και δυσεπίλυτα προβλήµατα – αξίωµα Cook – Karp • ντετερµινιστική µηχανή Turing
• ντετερµινιστική χρονική πολυπλοκότητα και κλάση P • αναγωγή και πληρότητα
∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ Η θεωρία υπολογιστικής πολυπλοκότητας (computational complexity theory) είναι η περιοχή της θεωρητικής επιστήµης των υπολογιστών που εξετάζει τους λόγους για τους οποίους µερικά προβλήµατα είναι δύσκολο ή και αδύνατον να λυθούν από έναν υπολογιστή. Η υπολογιστική πολυπλοκότητα (ή απλά πολυπλοκότητα), που, ουσιαστικά, δεν υπήρχε σαν επιστηµονική περιοχή πριν εικοσιπέντε χρόνια, γνώρισε ραγδαία ανάπτυξη, και σήµερα αποτελεί µία από τις σηµαντικότερες περιοχές της
∞
§
∞
π
√
K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
146
θεωρητικής επιστήµης των υπολογιστών. Η θεωρία πολυπλοκότητας προσπαθεί κατ’ αρχήν να αναγνωρίσει τα προβλήµατα που δεν µπορούν να λυθούν από έναν υπολογιστή. Ένα παράδειγµα προβλήµατος που δεν µπορεί να λυθεί είναι το διάσηµο πρόβληµα του τερµατισµού (Halting Problem) µιας µηχανής Turing. Από την άλλη πλευρά, υπάρχει η µεγάλη κατηγορία των προβληµάτων που µπορούν να λυθούν από τους υπολογιστές. Σε αυτή την κατηγορία εντάσσονται όλα τα προβλήµατα που συναντήσαµε µέχρι τώρα. Γι΄ αυτά τα προβλήµατα, η θεωρία πολυπλοκότητας µελετά την ποσότητα των υπολογιστικών πόρων που είναι απαραίτητοι για την επίλυση κάθε προβλήµατος σε διάφορα αντιπροσωπευτικά υπολογιστικά µοντέλα. Ένα κεντρικό ερώτηµα είναι η επίδραση του υπολογιστικού µοντέλου στους πόρους που απαιτεί η επίλυση του προβλήµατος. Εξετάζοντας τη συµπεριφορά των προβληµάτων όσον αφορά τους υπολογιστικούς πόρους που απαιτούνται για την επίλυσή τους σε διάφορα υπολογιστικά µοντέλα, η θεωρία πολυπλοκότητας προσπαθεί να εντάξει τα προβλήµατα σε κλάσεις πολυπλοκότητας (complexity classes), δηλαδή οµάδες προβληµάτων µε παρόµοια συµπεριφορά. Τα προβλήµατα κάθε κλάσης ανάγονται σε έναν σχετικά µικρό αριθµό προβληµάτων που θεωρούνται αντιπροσωπευτικά για όλη την κλάση. Τα προβλήµατα αυτά ονοµάζονται πλήρη (complete) για την κλάση και οι µέθοδοι αναγωγής εξασφαλίζουν ότι, αν κάποια σηµαντική πρόοδος συµβεί στην επίλυση ενός από τα πλήρη προβλήµατα, αυτή θα έχει εφαρµογή στην επίλυση όλων των προβληµάτων της κλάσης. Με βάση τα παραπάνω, η πολυπλοκότητα µπορεί να θεωρηθεί σαν η µελέτη της διαλεκτικής σχέσης µεταξύ του υπολογισµού (κλάσεις πολυπλοκότητας) και των εφαρµογών (αλγόριθµοι για την επίλυση προβληµάτων). Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες: 7.1. Αλγόριθµοι και Προβλήµατα 7.2. Ντετερµινιστικές Μηχανές Turing 7.3. Χρονική Πολυπλοκότητα και η Κλάση P 7.4. Αναγωγή και Πληρότητα
7 . 1 ∞ § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ ƒ √ µ § ∏ ª ∞∆ ∞
7.1 ∞ÏÁfiÚÈıÌÔÈ Î·È ÚÔ‚Ï‹Ì·Ù·
Από την οπτική γωνία της θεωρίας αλγορίθµων, τα υπολογιστικά προβλήµατα αποτελούν ένα µαθηµατικό φορµαλισµό που περιγράφει µια κατηγορία πραγµατικών προβληµάτων, τα οποία πρέπει να λυθούν αποτελεσµατικά από κάποιον αλγόριθµο. Η µαθηµατική περιγραφή του προβλήµατος, συνήθως, βρίσκεται σε απόλυτη αντιστοιχία µε το πραγµατικό πρόβληµα. Η περιγραφή των αλγόριθµων σε ψευδοκώδικα επιτρέπει την εύκολη υλοποίησή τους σε διάφορες γλώσσες προγραµµατισµού, ώστε να χρησιµοποιηθούν για την επίλυση πραγµατικών στιγµιότυπων του προβλήµατος. Το γεγονός ότι οι αλγόριθµοι σχεδιάζονται για να χρησιµοποιηθούν στην πράξη, καθιστά αναγκαίο τον ακριβή υπολογισµό της τάξης µεγέθους των συναρτήσεων, οι οποίες προσδιορίζουν την ποσότητα των υπολογιστικών πόρων που απαιτεί κάθε αλγόριθµος. Επιπλέον, η πλειοψηφία των προβληµάτων που εξετάζονται από τη θεωρία αλγορίθµων είναι προβλήµατα βελτιστοποίησης. Από την οπτική γωνία της θεωρίας πολυπλοκότητας, τα υπολογιστικά προβλήµατα είναι µαθηµατικές οντότητες που, καθ’ αυτές, χρήζουν µελέτης. Τα προβλήµατα περιγράφονται µαθηµατικά σαν τυπικές γλώσσες (formal languages), ενώ οι αλγόριθµοι σαν υπολογιστικές µηχανές ειδικού σκοπού. Ο προσδιορισµός της ποσότητας των υπολογιστικών πόρων που απαιτείται για τη λύση ενός προβλήµατος δεν χρειάζεται να είναι ακριβής, αφού εκείνο που ενδιαφέρει είναι η κατηγορία των συναρτήσεων και όχι η ακριβής τάξη µεγέθους. Για τη θεωρία πολυπλοκότητας, ένα πρόβληµα Π είναι µία δυαδική σχέση που περιλαµβάνει όλα τα διαφορετικά ζεύγη των στιγµιότυπων του Π και των λύσεών τους. Για παράδειγµα, ας θεωρήσουµε το πρόβληµα του Συντοµότερου Μονοπατιού µεταξύ δύο κορυφών. Ένα στιγµιότυπο για αυτό το πρόβληµα αποτελείται από ένα γράφηµα G(V, E), και δύο κορυφές s, t Œ V. Κάθε τριάδα που αποτελείται από ένα γράφηµα και δύο κορυφές του γραφήµατος µπορεί να θεωρηθεί σαν ένα έγκυρο στιγµιότυπο του προβλήµατος του Συντοµότερου Μονοπατιού. Κάθε ακολουθία κορυφών που αποτελεί ένα συντοµότερο µονοπάτι µεταξύ των κορυφών s και t αποτελεί µία λύση του προβλήµατος. Επίσης, λύση µπορεί να θεωρηθεί µια κενή ακολουθία κορυφών, όταν αυτή δηλώνει ότι η t δεν είναι προσπελάσιµη από την s. Επειδή το συντοµότερο µονοπάτι µεταξύ s και t δεν είναι µοναδικό, ένα στιγµιότυπο του προβλήµατος µπορεί να έχει περισσότερες από µία λύσεις. Το πρόβληµα του Συντοµότερου Μονοπατιού µεταξύ δύο κορυφών µπορεί να περιγραφεί και σαν πρόβληµα βελτιστοποίησης (optimization problem). ∆εδοµένης µιας τριάδας < G(V, E), s, t >, ζητείται η συντοµότερη ακολουθία κορυφών που σχηµα-
147
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 ∞ § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ ƒ √ µ § ∏ ª ∞∆ ∞
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. Ένα πρόβληµα είναι δυσεπίλυτο όταν αποδεδειγµένα δεν µπορεί να υπάρξει αποδοτικός αλγόριθµος για αυτό. Υπάρχει όµως και µία µεγάλη κατηγορία σηµαντικών προβληµάτων για τα οποία υπάρχουν ισχυρές ενδείξεις, αλλά όχι
149
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).
K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
152
Ορισµός 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
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. Η κωδικοποίηση της Μ ακολουθείται από τη συµβο-
155
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
φή προβλήµατα δεν µπορούν να επιλυθούν από µία 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 σαν βασικό υπολογιστικό µοντέλο για τη θεωρία πολυπλοκότητας.
157
K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
158
ÕÛÎËÛË 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)].
K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
160
Θεώρηµα 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 Με βάση τους αλγόριθµους που ήδη γνωρίζετε, να εντάξετε σε κλάσεις χρονικής πολυπλοκότητας τα προβλήµατα του Πολλαπλασιασµού Ακολουθίας Πινάκων και της Μεγαλύτερης Κοινής Υποακολουθίας.
K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
162
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 1
ÿx 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
K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
164
και ρ(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
x
R
R(x)
Aλγόριθµος για Π2
NAI/OXI
™¯‹Ì· 7.2
Μια αναγωγή R του προβλήµατος Π1 στο πρόβληµα Π2.
K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
166
Όµως η δυνατότητα αναγωγής ενός προβλήµατος Π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 ∞ ¡ ∞ ° ø ° ∏ ∫ ∞ π ¶ § ∏ ƒ √ ∆ ∏ ∆∞
Σαν µεταβατική σχέση, η αναγωγή µεταξύ υπολογιστικών προβληµάτων (ή γλωσσών) παράγει µια µερική διάταξη των προβληµάτων µε κριτήριο τη δυσκολία τους. Ιδιαίτερο ενδιαφέρον έχουν τα ακραία (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¢.
167
K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
168
¢Ú·ÛÙËÚÈ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
µÈ‚ÏÈÔÁÚ·Ê›·
Για µία ολοκληρωµένη, σε βάθος παρουσίαση της Θεωρίας Υπολογιστικής Πολυπλοκότητας, προτείνεται το βιβλίο: [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. Σύγχρονο βιβλίο που διαπραγµατεύεται τόσο θέµατα Θεωρίας Υπολογισµού όσο και θέµατα Υπολογιστικής Πολυπλοκότητας.
169
∫
ªË ¡ÙÂÙÂÚÌÈÓÈÛÌ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 αποδέχεται µία γλώσ-
∞
§
∞
π
√
K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
172
σα αν ένας τουλάχιστον από αυτούς τους διαφορετικούς τρόπους εξέλιξης του υπολογισµού καταλήγει σε αποδοχή. Χονδρικά, µία 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
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
173
K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
174
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
Ύψος∆έντρου= Xρόνος Yπολογισµού
™¯‹Ì· 8.1
Παράδειγµα δέντρου υπολογισµών µιας NDTM. Η χρονική πολυπλοκότητα της µηχανής δίνεται από το ύψος του δέντρου.
O
O
N
O
N
O
O
∆ιαισθητικά, στα µη ντετερµινιστικά υπολογιστικά µοντέλα, οι υπολογισµοί αποδοχής µπορούν πάντα να επιβάλουν τη θέλησή τους, ακόµα και αν αποτελούν ισχνή µειοψηφία. Το φαινόµενο αυτό είναι πολύ συνηθισµένο στα µαθηµατικά. Ένα θεώρηµα ισχύει, αν από όλες τις δυνατές µαθηµατικές αποδείξεις, µία και µόνη αποτε-
8.1 ª∏ ¡∆∂∆∂ƒªπ¡π™∆π∫∂™ ª∏Ã∞¡∂™ TURING
λεί µια σωστή απόδειξη για αυτό. Αντίστροφα, ένα θεώρηµα δεν ισχύει αν υπάρχει ένα και µόνο παράδειγµα που το διαψεύδει. Αυτή η ασυµµετρία στον τρόπο µε τον οποία µια 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 είναι µια σταθερά που εξαρτάται από την Ν.
175
K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
176
Απόδειξη: Αφού η Ν είναι Μη Ντετερµινιστική, σύµφωνα µε τη σχέση µετάβασης ∆, από κάθε διαµόρφωσή της µπορεί να προκύψει ένας αριθµός άλλων διαµορφώσεων. Έστω 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) στο µήκος κάθε ακολουθίας υπολογισµών της Ν, ο χρόνος που χρειάζεται η Μ για να ολοκληρώσει την προσοµοίωση είναι ανάλογος του συνολικού αριθµού των διαφορετικών ακολουθιών για τις οποίες η Μ προσοµοιώνει την Ν. ∆ηλαδή, η χρονική πολυπλοκότητα της Μ είναι O
Ê Ë
Â
f ( n) t =1
(
)
ˆ d t = O d f ( n ) +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
P
™¯‹Ì· 8.2
Η σχέση των κλάσεων P, NP, και του συνόλου των προβληµάτων που είναι πλήρη για το NP, εφόσον P π NP.
K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
182
ÕÛÎËÛË 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 – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
δο x µπορούµε να κατασκευάσουµε µία λογική πρόταση φx σε ΣΚΜ, τέτοια, ώστε η φx να είναι ικανοποιήσιµη αν και µόνο αν το x ανήκει στην L. Έστω ότι το αλφάβητο της Ν είναι {α1, α2, …, αm} και το σύνολο καταστάσεων είναι {q1, q2, …, ql}. Αφού η Ν λειτουργεί σε χρόνο t(n), |x| = n, η κεφαλή της ταινίας δεν µπορεί να επισκεφθεί περισσότερα από t(n) κελιά. Η λογική πρόταση φx θα χρησιµοποιεί τους ακόλουθους τρεις τύπους λογικών µεταβλητών: •
j, t) που δηλώνει ότι «το κελί i περιέχει το σύµβολο αj τη χρονική στιγµή t», 1 £ i £ t(n), 1 £ j £ m, 1 £ t £ t(n), σύνολο m t2(n) µεταβλητές.
•
ΚΕΦΑΛΗ(i, t) που δηλώνει ότι «η κεφαλή της ταινίας βρίσκεται στο κελί i τη χρο-
ΚΕΛΙ(i,
νική στιγµή t», 1 £ i £ t(n), 1 £ t £ t(n), σύνολο t2(n) µεταβλητές. •
t) που δηλώνει ότι «η Ν βρίσκεται στην κατάσταση qk τη χρονική στιγµή t», 1 £ k £ l, 1 £ t £ t(n), σύνολο l t(n) µεταβλητές. ΚΑΤΑΣΤΑΣΗ(k,
Συνολικά, χρησιµοποιούµε (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) Κάθε χρονική στιγµή η επόµενη διαµόρφωση καθορίζεται από τη σχέση µετάβασης ∆. ∆ηλαδή οι τιµές των µεταβλητών που περιγράφουν τις διαµορφώσεις της Ν σε κάθε δύο διαδοχικές χρονικές στιγµές πρέπει να υπακούουν /
183
K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
184
επαληθεύουν τους κανόνες µετάβασης που περιέχονται στη σχέση ∆. Οι παραπάνω προτάσεις απλώς συνοψίζουν τους κανόνες λειτουργίας µιας 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 – πληρότητας.
K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
186
¢Ú·ÛÙËÚÈ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).
Απόδειξη:
™¯‹Ì· 8.3
Ένα παράδειγµα της αναγωγής από την 3 – Ικανοποιησιµότητα στο Μέγιστο Σύνολο Ανεξαρτησίας. Η λογική πρόταση είναι φ = (x1 Ú x2 Ú x3) Ÿ (ÿx1 Ú ÿx2 Ú ÿx3) Ÿ (ÿx1 Ú x2 Ú x3).
Για να αποδείξουµε ότι το ΜΣΑ είναι πλήρες για το NP, θα ανάγουµε το πρόβληµα της 3 – Ικανοποιησιµότητας στο ΜΣΑ. Χωρίς βλάβη της γενικότητας, θεωρούµε µόνο λογικές προτάσεις φ σε ΣΚΜ µε m όρους, n λογικές µεταβλητές, και ακριβώς 3 άτοµα σε κάθε όρο. ∆εδοµένης µιας τέτοιας πρότασης φ, θα κατασκευάσουµε ένα γράφηµα G(V, E), |V| = 3m, το οποίο θα έχει ένα σύνολο ανεξαρτησίας µεγέθους m αν και µόνο αν η φ είναι ικανοποιήσιµη. ÿx 1
x1
ÿx 2 x2
x3
ÿx 1
ÿx 3
x2
x3
8 . 3 N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
Για να κατασκευάσουµε το γράφηµα 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, δεν συµπεριλαµβάνεται κανένα ζευγάρι συµπληρωµατικών εµφανίσεων της ίδιας µεταβλητής και, εποµένως, δεν υπάρχουν ακµές
187
K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
188
µεταξύ των κορυφών των διαφορετικών τριγώνων. Αφού η φ ικανοποιείται, κάθε τρίγωνο θα αντιπροσωπεύεται στο σύνολο ανεξαρτησίας µε ακριβώς µία κορυφή, οπότε το σύνολο ανεξαρτησίας όντως θα έχει το επιθυµητό µέγεθος. Η απόδειξη ολοκληρώνεται µε την παρατήρηση ότι η παραπάνω αναγωγή µπορεί να υπολογιστεί σε πολυωνυµικό χρόνο.
Παρατηρείστε ότι στην πραγµατικότητα αποδείξαµε ότι το πρόβληµα του Μέγιστου Συνόλου Ανεξαρτησίας είναι 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 – Ικανοποιησιµότητα και το Μέγιστο Σύνολο Ανεξαρτησίας.
K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
190
µÈ‚ÏÈÔÁÚ·Ê›·
Η θεωρία 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 - i + 1) =
i =1
Âi = i =2
n(n + 1) - 1 . Παρατηρείστε ότι το βήµα 2
3 εκτελείται τον ίδιο αριθµό φορών τόσο στην καλύτερη όσο και στη χειρότερη περίπτωση. Συνεπώς, ανεξάρτητα από το στιγµιότυπο, ο χρόνος εκτέλεσης του αλγορίθµου selection sort είναι τετραγωνικός στο µέγεθος της εισόδου. 1.2 Καταρχήν, ας θυµηθούµε τον ψευδοκώδικα του αλγορίθµου γραµµικής αναζήτησης: procedure linear_search(A[1,...,n], x) (1) i ¨ 1; (2) while i <= n do
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
192
if A[i] = x then return i; i ¨ i + 1;
(3) (4) (5)
(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 = y =1
y
n(n + 1) n + 1 = . Υποθέτοντας ότι το x έχει την ίδια πιθανότητα να βρίσκεται 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).
✓ ❏
❏
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
194
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
ΝΑΙ
ΟΧΙ
ΝΑΙ
ΟΧΙ
ΝΑΙ
(β)
(logn)3
log(nlog( n ) )
ΟΧΙ
ΟΧΙ
ΝΑΙ
ΝΑΙ
ΟΧΙ
(γ)
kn
(3k)n/3
ΟΧΙ
ΟΧΙ
ΝΑΙ
ΝΑΙ
ΟΧΙ
(δ)
(kn)1– ε
n1– ε
ΝΑΙ
ΟΧΙ
ΝΑΙ
ΟΧΙ
ΝΑΙ
(ε)
n3 – 10n
8log n
ΝΑΙ
ΟΧΙ
ΝΑΙ
ΟΧΙ
ΝΑΙ
3
2.3 Το άθροισµα C(n) δεν µπορεί να είναι µεγαλύτερο από το άθροισµα Επίσης, ισχύει ότι C (n ) ≥
Â
n i = n/2
n 3 / 8 ≥ n 4 / 16 .
Â
n i =1
n3 £ n4 .
Εποµένως, 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. Εποµένως, καταλήγουµε στο συµπέρασµα ότι C (n ) =
Â
n i =1
i3 =
n 4 + 2n 3 + n2 n2 (n + 1)2 = , 4 4
το οποίο και θα επιβεβαιώσουµε µε µαθηµατική επαγωγή. Λόγω της µεθόδου µε την οποία υπολογίσαµε τους συντελεστές του πολυωνύµου, η παραπάνω ισότητα ισχύει για n = 1, 2, 3, 4 και 5. Υποθέτουµε ότι ισχύει για n, και θα αποδείξουµε ότι ισχύει για n + 1. Πράγµατι,
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™
n +1
Âi
195
n
3
= (n + 1) + 3
i =1
Âi
3
i =1
n2 (n + 1)2 4 2 (n + 1) ( 4n + 4 + n2 ) (n + 1)2 (n + 2 )2 = = 4 4 = (n + 1) 3 +
όπου στην πρώτη ισότητα βγάλαµε την περίπτωση i = n + 1 εκτός αθροίσµατος, στη δεύτερη ισότητα εφαρµόσαµε την επαγωγική υπόθεση και, στη συνέχεια, κάναµε τις πράξεις. 2.4 Για να αποδείξουµε την ανισότητα θα χρησιµοποιήσουµε µαθηµατική επαγωγή. Παρατηρούµε ότι, για c ≥ 1, η ανισότητα ισχύει πάντα για n = 0. ∆εχόµαστε ότι ισχύει για n και θα αποδείξουµε ότι ισχύει για n + 1. n +1
Â3 = 3 i
n
n +1
i =0
£3
+
Â3
i
i =0
n +1
+ c3 n
Ê cˆ £ 3 n +1 Á1 + ˜ Ë 3¯ Παρατηρούµε ότι η ποσότητα 3 n +1 ÊÁ1 + c ˆ˜ είναι το πολύ ίση µε c3n + 1, για κάθε c ≥ 3/2. Ë 3¯ Η τιµή 3/2 είναι η ελάχιστη τιµή της σταθεράς c για την οποία ισχύει η ανισότητα. Με απόλυτα παρόµοιο τρόπο, µπορούµε να αποδείξουµε ότι, για κάθε α > 1 και για κάθε σταθερά c ≥
Â
a , ισχύει a -1
n i =0
ai £ ca n .
2.5 Αναπτύσσοντας την αναδροµική εξίσωση, έχουµε T (n ) = 1 + T (n / 2 ) = 1 + 1 + T (n / 4 ) M i = 11 +4 1+ 2L 4+ 31 + T (n / 2 ) . i φορές
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
196
Θέτοντας 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 32 = 31+4 +L +33 + T (n - i ) . 4 44 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
i
i =0
i =0
Εποµένως, 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
=
Âi i =2
2
+ T (1) = Q (n 3 ) .
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
198
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). Συνεπώς, έχουµε: T (n ) =
Q (log n )
 i =0
i
•
i
Ê 9ˆ Ê 9ˆ 3nÁ ˜ £ 3n Á ˜ = 30n , Ë 10 ¯ Ë 10 ¯ i =0
Â
όπου το τελευταίο άθροισµα είναι άθροισµα άπειρων όρων γνήσια φθίνουσας γεωµετρικής προόδου. Επιπλέον, αξίζει να σηµειωθεί ότι στην παραπάνω εκτίµηση για το 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 +
Θ(log n)
5n/9
4n/9
n +
20n/81
20n/81
16n/81
n
+
...
...
25n/81
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)). Ένας άλλος τρόπος απόδειξης του ίδιου αποτελέσµατος είναι να δείξουµε ότι η αναδροµική εξίσωση n -1 n - k -1 ˆ 1 Ê S (n ) = Q (n ) + S (i ) + S (n - i )˜ Á n -1 Ë i=k ¯ i =1
Â
Â
έχει λύση Ο(n log(n/k)), όπου S(i) = Θ(1), για i < k. Με την ολοκλήρωση της quicksort, κάθε στοιχείο βρίσκεται το πολύ k θέσεις µακριά από την τελική του θέση στον διατεταγµένο πίνακα. Εποµένως, η κλήση της insertion sort χρειάζεται χρόνο O(kn), αφού κάθε στοιχείο θα συγκριθεί και θα µετακινηθεί το πολύ k φορές, µέχρι να φτάσει την τελική του θέση. Άρα, ο χρόνος εκτέλεσης για τον παραπάνω αλγόριθµο που συνδυάζει την quicksort µε την insertion sort είναι O(kn + log(n/k)).
™¯‹Ì· 2.7
Το δέντρο της αναδροµής για την εξίσωση T(n) = T(5n/9) + T(4n/9) + n.
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
200
Έστω 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 log k = n log k 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
xi > xk
i
υποδεικνύουν ότι το πολύ 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
i
xi < x m
και WR =
Âw. i
xi > x m
4. Αν το xm είναι και το βεβαρηµένο ενδιάµεσο στοιχείο, επέστρεψέ το.
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
202
5. ∆ιαφορετικά, πρόσθεσε το µικρότερο από τα αθροίσµατα WL και WR στο βάρος του xm, και εφάρµοσε αναδροµικά τον αλγόριθµο στην επιµέρους ακολουθία µε το µεγαλύτερο άθροισµα βαρών (στην οποία έχεις προσθέσει και το στοιχείο xm). Όσον αφορά στην ορθότητα, στην περίπτωση που το βεβαρηµένο ενδιάµεσο στοιχείο είναι ίδιο µε το ενδιάµεσο στοιχείο xm, ο αλγόριθµος το βρίσκει και το επιστρέφει (βήµα 4). Σε διαφορετική περίπτωση, η πρόσθεση του βάρους της «ελαφρότερης» επιµέρους ακολουθίας στο xm δεν αλλάζει το βεβαρηµένο ενδιάµεσο στοιχείο της αρχικής ακολουθίας, αλλά επιτρέπει να περιορίσουµε την αναζήτηση στην επιµέρους ακολουθία µε το µεγαλύτερο βάρος, όπου πρέπει να βρίσκεται το βεβαρηµένο ενδιάµεσο στοιχείο. Ο χρόνος εκτέλεσης T(n) του παραπάνω αλγορίθµου δίνεται από την αναδροµική εξίσωση T(n) = T(n/2) + Θ(n), η οποία έχει λύση T(n) = Θ(n). 3.5 Έστω A( x ) =
Â
n -1 i =0
ai x i και B( x ) =
Â
n -1 i =0
bi x i πολυώνυµα βαθµού (n – 1), και
C(x) = A(x)B(x) το γινόµενό τους. Τα πολυώνυµα A(x) και Β(x) µπορούν να γραφούν σαν A(x) =A1(x) + xn/2 A2(x), όπου A1 ( x ) =
Â
n / 2 -1 i =0
ai x i και A2 ( x ) =
Â
n / 2 -1 i =0
και B(x) =B1(x) + xn/2 B2(x), όπου B1 ( x ) =
an / 2 + i x i ,
Â
n / 2 -1 i =0
bi x i και B2 ( x ) =
Â
n / 2 -1 i =0
bn / 2 + i x i ,
αντίστοιχα. Το γινόµενο 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À ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™
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,
203
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
204
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] αποτελεί επέκταση της αναδροµικής εξίσωσης για την περίπτωση των δύο ακολουθιών. αν i = 0, ή j = 0, ή k = 0. Ï0 Ô αν i , j , k > 0 κ αι xi = y j = zk c[ i, j , k ] = Ìc[ i - 1, j - 1, k - 1] + 1 Ô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
LOOKUP
– 3LCS(Xn, Ym, Zp);
– 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 else tx = LOOKUP – 3LCS(Xi – ty = LOOKUP – 3LCS(Xi, tz = LOOKUP – 3LCS(Xi, c[i, j, k] = max{tx, return c[i, j, k];
1,
– 1,
Yj, Zk); Yj – 1, Zk); Yj, Zk – 1); ty, tz};
Yj
– 1,
Zk
– 1);
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
206
Παρατηρείστε ότι κάθε στοιχείο του πίνακα 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 Ô Ô jb c[ i, j ] = Ì Ômin{c[ i - 1, j - 1], c[ i - 1, j ] + d , c[ i, j - 1] + b} ÔÓmin{c[ i - 1, j - 1] + h, c[ i - 1, j ] + d , c[ i, j - 1] + b}
αν j = 0. αν i = 0. αν i, j > 0 κ αι X [i ] = Y [ j ]. αν 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 else c[i, j] ¨ c[i if c[i, j] > c[i, j c[i, j] ¨ c[i, j
c[i, – 1, – 1] – 1]
j] ¨ c[i–1, j–1]; j – 1] + h; + b then + b;
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™
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;
207
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
208
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À ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™
Εφαρµόζοντας επαγωγικά (ως προς τον αριθµό των βηµάτων του άπληστου αλγορίθµου) τις ιδιότητες της βέλτιστης επιλογής και των βέλτιστων επιµέρους δοµών, καταλήγουµε στην απόδειξη ορθότητας του αλγορίθµου, δηλαδή στο συµπέρασµα ότι η άπληστη στρατηγική υπολογίζει µία βέλτιστη λύση. 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 κέρµατα. Η βέλ-
209
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
210
τιστη λύση αποτελείται από 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À ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™
µε αν όλες οι ακµές έχουν άκρα διαφορετικού χρώµατος. Ο χρόνος εκτέλεσης του αλγόριθµου καθορίζεται από το χρόνο εκτέλεσης του ΨΠΠ και είναι Ο(|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. Ο
211
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
212
ψευδοκώδικας της βασικής επανάληψης στη διαδικασία ΨΠΒ πρέπει να µεταβληθεί ως εξής: 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À ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™
σει τον αριθµό των βηµάτων, η Μ¢ σβήνει ένα σύµβολο 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 λειτουργούν σε πολυωνυµικό χρόνο, το ίδιο συµβαίνει και µε όλους τους παραπάνω συνδυασµούς τους.
213
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
214
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. 1 4
(ÿx2Úx4)Ÿ(x2Úÿx4)Ÿ
2
™¯‹Ì· 7.3
Παράδειγµα κατασκευής της λογικής πρότασης φG.
(ÿx1Úx4)Ÿ(x1Úÿx4)Ÿ (ÿx3Úx4)Ÿ(x3Úÿx4)Ÿ
5
(ÿx2Úx5)Ÿ(x2Úÿx5)
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À ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™
δοι υπολογισµού της Ν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) είναι συνεκτικό, δηλαδή αποτελείται από έναν απλό κύκλο, διαφορετικά µπορούµε να αντιµετωπίσουµε κάθε κύκλο ξεχωριστά.
215
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
216
Ένας απλός αλγόριθµος γραµµικού χρόνου είναι, ξεκινώντας από µια οποιαδήποτε κορυφή, να εξετάσουµε όλες τις κορυφές µε τη σειρά που εµφανίζονται στον κύκλο. Κάθε κορυφή περιλαµβάνεται στο σύνολο ανεξαρτησίας αν καµία από τις γειτονικές της δεν έχει ήδη περιληφθεί. Με αυτό τον τρόπο υπολογίζουµε ένα σύνολο ανεξαρτησίας µεγέθους
Î| 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
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
218
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 i =1
(n - i + 1) =
Â
n i =1
i προφανώς ισχύει για n = 1. Για να δείξουµε
ότι ισχύει για κάθε τιµή του n, υποθέτουµε ότι ισχύει για ένα συγκεκριµένο n, και θα αποδείξουµε ότι ισχύει για n + 1. Πράγµατι, n +1
n
n
n
n +1
i =1
i =1
i =1
i =1
i =1
 (n - i + 1) = 1 +  [(n + 1) - i + 1] =1 + n +  (n - i + 1) = n + 1 +  i =  i ,
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
220
όπου στην πρώτη ισότητα βγάλαµε εκτός αθροίσµατος την περίπτωση i = n + 1, στη δεύτερη ισότητα βγάλαµε εκτός αθροίσµατος µία µονάδα για καθένα από τους n όρους [(n + 1) – i + 1] (οι οποίοι έγιναν n – i + 1), στην τρίτη ισότητα εφαρµόσαµε την επαγωγική υπόθεση και στην τέταρτη ισότητα βάλαµε στο άθροισµα την περίπτωση i = n + 1. 2.4 Ο ισχυρισµός ισχύει για n = 1. Υποθέτουµε ότι ισχύει για n, και θα δείξουµε ότι ισχύει για n + 1. Πράγµατι, n +1
Âi
n
2
i =1
= (n + 1) + 2
Âi
2
i =1
n(n + 1)( 2n + 1) 6 2 (n + 1)( 2n + 7n + 6 ) (n + 1)[(n + 1) + 1][ 2(n + 1) + 1] = = 6 6 = (n + 1)2 +
2.5 Για κάθε i > 1, έχουµε 1/ i2 < 1 / i (i – 1). Συνεπώς, n
 i =1
n
Το άθροισµα
1 =1+ i2
Ê 1
n
 i =2
1 £1+ i2
n
 i =2
Ê 1 1 1ˆ =1+ Á - ˜ i(i - 1) Ë i -1 i ¯ i =2 n
Â
1ˆ
 ÁË i - 1 - i ˜¯ ανήκει στην κατηγορία των τηλεσκοπικών αθροισµάτων. i =2
Ένα τηλεσκοπικό άθροισµα έχει τη µορφή
Â
n i =1
( ai - ai +1 ) . Το αποτέλεσµα αυτού
του αθροίσµατος είναι α1 – αn + 1, επειδή οι όροι α2, α3, … αn προστίθενται και αφαιρούνται ακριβώς µία φορά ο καθένας. Ê 1 1ˆ 1 - ˜ = 1 - , και Εποµένως, Á n Ë i -1 i ¯ i =2 n
Â
n
Âi i =1
1 2
£ 2-
1 = O (1) . 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;
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡
for k ¨ p to r do if i > q then A[k] ¨ X[j]; j if j > r then A[k] ¨ X[i]; i if (i £ q) and (j A[k] ¨ X[j]; j else A[k] ¨ X[i]; i
221
¨ j + 1; ¨ i + 1; £ r) and (X[i] > X[j]) then ¨ j + 1; ¨ 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) είναι ίσο µε το άθροισµα του χρόνου για τον
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
222
υπολογισµό του 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
T (n ) =
log n
 2 n = n 2 £ 2n , i
i
i =0
2
i =0
όπου η τελευταία ανισότητα προκύπτει από την Άσκηση Αυτοαξιολόγησης 2.4. Πράγµατι, αν θεωρήσουµε αρχική συνθήκη Τ(1) = 1 και σαν τιµές του n µόνο ακέραιες δυνάµεις του 2, µε µαθηµατική επαγωγή µπορούµε να αποδείξουµε ότι T(n) = n(2n – 1). n
n +
¥4 n/4
™¯‹Ì· 2.4
Το δέντρο της αναδροµής για την εξίσωση T(n) = 4T(n/2) + n.
¥4
n/2
¥4 n/4 ¥4
n/2 ¥4
n/4 ¥4
2n ¥4
+
n/4 ¥4
4n +
...
log n
n/2
...
n/2
Σύνολο: Θ(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 + c2 T (n ) ≥ c1 log + c1 2 2 και £ c2 (log n - 1) + c2 ≥ c1 (log n - 1) + c1
T (n ) £ c2 log
= 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
...
...
+
Σύνολο: Θ(n log2n)
Για να αποκτήσουµε µια ασυµπτωτική εκτίµηση για τη λύση της αναδροµικής εξίσωσης, σχεδιάζουµε το δέντρο της αναδροµής (Σχήµα 2.5).
Το δέντρο της αναδροµής για την εξίσωση T(n) = 2T(n/2) + n log n.
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
224
Από το δέντρο της αναδροµής του Σχήµατος 2.5 συµπεραίνουµε ότι: log n
T (n ) =
Ê nˆ
 n logÁË 2 ˜¯ i
i =0
log n ù Èlog n = n Í log n iú ÍÎ 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
(α)
i 3 i
3
2
6
4
5
1
5
3
2
7
3
3
2
3
3
6 i
A[p...q] 2
1
4
1
(β)
j
(γ)
6
i
j
™¯‹Ì· 3.5
Η λειτουργία της partition για τον πίνακα Α = [5, 3, 2, 6, 4, 1, 3, 7].
7
4
(δ)
3
7
j 1
5
7
j
A[q+1...r] 4
6
j
i
5
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.
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡
13 19 9
5 12 8
7
225
4 11 2 6 21
i
13 19 9
5 12 8 7
4 11 2
i 6 19 9 i
5 12 8
7
4 11 2 13 21
6
6 21 j
2
9
5 12 8 7
4 11 19 13 21
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. Τέτοια παραδείγµατα είναι κάθε πίνακας του οποίου τα στοιχεία είναι διατεταγµένα σε αύξουσα ή φθίνουσα σειρά.
τον πίνακα Β.
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
226
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
+ ycn
Θ(log n)
ydn
y(c+d)n +
y c2 n
™¯‹Ì· 3.7
ycdn
ycdn
y d2 n
Το δέντρο της αναδροµής για την εξίσωση T(n) = T(cn) + T(dn) + Θ(n).
y(c+d)2+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). Εποµένως, είναι: T (n ) =
Q (log n )
Â
Q (log n )
Q (n )(1 / c + 1 / d )i = Q (n )
i =0
Όταν 1/c + 1/d < 1, το άθροισµα
Â
(1 / c + 1 / d )i .
i =0
Â
Q (log n ) i =0
(1 / c + 1 / d )i είναι ίσο µε µια σταθερά,
επειδή είναι άθροισµα όρων γνήσια φθίνουσας γεωµετρικής προόδου. Εποµένως, σε αυτή την περίπτωση T(n) = Θ(n). Θ(n)
Θ(n)
+
(1/d) Θ(n)
(1/c) Θ(n) Θ(log n)
(1/c+1/d)Θ(n) + ™¯‹Ì· 3.8
(1/d2)Θ(n)
(1/c+1/d)2Θ(n) +
...
...
(1/c2)Θ(n) 2(1/c)(1/d) Θ(n)
Το δέντρο της αναδροµής για την εξίσωση T(n) = T(n/c) + T(n/d) + Θ(n).
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
228
Στην περίπτωση που 1/c + 1/d = 1, είναι = Θ(n log n).
Â
Q (log n ) i =0
(1 / c + 1 / d )i = Q (log n ) , και T(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],
value ¨ 0; i ¨ n – 1; while i ≥ 0 do
x 0)
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡
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 5 j
9.375 (3) 7.875 (3)
2 15.750 (3)
1 0
A1
11.875 (3)
4 3
A2
2
10.500 (3) 7.125 (3)
4.375 (3) 2.625 (3)
0
1 15.125 (3)
5.375 (3) 2.500 (3)
750 (3) 0
A3
i
3 4 3.500 (3) 1.000 (3)
0
A4
5 5.000 (3)
0
A5
6 0
A6
™¯‹Ì· 4.2
Οι τιµές του πίνακα m για το διάνυσµα d.
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
230
Ο ελάχιστος αριθµός των πολλαπλασιασµών για τον υπολογισµό του γινοµένου είναι 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] δίνεται από την αναδροµική εξίσωση: T (n ) ≥ 1 +
n -1
Â
(T ( k ) + T (n - k ) + 1) = n + 2
k =1
n -1
ÂT (k ) . k =1
Με τη µέθοδο της αντικατάστασης, µπορούµε να αποδείξουµε ότι Τ(n) ≥ 2n – 1, για κάθε n ≥ 1. Πράγµατι, Τ(1) ≥ 20 = 1. Επαγωγικά δεχόµαστε ότι T(n – 1) ≥ 2n – 2 για κάθε n ≥ 1και, αντικαθιστώντας στην αναδροµική εξίσωση, έχουµε: T (n ) ≥ n + 2
n -1
 k =1
2 k -1 = n + 2
n-2
Â2
k
= n + 2( 2 n -1 - 1) ≥ 2 n -1 ,
k =0
αφού το άθροισµα αποτελείται από (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 i
0 yi
1
2
3
4
5
6
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
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
232
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] µπορεί να υπολογιστεί σε γραµµικό χρόνο µε χρήση σταθερού αριθµού θέσεων µνήµης.
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
234
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
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡
µονάδων του αντικειµένου 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, αντίστοιχα. Εποµένως, το Β(Τ) είναι πράγµατι ίσο µε το άθροισµα του κόστους όλων των συνενώσεων για τη δηµιουργία του δέντρου Τ.
235
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
236
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 j =1
f ( c j )l ( c j ) µειώνεται. Το γεγονός αυτό αντίκειται στην υπόθεση
ότι ο κώδικας που θεωρήσαµε είναι βέλτιστος. Εποµένως, λανθασµένα υποθέσαµε ότι, όταν οι χαρακτήρες είναι διατεταγµένοι σε αύξουσα σειρά συχνοτήτων εµφάνισης, δεν είναι ταυτόχρονα διατεταγµένοι και σε αύξουσα σειρά ως προς το µήκος των κωδικών. 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 είναι δέντρο.
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡
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, να απαιτεί το πολύ Β πολλαπλασιασµούς µεταξύ στοιχειών των πινάκων. Στο πρόβληµα της Μεγαλύτερης Κοινής Υπο – Ακολουθίας, δεδοµένων δύο ακο-
237
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
238
λουθιών Χ και Υ, και ενός ορίου Β, πρέπει να αποφασισθεί αν οι Χ και Υ περιέχουν µία κοινή υπο – ακολουθία µήκους, τουλάχιστον, Β. Τόσο το πρόβληµα του Πολλαπλασιασµού Ακολουθίας Πινάκων όσο και αυτό της Μεγαλύτερης Κοινής Υπο – Ακολουθίας είναι ευεπίλυτα, αφού λύνονται από αλγόριθµους δυναµικού προγραµµατισµού σε χρόνο Ο(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|.
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
240
7.6 Αφού το Π είναι πλήρες για τη C, κάθε πρόβληµα Π¢ Œ C ανάγεται στο Π Œ C¢. Αφού η C¢ είναι κλειστή ως προς την αναγωγή, κάθε πρόβληµα Π¢, που ανάγεται στο Π, πρέπει να ανήκει και στην κλάση C. ∆ηλαδή, C¢ Õ C. Λόγω συµµετρίας, ισχύει, επίσης, C Õ C¢. Άρα, C = C¢. 8.1 Ένα στιγµιότυπο x για το Προβλήµατος του Περιοδεύοντος Πωλητή ανήκει στην αντίστοιχη γλώσσα αν και µόνο αν υπάρχει µια περιοδεία που έχει συνολικό µήκος το πολύ Β. Θα δείξουµε ότι µια NDTM Ν µε δύο ταινίες µπορεί να αποφασίσει το Πρόβληµα του Περιοδεύοντος Πωλητή σε χρόνο O(n2), |x| = n. Αρχικά, η Ν γράφει στη δεύτερη ταινία της µία συµβολοσειρά y, |y| £ |x|. Μάλιστα, η Ν ορίζεται έτσι, ώστε κάθε διαφορετική συµβολοσειρά y, |y| £ |x|, να προκύπτει από κάποιο κλάδο υπολογισµού της. Στη συνέχεια, η Ν ελέγχει αν κάποιο πρόθεµα του y αποτελεί την κωδικοποίηση µιας περιοδείας, δηλαδή αν κάποιο πρόθεµα του y αναπαριστά µία αναδιάταξη των n σηµείων εισόδου. Εφόσον συµβαίνει αυτό, η Ν ελέγχει αν το συνολικό µήκος της αντίστοιχης περιοδείας είναι µικρότερο ή ίσο του Β, και σε αυτή την περίπτωση αποδέχεται την είσοδο x. Αν το x περιέχει µία περιοδεία µήκους το πολύ Β, αφού η N γράφει όλες τις διαφορετικές συµβολοσειρές y, κάποια από αυτές θα κωδικοποιεί την συγκεκριµένη περιοδεία, οπότε ο αντίστοιχος κλάδος υπολογισµού της Ν θα καταλήξει σε αποδοχή. ∆ιαφορετικά, καµία συµβολοσειρά y δεν µπορεί να κωδικοποιεί µια περιοδεία µε το επιθυµητό µήκος και όλοι οι κλάδοι υπολογισµού της Ν θα καταλήξουν σε απόρριψη. Εποµένως, η Ν πράγµατι αποφασίζει το Πρόβληµα του Περιοδεύοντος Πωλητή. Σχετικά µε το χρόνο εκτέλεσης, η συµβολοσειρά y γράφεται σε µη ντετερµινιστικό χρόνο O(|x|), ενώ ο έλεγχος για το αν η y κωδικοποιεί µια περιοδεία µήκους το πολύ Β µπορεί να εκτελεστεί σε (ντετερµινιστικό) χρόνο Ο(|x|2). Συγκεκριµένα, για κάθε σηµείο που εντοπίζεται στην συµβολοσειρά y, η κεφαλή της δεύτερης ταινίας θα µετακινηθεί Ο(|x|) κελιά για να επιβεβαιώσει ότι αυτό το σηµείο δεν έχει ήδη εµφανιστεί / επισκεφθεί από την περιοδεία, και η κεφαλή της ταινίας εισόδου θα µετακινηθεί επίσης Ο(|x|) κελιά για να εντοπίσει την απόσταση του συγκεκριµένου σηµείου από το προηγούµενο στην περιοδεία. Επειδή αυτή η διαδικασία δεν µπορεί να επαναληφθεί περισσότερες από |x| φορές, ο συνολικός χρόνος υπολογισµού είναι Ο(|x|2).
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡
8.2 Έστω µια λογική πρόταση φ σε ΣΚΜ µε n λογικές µεταβλητές και m όρους. Μία NDTM Ν µπορεί να υπολογίζει όλες τις διαφορετικές αναθέσεις λογικών τιµών στις µεταβλητές σε µη ντετερµινιστικό χρόνο Ο(n) και, για καθεµία από αυτές, να ελέγξει αν ικανοποιεί την φ σε ντετερµινιστικό χρόνο Ο(mn). Αν µια ανάθεση αλήθειας ικανοποιεί την φ, ο αντίστοιχος κλάδος υπολογισµού καταλήγει σε κατάσταση αποδοχής, διαφορετικά σε κατάσταση απόρριψης. Εποµένως, αν η φ είναι ικανοποιήσιµη, τουλάχιστον ένας κλάδος υπολογισµού της Ν θα καταλήξει σε αποδοχή, ενώ διαφορετικά, όλοι οι κλάδοι θα καταλήξουν σε απόρριψη. Αφού αποφασίζεται από µία NDTM πολυωνυµικού χρόνου, το πρόβληµα της Ικανοποιησιµότητας µιας λογικής πρότασης φ σε ΣΚΜ ανήκει στο NP. Από τα παραπάνω γίνεται φανερό ότι και το πρόβληµα της 2 – Ικανοποιησιµότητας ανήκει στο NP, αλλά αυτό έχει την επιπλέον ιδιότητα να αποφασίζεται σε πολυωνυµικό ντετερµινιστικό χρόνο, δηλαδή να ανήκει στο P, το οποίο αποτελεί υποσύνολο του NP. 8.3 Μία NDTM πολυωνυµικού χρόνου µπορεί να «µαντέψει» µία ανάθεση αλήθειας και να επιβεβαιώσει ότι αυτή ικανοποιεί τουλάχιστον Β όρους του φ. Εποµένως, η Μέγιστη 2 – Ικανοποιησιµότητα ανήκει στο NP. Για να αποδείξουµε ότι είναι NP – πλήρης, θα ανάγουµε την 3 – Ικανοποιησιµότητα στη Μέγιστη 2 – Ικανοποιησιµότητα. Η αναγωγή που θα περιγράψουµε βασίζεται στο ακόλουθο σύνολο δέκα όρων που αποτελούνται από τέσσερις λογικές µεταβλητές. C = {(x), (y), (z), (w), (ÿx Ú ÿy), (ÿy Ú ÿz), (ÿx Ú ÿz), (x Ú ÿw), (y Ú ÿ w), (z Ú ÿw)} Παρατηρούµε ότι, ανεξάρτητα από την τιµή του w, αν τα x, y, z πάρουν ταυτόχρονα την τιµή FALSE, το πολύ έξι από τους δέκα όρους του C µπορούν να ικανοποιηθούν ταυτόχρονα. Αντίθετα, αν ένα τουλάχιστον από τα x, y, z πάρει την τιµή TRUE (δηλαδή ικανοποιηθεί ο όρος (x Ú y Ú z)), τότε ακριβώς επτά από τους δέκα όρους του C µπορούν να ικανοποιηθούν ταυτόχρονα. Αυτή η παρατήρηση αποτελεί και την κεντρική ιδέα της απόδειξης. Έστω ένα στιγµιότυπο φ της 3 – Ικανοποιησιµότητας, φ = (c1 Ÿ c2 Ÿ … Ÿ cm), όπου κάθε όρος ci έχει ακριβώς τρία άτοµα. Σε κάθε όρο ci της φ, ci = (li1 Ú li2 Ú li3), αντιστοιχούµε το σύνολο όρων Ci = {(li1), (li2), (li3), (wi), (ÿli1 Ú ÿli2), (ÿli2 Ú ÿli3), (ÿli1 Ú ÿli3),
241
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
242
(li1 Ú ÿwi), (li2 Ú ÿ wi), (li3 Ú ÿwi)}, όπου η µεταβλητή wi είναι διαφορετική για κάθε σύνολο όρων Ci. Το σύνολο όρων φ¢ για το πρόβληµα της Μέγιστης 2 – Ικανοποιησιµότητας αποτελείται από την ένωση των συνόλων όρων Ci, i = 1, 2, …, m. Η τιµή του φράγµατος Β είναι 7m. Είναι φανερό ότι το φ¢ µπορεί εύκολα να υπολογιστεί από την φ σε πολυωνυµικό χρόνο. Σύµφωνα µε τα παραπάνω, υπάρχει ανάθεση αλήθειας που ικανοποιεί ταυτόχρονα 7m όρους του φ¢ αν και µόνο αν αυτή η ανάθεση ικανοποιεί όλους τους όρους ci της λογικής πρότασης φ, δηλαδή αν και µόνο αν η φ είναι ικανοποιήσιµη. 8.4 Το Ελάχιστο Κάλυµµα Κορυφών ανήκει στο NP, γιατί µία NDTM πολυωνυµικού χρόνου µπορεί να «µαντέψει» ένα σύνολο κορυφών C, και να επιβεβαιώσει ότι αυτό αποτελεί ένα κάλυµµα κορυφών µεγέθους το πολύ Κ. Για να αποδείξουµε ότι είναι NP – πλήρες, θα ανάγουµε το Μέγιστο Σύνολο Ανεξαρτησίας στο Ελάχιστο Κάλυµµα Κορυφών. Η αναγωγή βασίζεται στην παρατήρηση ότι ένα σύνολο C είναι κάλυµµα κορυφών αν και µόνο αν το V – C είναι σύνολο ανεξαρτησίας. Ο λόγος είναι ότι αν το V – C είναι σύνολο ανεξαρτησίας, τότε όλες οι ακµές του G έχουν τουλάχιστον το ένα από τα δύο άκρα τους στο C, οπότε το C είναι κάλυµµα κορυφών αφού καλύπτει όλες τις ακµές του G. Αντίστροφα, αν το C είναι κάλυµµα κορυφών, τότε το V – C είναι σύνολο ανεξαρτησίας, αφού καµία ακµή του G δεν µπορεί να έχει και τα δύο άκρα της στο V – C. Εποµένως, ένα γράφηµα G(V, E) έχει ένα σύνολο ανεξαρτησίας µεγέθους τουλάχιστον Κ αν και µόνο αν το G(V, E) έχει ένα κάλυµµα κορυφών µεγέθους το πολύ |V| – K. Αυτή η απλή αναγωγή που µπορεί να υπολογιστεί σε σταθερό χρόνο αποδεικνύει ότι το Ελάχιστο Κάλυµµα Κορυφών είναι NP – πλήρες.
°ÏˆÛÛ¿ÚÈ ŸÚˆÓ
Αλγόριθµος Ένα πεπερασµένο σύνολο συγκεκριµένων κανόνων ή οδηγιών για την επίλυση ενός υπολογιστικού προβλήµατος. Κάθε αλγόριθµος δέχεται ένα σύνολο δεδοµένων εξόδου, τα οποία µετασχηµατίζει σε ένα σύνολο δεδοµένων εξόδου µετά από πεπερασµένο αριθµό βηµάτων. Αλγόριθµος Απληστίας Ένας αλγόριθµος που λειτουργεί µε τοπικά βέλτιστες επιλογές, ελπίζοντας ότι αυτή η στρατηγική θα οδηγήσει σε µία συνολικά βέλτιστη λύση. Η ιδέα της απληστίας εφαρµόζεται, συνήθως, σε προβλήµατα βελτιστοποίησης και όταν είναι επιτυχηµένη, δίνει αποδοτικούς και απλούς αλγόριθµους. Αλφάβητο Κάθε σύνολο συµβόλων ονοµάζεται αλφάβητο. Αναδροµική Εξίσωση Μαθηµατική εξίσωση που καθορίζει την τιµή µιας ακέραιης συνάρτησης στο σηµείο n χρησιµοποιώντας τις τιµές τις ίδιας συνάρτησης σε σηµεία µικρότερα του n. Για παράδειγµα, T(n) = 2T(n/2) + n. Οι αναδροµικές εξισώσεις προκύπτουν στην ανάλυση αναδροµικών αλγόριθµων. Αναδροµικός Αλγόριθµος Αλγόριθµος που λειτουργεί µε επίκληση του εαυτού του σε µικρότερα στιγµιότυπα και συνδυασµού των λύσεων αυτών των στιγµιότυπων για τον υπολογισµό της λύσης του αρχικού στιγµιότυπου. Παραδείγµατα είναι ο merge sort και quicksort για διάταξη αριθµών, ο FFT για τον υπολογισµό του ∆ιακριτού Μετασχηµατισµού Fourier και ο αλγόριθµος δυαδικής αναζήτησης. Ανάλυση Αλγόριθµου Ο προσδιορισµός των υπολογιστικών πόρων που απαιτεί η επίλυση ενός στιγµιότυπου του προβλήµατος µε το συγκεκριµένο αλγόριθµο. Η ποσότητα των υπολογιστικών πόρων προσδιορίζεται σαν συνάρτηση του µεγέθους του στιγµιότυπου που, συνήθως, συµβολίζεται µε n. Τα σηµαντικότερα είδη υπολογιστικών πόρων που προσδιορίζονται είναι ο χρόνος εκτέλεσης και ο αριθµός των θέσεων µνήµης.
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
244
Απόσταση Κορυφών Γραφήµατος ∆ύο κορυφές v, u ενός γραφήµατος βρίσκονται σε απόσταση k αν το συντοµότερο µονοπάτι από τη v στη u έχει µήκος k. Αρχή του Αναλλοίωτου Η επιστηµονικά τεκµηριωµένη πεποίθηση ότι δύο διαφορετικές υλοποιήσεις του ίδιου αλγόριθµου δεν διαφέρουν σε αποτελεσµατικότητα παρά µόνο κατά µία σταθερή αναλογία που εξαρτάται από την τεχνολογία του λογισµικού και του υλικού του υπολογιστή. Ασυµπτωτική Εκτίµηση Ο προσδιορισµός της τάξης µεγέθους των συναρτήσεων, που εκφράζουν την ποσότητα των πόρων που απαιτεί η εκτέλεση ενός αλγόριθµου. Ασυµπτωτικός Συµβολισµός Μαθηµατικός συµβολισµός που χρησιµοποιείται για τον προσδιορισµό και την περιγραφή της τάξης µεγέθους ακεραίων συναρτήσεων. Τα σηµαντικότερα σύµβολα είναι το Θ για ακριβή προσδιορισµό της τάξης µεγέθους µιας συνάρτησης, το Ο για άνω φράγµα της τάξης µεγέθους, το Ω για κάτω φράγµα της τάξης µεγέθους, το ο για άνω φράγµα που ξεπερνά την τάξη µεγέθους της συνάρτησης, και το ω για κάτω φράγµα που υπολείπεται της τάξης µεγέθους της συνάρτησης. Βαθµός Κορυφής Γραφήµατος Για µη κατευθυντικά γραφήµατα, ο αριθµός των ακµών που συντρέχουν στην κορυφή. Για κατευθυντικά γραφήµατα, βαθµός εισόδου είναι ο αριθµός των ακµών που καταλήγουν στην κορυφή, και βαθµός εξόδου ο αριθµός των ακµών που ξεκινούν από την κορυφή. Γλώσσα DTM – αποδεκτή Μία γλώσσα είναι DTM – αποδεκτή (DTM – acceptable) αν υπάρχει µία DTM Μ που αποδέχεται όλες τις συµβολοσειρές που ανήκουν στη γλώσσα και µόνο αυτές. Η Μ πρέπει να απορρίπτει ή να µην τερµατίζει µε είσοδο µία συµβολοσειρά που δεν ανήκει στη γλώσσα. Γλώσσα DTM – αποφασίσιµη Μία γλώσσα είναι DTM – αποφασίσιµη (DTM – decidable) αν υπάρχει µία DTM
°§ø™™∞ƒπ √ƒø¡
Μ που τερµατίζει για κάθε συµβολοσειρά εισόδου, αποδέχεται όλες τις συµβολοσειρές που ανήκουν στη γλώσσα και απορρίπτει όλες τις συµβολοσειρές που δεν ανήκουν στη γλώσσα. Γλώσσα NDTM – Αποδεκτή Μία γλώσσα είναι NDTM – αποδεκτή (NDTM – acceptable) αν υπάρχει µία NDTM της οποίας, για κάθε συµβολοσειρά που ανήκει στη γλώσσα, ένας τουλάχιστον κλάδος υπολογισµού τερµατίζει σε κατάσταση αποδοχής, ενώ για κάθε συµβολοσειρά που δεν ανήκει στη γλώσσα, όλοι οι κλάδοι υπολογισµού τερµατίζουν σε κατάσταση απόρριψης ή τερµατισµού. Γλώσσα NDTM – Αποφασίσιµη Μία γλώσσα είναι NDTM – αποφασίσιµη (NDTM – decidable) αν υπάρχει µία NDTM της οποίας όλοι οι κλάδοι υπολογισµού τερµατίζουν, και για κάθε συµβολοσειρά που ανήκει στη γλώσσα, ένας τουλάχιστον κλάδος τερµατίζει σε κατάσταση αποδοχής, ενώ για κάθε συµβολοσειρά που δεν ανήκει στη γλώσσα, όλοι οι κλάδοι υπολογισµού τερµατίζουν σε κατάσταση απόρριψης ή τερµατισµού. Γλώσσα Κάθε σύνολο συµβολοσειρών που ορίζεται σε συγκεκριµένο αλφάβητο. Χρησιµοποιώντας µία κωδικοποίηση, ένα πρόβληµα απόφασης µπορεί να αντιστοιχηθεί σε µία γλώσσα. Γράφηµα Ένα γράφηµα G(V, E) είναι ένα διατεταγµένο ζεύγος το οποίο αποτελείται από το σύνολο των κορυφών V και από το σύνολο των ακµών Ε. Οι ακµές µπορεί να έχουν κατεύθυνση, οπότε το γράφηµα ονοµάζεται κατευθυντικό ή να µην έχουν κατεύθυνση, οπότε το γράφηµα ονοµάζεται µη κατευθυντικό. Γρήγορος Μετασχηµατισµός Fourier (Fast Fourier Transform, FFT) Αναδροµικός, «διαίρει και βασίλευε» αλγόριθµος που υπολογίζει το ∆ιακριτό Μετασχηµατισµό Fourier ενός διανύσµατος διάστασης n σε χρόνο Θ(n log n). Χρησιµοποιείται και για τον υπολογισµό του γινοµένου πολυωνύµων όταν αυτά αναπαρίστανται µε το διάνυσµα των συντελεστών τους. ∆έντρο Υπολογισµών µίας NDTM Ο υπολογισµός µίας NDTM αναπαρίσταται µε ένα δέντρο υπολογισµών, κάθε
245
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
246
κόµβος του οποίου αναπαριστά µία διαµόρφωση, ενώ οι κόµβοι – απόγονοί του αναπαριστούν όλες τις εναλλακτικές επόµενες διαµορφώσεις. ∆έντρο Ένα άκυκλο, συνεκτικό γράφηµα. ∆ιαίρει και Βασίλευε Μέθοδος σχεδιασµού αλγορίθµων που συνίσταται στη διάσπαση του στιγµιότυπου εισόδου σε µικρότερα, επιµέρους, στιγµιότυπα του ίδιου προβλήµατος, στην επίλυση των επιµέρους στιγµιότυπων, και στον υπολογισµό µιας λύσης για το αρχικό στιγµιότυπο από τις λύσεις των επιµέρους στιγµιότυπων. Τα επιµέρους στιγµιότυπα, συνήθως, λύνονται µε επίκληση του ίδιου αλγόριθµου, οπότε το αποτέλεσµα είναι ένας αναδροµικός αλγόριθµος. ∆υναµικός Προγραµµατισµός Μέθοδος σχεδιασµού αλγόριθµων που επιλύει ένα πρόβληµα συνδυάζοντας τις λύσεις κατάλληλα επιλεγµένων προβληµάτων. Εφαρµόζεται, συνήθως, σε προβλήµατα βελτιστοποίησης και η µέθοδος επίλυσης βασίζεται σε µία αναδροµική εξίσωση που περιγράφει την τιµή της βέλτιστης λύσης. Ιδιότητα Άπληστης Επιλογής Ένα πρόβληµα βελτιστοποίησης έχει την ιδιότητα της άπληστης επιλογής ως προς κάποιο συγκεκριµένο κριτήριο όταν υπάρχει µία ακολουθία επιλογών, που είναι βέλτιστες ως προς αυτό το κριτήριο, καταλήγει στη βέλτιστη λύση. Ιδιότητα χαρακτηριστική των προβληµάτων στα οποία εφαρµόζεται η µέθοδος της απληστίας. Ιδιότητα Βέλτιστων Επιµέρους ∆οµών Ένα πρόβληµα βελτιστοποίησης έχει την ιδιότητα των βέλτιστων επιµέρους δοµών όταν κάθε βέλτιστη λύση για ένα στιγµιότυπο συνίσταται από τις βέλτιστες λύσεις συγκεκριµένων επιµέρους στιγµιότυπων. Αποτελεί χαρακτηριστική ιδιότητα των προβληµάτων στα οποία εφαρµόζεται ο δυναµικός προγραµµατισµός και η µέθοδος της απληστίας. Ιδιότητα Επικαλυπτόµενων Επιµέρους Προβληµάτων Ένα πρόβληµα έχει την ιδιότητα των επικαλυπτόµενων επιµέρους προβληµάτων όταν, καθώς προσπαθούµε να διαιρέσουµε το πρόβληµα σε επιµέρους στιγµιότυπα, εµφανίζονται πολλές φορές τα ίδια επιµέρους στιγµιότυπα και, άρα, η επί-
°§ø™™∞ƒπ √ƒø¡
λυση του αρχικού στιγµιότυπου απαιτεί την επίλυση ενός µικρού αριθµού διαφορετικών επιµέρους στιγµιότυπων. Ιδιότητα χαρακτηριστική των προβληµάτων στα οποία εφαρµόζεται ο δυναµικός προγραµµατισµός. Κλάση Πολυπλοκότητας DTIME[t(n)] Το σύνολο των γλωσσών / προβληµάτων που αποφασίζονται από DTM µε χρονική πολυπλοκότητα Ο(t(n)). Κλάση Πολυπλοκότητας EXP Το σύνολο των γλωσσών / προβληµάτων που αποφασίζονται από DTM εκθετικού χρόνου. Κλάση Πολυπλοκότητας NP Το σύνολο των γλωσσών / προβληµάτων που αποφασίζονται από NDTM πολυωνυµικού χρόνου. Κλάση Πολυπλοκότητας NTIME[t(n)] Το σύνολο των γλωσσών / προβληµάτων που αποφασίζονται από NDTM µε χρονική πολυπλοκότητα Ο(t(n)). Κλάση Πολυπλοκότητας P Το σύνολο των γλωσσών / προβληµάτων που αποφασίζονται από DTM πολυωνυµικού χρόνου. Κύκλος Γραφήµατος Ένα µονοπάτι στο οποίο η πρώτη και η τελευταία κορυφή ταυτίζονται. Κωδικοποίηση Κάθε συστηµατική αναπαράσταση των στιγµιότυπων ενός προβλήµατος σε συµβολοσειρές ενός αλφάβητου. Λίστα Γειτονικότητας Γραφήµατος Μία µέθοδος αναπαράστασης ενός γραφήµατος G(V, E). Αποτελείται από |V| λίστες, µία για κάθε κορυφή. Η λίστα για την κορυφή v περιέχει όλες τις κορυφές που είναι γειτονικές της v.
247
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
248
Μέθοδος Απληστίας Βλέπε Άπληστος Αλγόριθµος. Μη Ντετερµινισµός Υπολογιστικό µοντέλο στο οποίο το επόµενο βήµα του υπολογισµού δεν ορίζεται µονοσήµαντα από τον αλγόριθµο και τη συµβολοσειρά εισόδου. Με βάση την τρέχουσα διαµόρφωση, το επόµενο βήµα του υπολογισµού επιλέγεται από ένα σύνολο εναλλακτικών βηµάτων. Η µη ντετερµινιστική µηχανή επιλέγει πάντα το «καλύτερο» βήµα. Έτσι, αρκεί µία τις εναλλακτικές ακολουθίες υπολογισµού να οδηγεί σε αποδοχή για να θεωρηθεί η είσοδος αποδεκτή, ενώ πρέπει όλες οι εναλλακτικές ακολουθίες υπολογισµού να οδηγούν σε απόρριψη για να θεωρηθεί η είσοδος απορριπτέα. ∆εν αποτελεί ένα ρεαλιστικό υπολογιστικό µοντέλο, αλλά έχει πληθώρα εφαρµογών σε όλο το φάσµα της Επιστήµης των Υπολογιστών. Μη Ντετερµινιστική Μηχανή Turing (NDTM) Το βασικό υπολογιστικό µοντέλο για το µη ντετερµινισµό. Μία NDTM Ν είναι µία τετράδα Μ = (Q, Σ, ∆, q0), όπου Q είναι το σύνολο καταστάσεων, Σ το αλφάβητο εισόδου της µηχανής, ∆ η σχέση µετάβασης, και q0 η αρχική κατάσταση. Το γεγονός ότι το ∆ είναι σχέση και όχι συνάρτηση, υποδεικνύει το γεγονός ότι κάθε διαµόρφωση έχει µία ή περισσότερες εναλλακτικές επόµενες διαµορφώσεις. Μηχανή Άµεσης Προσπέλασης Μνήµης (Random Access Machine, RAM) Θεωρητικό µοντέλο υπολογιστή µε έναν επεξεργαστή και θέσεις µνήµης που προσπελαύνονται µε άµεσο τρόπο. Χρησιµοποιείται για την ανάλυση των αλγόριθµων θεωρώντας ότι η προσπέλαση κάθε θέσης µνήµης όπως και η εκτέλεση κάθε στοιχειώδους εντολής (π.χ. πρόσθεσης, σύγκρισης, εκχώρησης τιµής αριθµών και συµβόλων που καταλαµβάνουν µία θέση µνήµης) έχει µοναδιαίο κόστος. Μονοπάτι Γραφήµατος Μία ακολουθία κορυφών <v0, v1, …, vk–1, vk> που συνδέονται µε ακµές (v0, v1), (v1, v2), …, (vk–1, vk). Το µήκος του µονοπατιού είναι k, δηλαδή όσος ο αριθµός των ακµών που παρεµβάλλονται. Το µονοπάτι είναι απλό αν καµία κορυφή δεν εµφανίζεται δύο ή περισσότερες φορές. Ντετερµινιστική Μηχανή Turing (DTM) Το βασικό υπολογιστικό µοντέλο στη Θεωρία Υπολογιστικής Πολυπλοκότητας.
°§ø™™∞ƒπ √ƒø¡
Αποτελεί το ισοδύναµο ενός υπολογιστή συγκεκριµένου προγράµµατος. Μία DTM Μ είναι µία τετράδα Μ = (Q, Σ, δ, q0), όπου Q είναι το σύνολο καταστάσεων, Σ το αλφάβητο εισόδου της µηχανής, δ η συνάρτηση µετάβασης, και q0 η αρχική κατάσταση. Ντετερµινιστικός Αλγόριθµος Κάθε αλγόριθµος που δεν χρησιµοποιεί τυχαιότητα τις επιλογές του ονοµάζεται ντετερµινιστικός αλγόριθµος. Πιθανοτικός Αλγόριθµος Κάθε αλγόριθµος που χρησιµοποιεί τυχαιότητα σε κάποιες από τις επιλογές του ονοµάζεται πιθανοτικός αλγόριθµος. Πίνακας Γειτονικότητας Γραφήµατος Μία µέθοδος αναπαράστασης ενός γραφήµατος G(V, E). Είναι ένας πίνακας |V| ¥ |V|, το στοιχείο [v, u] του οποίου είναι 1 αν η ακµή (v, u) Œ E, και είναι 0 διαφορετικά. Πληρότητα (ως προς Κλάση Πολυπλοκότητας) Ένα πρόβληµα Π είναι πλήρες για µία κλάση πολυπλοκότητας C, αν ανήκει στη C, και κάθε πρόβληµα Π¢ Œ C ανάγεται πολυωνυµικά στο Π. Πολυωνυµική Αναγωγή Ένας µετασχηµατισµός R ενός προβλήµατος Π1 σε ένα πρόβληµα Π2 που µπορεί να υπολογιστεί σε πολυωνυµικό χρόνο. Έχει την ιδιότητα το x Œ Π1 αν και µόνο αν το R(x) Œ Π2. Πρόβληµα Βλέπε Υπολογιστικό Πρόβληµα. Πρόβληµα NP – Πλήρες Κάθε πρόβληµα που είναι πλήρες για την κλάση NP. Η εκδοχές απόφασης πολύ σηµαντικών προβληµάτων συνδυαστικής βελτιστοποίησης έχουν αποδειχθεί πλήρεις για το NP. Είναι κοινή επιστηµονική πεποίθηση ότι για τα NP – πλήρη προβλήµατα δεν υπάρχουν αλγόριθµοι πολυωνυµικού χρόνου. Αν για κάποιο NP –
249
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
250
πλήρες πρόβληµα υπάρχει αλγόριθµος πολυωνυµικού χρόνου, τότε οι κλάσεις P και NP ταυτίζονται. Πρόβληµα Απόφασης Ένα πρόβληµα απόφασης είναι ένα υπολογιστικό πρόβληµα µε µόνο δύο λύσεις, ΝΑΙ και ΟΧΙ. Τα προβλήµατα απόφασης µελετώνται, κυρίως, στη Θεωρία Υπολογιστικής Πολυπλοκότητας. Πρόβληµα Βελτιστοποίησης Ένα πρόβληµα βελτιστοποίησης έχει πολλές αποδεκτές λύσεις για κάθε στιγµιότυπο εισόδου, σε καθεµία από τις οποίες αντιστοιχεί µία τιµή. Το ζητούµενο είναι ο υπολογισµός της λύσης µε τη βέλτιστη τιµή. Παραδείγµατα προβληµάτων βελτιστοποίησης είναι τα προβλήµατα του Πολλαπλασιασµού Ακολουθίας Πινάκων, της Μεγαλύτερη Κοινής Υποακολουθίας και της Επιλογής Ανταγωνιστικών ∆ραστηριοτήτων. Πρόβληµα ∆υσεπίλυτο Κάθε πρόβληµα για το οποίο είτε υπάρχει απόδειξη είτε ισχυρές ενδείξεις ότι δεν ανήκει στην κατηγορία των ευεπίλυτων προβληµάτων. Πρόβληµα Ελαχιστοποίησης Ένα πρόβληµα βελτιστοποίησης όπου ζητείται να υπολογιστεί η λύση µε την ελάχιστη τιµή. Πρόβληµα Ευεπίλυτο Κάθε πρόβληµα για το οποίο υπάρχει αλγόριθµος που λύνει το πρόβληµα χρησιµοποιώντας εύλογη ποσότητα υπολογιστικών πόρων. Η θέση των Cook – Karp ταυτίζει τα ευεπίλυτα προβλήµατα µε αυτά που λύνονται από αλγόριθµους πολυωνυµικού χρόνου. Πρόβληµα Μεγιστοποίησης Ένα πρόβληµα βελτιστοποίησης όπου ζητείται να υπολογιστεί η λύση µε τη µέγιστη τιµή. Στιγµιότυπο Υπολογιστικού Προβλήµατος Ένα στιγµιότυπο ενός υπολογιστικού προβλήµατος ορίζεται από µία ανάθεση
°§ø™™∞ƒπ √ƒø¡
συγκεκριµένων τιµών στα δεδοµένα εισόδου του προβλήµατος που πρέπει να είναι σύµφωνη µε τον ορισµό του προβλήµατος. Το µέγεθος του στιγµιότυπου αποτελεί µέτρο των συνιστωσών του. Συµβολοσειρά Κάθε ακολουθία συµβόλων ενός αλφαβήτου είναι µία συµβολοσειρά ορισµένη στο συγκεκριµένο αλγάβητο. Συνεκτική Συνιστώσα Γραφήµατος Ένα µη συνεκτικό γράφηµα µπορεί να χωρισθεί σε συνεκτικά υπογραφήµατα που ονοµάζονται συνεκτικές συνιστώσες. Ένα µη ισχυρά συνεκτικό, κατευθυντικό γράφηµα µπορεί να χωρισθεί σε ισχυρά συνεκτικά υπογραφήµατα που ονοµάζονται ισχυρά συνεκτικές συνιστώσες. Συνεκτικό Γράφηµα Ένα γράφηµα µεταξύ κάθε δύο κορυφών του οποίου υπάρχει µονοπάτι από τη µία στην άλλη. Ένα κατευθυντικό γράφηµα ονοµάζεται ισχυρά συνεκτικό όταν για κάθε ζευγάρι κορυφών v, u, υπάρχει µονοπάτι τόσο από τη v στη u όσο και από τη u στη v. Υπογράφηµα Γραφήµατος Ένα γράφηµα G¢(V¢, E¢) ονοµάζεται υπογράφηµα ενός γραφήµατος G(V, E) αν V¢ Õ V και E¢ Õ E. Το G¢ ονοµάζεται υπογράφηµα του G που ορίζεται από το V¢ αν περιέχει όλες τις ακµές του G που συνδέουν κορυφές του V¢. Υπολογιστική Πολυπλοκότητα Κλάδος της Επιστήµης των Υπολογιστών που εξετάζει τους λόγους για τους οποίους µερικά προβλήµατα είναι δύσκολο ή αδύνατο να λυθούν από έναν υπολογιστή. Εξετάζει την επίδραση διάφορων υπολογιστικών µοντέλων στην ποσότητα των πόρων που χρειάζεται ένα πρόβληµα για να λυθεί, και οµαδοποιεί τα προβλήµατα σε κλάσεις ανάλογα µε τους πόρους που χρειάζονται για να λυθούν σε κάποιο υπολογιστικό µοντέλο. Υπολογιστικό Πρόβληµα Ένα υπολογιστικό πρόβληµα ορίζεται από ένα σύνολο δεδοµένων εισόδου, ένα σύνολο δεδοµένων εξόδου και µία επιθυµητή σχέση µεταξύ τους. Η σχέση µετα-
251
A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
252
ξύ δεδοµένων εισόδου και εξόδου χαρακτηρίζει το πρόβληµα και, συνήθως, διατυπώνεται µε µαθηµατικούς περιορισµούς οι οποίοι πρέπει να ικανοποιούνται. Χρόνος Εκτέλεσης Μέσης Περίπτωσης Η µέση τιµή, για κάποια κατανοµή στιγµιότυπων µεγέθους n, χρόνος εκτέλεσης ενός αλγόριθµου. Ο υπολογισµός του απαιτεί να υποθέσουµε ότι κάθε στιγµιότυπο µεγέθους n εµφανίζεται µε µία συγκεκριµένη πιθανότητα. Ο χρόνος εκτέλεσης µέσης περίπτωσης δίνεται από το άθροισµα, για όλα τα στιγµιότυπα µεγέθους n, των γινοµένων της πιθανότητας να εµφανιστεί κάθε στιγµιότυπο επί το χρόνο εκτέλεσης του αλγόριθµου για αυτό το στιγµιότυπο. Χρόνος Εκτέλεσης Χειρότερης Περίπτωσης Ο µέγιστος, για όλα τα διαφορετικά στιγµιότυπα µεγέθους n, χρόνος εκτέλεσης ενός αλγόριθµου. Ψάξιµο Πρώτα σε Βάθος Αλγόριθµος εξερεύνησης γραφηµάτων που προχωράει όσο το δυνατόν µακρύτερα από την αρχική κορυφή χρησιµοποιώντας όλες τις εξερχόµενες ακµές της κορυφής που επισκέφτηκε τελευταία. Ψάξιµο Πρώτα σε Πλάτος Αλγόριθµος εξερεύνησης γραφηµάτων που, ξεκινώντας από µία κορυφή s, επισκέπτεται όλες τις κορυφές σε απόσταση k από την s πριν επισκεφθεί οποιαδήποτε κορυφή σε απόσταση k + 1. Ψευδοκώδικας Ένα απλό σύνολο κανόνων και εντολών που µοιάζει ως προς τη µορφή και την έκφραση µε τις γλώσσες προγραµµατισµού και χρησιµοποιείται για την αναπαράσταση αλγορίθµων. Ένας αλγόριθµος διατυπωµένος σε ψευδοκώδικα, συνήθως, µπορεί εύκολα να µετατραπεί σε ένα έγκυρο πρόγραµµα σε κάποια γλώσσα προγραµµατισµού.
info@webart‐studios.gr +(30)6981756361 +(30)2112217386 Εθνικής Αντιστάσεως 94 , Περιστέρι , 12135 www.webart‐studios.gr
WEB ART STUDIOS
1