Professional Documents
Culture Documents
FOTAKIS
FOTAKIS
Σηµείωση
Το ΕΑΠ είναι υπεύθυνο για την επιµέλεια έκδοσης και την ανάπτυξη των κειµένων σύµφωνα µε τη Μεθο-
δολογία της εξ Αποστάσεως Εκπαίδευσης. Για την επιστηµονική αρτιότητα και πληρότητα των συγγραµ-
µάτων την αποκλειστική ευθύνη φέρουν οι συγγραφείς, κριτικοί αναγνώστες και ακαδηµαϊκοί υπεύθυνοι
που ανέλαβαν το έργο αυτό.
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
Σχολή Θετικών Επιστηµών και Τεχνολογίας
Πρόγραµµα Σπουδών
ΠΛHPOΦOPIKH
Θεµατική Ενότητα
ΘΕMΕΛΙΩΣΕΙΣ ΕΠΙΣΤΗΜΗΣ Η/Υ
Τόµος A'
ΠATPA 2001
ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ
Σχολή Θετικών Επιστηµών και Τεχνολογίας
Πρόγραµµα Σπουδών
ΠΛHPOΦOPIKH
Θεµατική Ενότητα
ΘΕΜΕΛΙΩΣΕΙΣ ΕΠΙΣΤΗΜΗΣ Η/Υ
Τόµος A'
Aλγόριθµοι και Πολυπλοκότητα
Συγγραφή
Κριτική Ανάγνωση
∆ΗΜΗΤΡΙΟΣ ΚΑΒΒΑ∆ΙΑΣ
Eπίκουρος Kαθηγητής Tµήµατος Mαθηµατικών
Πανεπιστηµίου Πατρών
ISBN: 960–538–353–5
Kωδικός Έκδοσης: ΠΛH 30/1
K∂º∞§∞π√ 1
EÈÛ·ÁˆÁÈΤ˜ ¤ÓÓÔȘ
Σύνοψη ................................................................................................................................................................................... 29
Bιβλιογραφία ..................................................................................................................................................................... 30
K∂º∞§∞π√ 2
M·ıËÌ·ÙÈÎfi ˘fi‚·ıÚÔ
Σύνοψη ................................................................................................................................................................................... 56
Bιβλιογραφία ..................................................................................................................................................................... 57
K∂º∞§∞π√ 3
¢È·›ÚÂÈ Î·È B·Û›Ï¢Â
Σύνοψη ................................................................................................................................................................................... 87
Bιβλιογραφία ..................................................................................................................................................................... 88
K∂º∞§∞π√ 4
¢˘Ó·ÌÈÎfi˜ ÚÔÁÚ·ÌÌ·ÙÈÛÌfi˜
K∂º∞§∞π√ 5
ÕÏËÛÙÔÈ ·ÏÁfiÚÈıÌÔÈ
K∂º∞§∞π√ 6
AÏÁfiÚÈıÌÔÈ ÂÍÂÚ‡ÓËÛ˘ ÁÚ·ÊËÌ¿ÙˆÓ
K∂º∞§∞π√ 7
EÈÛ·ÁˆÁ‹ ÛÙËÓ ˘ÔÏÔÁÈÛÙÈ΋ ÔÏ˘ÏÔÎfiÙËÙ·
K∂º∞§∞π√ 8
MË ÓÙÂÙÂÚÌÈÓÈÛÌfi˜ Î·È NP–ÏËÚfiÙËÙ·
Παρά τις σηµαντικές προόδους της Θεωρίας Αλγορίθµων και τις επίµονες και µακρο-
χρόνιες προσπάθειες πλήθους ικανών επιστηµόνων, υπάρχουν πολλά σηµαντικά προ-
βλήµατα για τα οποία δεν έχουµε κατορθώσει να σχεδιάσουµε αποδοτικούς αλγό-
ριθµους. Η Θεωρία Υπολογιστικής Πολυπλοκότητας αναπτύχθηκε για να µελετήσει
τους λόγους για τους οποίους κάποια υπολογιστικά προβλήµατα είναι δύσκολο ή
αδύνατο να λυθούν από έναν Υπολογιστή.
Η Θεωρία Υπολογιστικής Πολυπλοκότητας εστιάζει στη µελέτη διαφορετικών υπο-
λογιστικών µοντέλων και στην επίδραση που αυτά έχουν στη δυνατότητα και στην
ποσότητα υπολογιστικών πόρων που χρειάζονται για την επίλυση ενός προβλήµα-
τος. Για κάθε υπολογιστικό µοντέλο, η Θεωρία Υπολογιστικής Πολυπλοκότητας
µελετά αν ένα υπολογιστικό πρόβληµα µπορεί να επιλυθεί ή όχι. Αν το πρόβληµα
µπορεί να επιλυθεί, η Θεωρία Πολυπλοκότητας µελετά την ελάχιστη ποσότητα υπο-
λογιστικών πόρων που απαιτούνται για την επίλυση του προβλήµατος στο συγκε-
κριµένο µοντέλο. Με βάση τις απαντήσεις στα παραπάνω ερωτήµατα, τα υπολογι-
στικά προβλήµατα εντάσσονται σε κλάσεις πολυπλοκότητας, οι οποίες αποτελού-
νται από προβλήµατα που εµφανίζουν παρόµοια συµπεριφορά ως προς την επιλυσι-
µότητά τους σε κάποιο συγκεκριµένο υπολογιστικό µοντέλο.
Η Θεωρία Υπολογιστικής Πολυπλοκότητας µας εφοδιάζει µε ένα σηµαντικό αριθ-
µό κλάσεων πολυπλοκότητας, στις οποίες έχουν ενταχθεί πολλά συνηθισµένα υπο-
λογιστικά προβλήµατα. Επιπλέον, µας εφοδιάζει µε τεχνικές και µεθόδους για την
ένταξη και νέων υπολογιστικών προβληµάτων σε αυτές τις κλάσεις πολυπλοκότη-
τας. Έχοντας εντάξει ένα πρόβληµα σε µία κλάση πολυπλοκότητας, γνωρίζουµε κατά
πόσον υπάρχει αποδοτικός αλγόριθµος για την επίλυση αυτού του προβλήµατος.
Εποµένως, µία από τις αλγοριθµικές εφαρµογές της Υπολογιστικής Πολυπλοκότη-
τας είναι ότι συχνά µας επιτρέπει να αποφύγουµε τη µάταια αναζήτηση αποδοτικών
αλγόριθµων για προβλήµατα για τα οποία εικάζεται ή έχει αποδειχθεί ότι τέτοιοι
αλγόριθµοι δεν υπάρχουν.
Οι παραπάνω εισαγωγικές παρατηρήσεις θέτουν σε γενικές γραµµές το πλαίσιο που
κινείται αυτό το βιβλίο. Η ύλη που καλύπτεται στο βιβλίο έχει χωρισθεί σε οκτώ
κεφάλαια, τα δύο πρώτα από τα οποία µπορούν να χαρακτηρισθούν εισαγωγικά, τα
τέσσερα επόµενα καλύπτουν αλγοριθµικά θέµατα, και τα δύο τελευταία ζητήµατα
από τη Θεωρία Πολυπλοκότητας. Το βιβλίο έχει γραφεί ώστε η µελέτη του να προ-
ϋποθέτει µόνο µια στοιχειώδη εξοικείωση µε κάποιες θεµελιώδεις µαθηµατικές έννοι-
ες και τεχνικές από την πλευρά του αναγνώστη. Όλες οι έννοιες της Θεωρίας Αλγο-
ρίθµων και της Θεωρίας Υπολογιστικής Πολυπλοκότητας ορίζονται την πρώτη φορά
που χρησιµοποιούνται, ενώ σε ειδικό κεφάλαιο, περιγράφονται αναλυτικά οι βασι-
¶ƒ√§√°√™ 13
σηµαντικά στην ουσιαστική βελτίωση της ποιότητας αυτού του τόµου, και τον Ανα-
πληρωτή Καθηγητή κ. Θανάση Χατζηλάκο, ο οποίος βοήθησε σηµαντικά στο να
εκδοθεί αυτό το βιβλίο στην παρούσα του µορφή.
Παύλος Σπυράκης
∆ηµήτρης Φωτάκης
Πάτρα, Ιούνιος 2001
EÈÛ·ÁˆÁÈΤ˜ ¤ÓÓÔȘ
™ÎÔfi˜
∫ ∂
Σκοπός αυτού του κεφαλαίου είναι να οριστούν οι βασικές έννοιες του αλγόριθµου,
του προβλήµατος και του στιγµιότυπου, της ανάλυσης των αλγορίθµων, της αρχής
του αναλλοίωτου και της ασυµπτωτικής εκτίµησης, οι οποίες θα χρησιµοποιηθούν
στη συνέχεια του βιβλίου.
1
º ∞ § ∞ π √
¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·
ŒÓÓÔȘ ÎÏÂȉȿ
• αλγόριθµος τική εκτίµηση
• πρόβληµα, στιγµιότυπο και µέγεθος • ανάλυση αλγορίθµων
στιγµιότυπου • ανάλυση χειρότερης και µέσης περί-
• αρχή του αναλλοίωτου και ασυµπτω- πτωσης
∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Ένας αποδοτικός αλγόριθµος πρέπει να κάνει ακριβώς αυτό που έχει σχεδιαστεί να κάνει,
µε το µικρότερο δυνατό κόστος. Αν και υπάρχουν µια σειρά από τεχνικές και µεθοδολο-
γίες που βοηθούν στο σχεδιασµό αλγορίθµων για διάφορες κατηγορίες προβληµάτων, ο
σχεδιασµός ενός αποδοτικού αλγορίθµου είναι συχνά µια πολύ δύσκολη υπόθεση.
Μετά το σχεδιασµό του αλγορίθµου, που συνήθως ολοκληρώνεται µε την περιγραφή
του σε ψευδοκώδικα, ο σχεδιαστής πρέπει να ελέγξει την ορθότητα του αλγορίθµου,
δηλαδή το αν ο αλγόριθµος πραγµατικά κάνει τη δουλειά για την οποία έχει σχεδιαστεί.
16 KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™
Η επιβεβαίωση της ορθότητας ανοίγει το δρόµο για την ανάλυση του αλγορίθµου,
δηλαδή για τον προσδιορισµό των υπολογιστικών πόρων που απαιτεί η εκτέλεση του
αλγορίθµου. Μεταξύ άλλων, η ανάλυση αφορά στο χρόνο εκτέλεσης του αλγορίθµου.
Επειδή µεγαλύτερα στιγµιότυπα ενός προβλήµατος είναι πάντα δυσκολότερο να
λυθούν, οι πόροι που καταναλώνει ο αλγόριθµος προσδιορίζονται σαν αύξουσα
συνάρτηση του µεγέθους του στιγµιότυπου εισόδου. Η ανάλυση ενός αλγορίθµου
συχνά απαιτεί τη χρήση µαθηµατικών τεχνικών για την επίλυση αναδροµικών εξι-
σώσεων, την εύρεση κλειστών τύπων αθροισµάτων, κλπ. Τα αποτελέσµατα της ανά-
λυσης τεκµηριώνουν την αποδοτικότητα του αλγορίθµου.
Ένα τελευταίο στάδιο είναι ο προσδιορισµός κάτω φραγµάτων στην αποδοτικότητα
των αλγορίθµων για ένα συγκεκριµένο πρόβληµα. Ο προσδιορισµός ενός κάτω φράγ-
µατος επιτρέπει στο σχεδιαστή να γνωρίζει το βαθµό στον οποίο µπορεί να βελτιω-
θεί η αποδοτικότητα των αλγορίθµων για το προς επίλυση πρόβληµα.
Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες:
1.1. Τι είναι αλγόριθµος;
1.2. Αναπαράσταση αλγόριθµων
1.3. Προβλήµατα και στιγµιότυπα
1.4. Αποτελεσµατικότητα αλγόριθµων
1.5. Ανάγκη για αποδοτικούς αλγόριθµους
1.1 ∆π ∂π¡∞π ∞§°√ƒπ£ª√™; 17
Το Λεξικό της Οξφόρδης (Concise Oxford Dictionary) ορίζει ως αλγόριθµο µια δια-
δικασία ή ένα σύνολο κανόνων µε σκοπό τον υπολογισµό (ιδιαίτερα το µηχανιστι-
κό υπολογισµό). Η εκτέλεση ενός αλγορίθµου δεν θα πρέπει, εποµένως, να απαιτεί
τη χρήση της διαίσθησης ή της δηµιουργικότητας, µολονότι τα όρια µεταξύ αλγο-
ρίθµων και ανθρώπινων σχεδίων προς εκτέλεση είναι όλο και περισσότερο δυσδιά-
κριτα, π.χ. η χρήση τυχαιότητας στους αλγορίθµους.
Κάθε αλγόριθµος δέχεται ένα σύνολο δεδοµένων εισόδου (input), τα οποία µετα-
σχηµατίζει σε ένα σύνολο δεδοµένων εξόδου (output). Εποµένως, ένας αλγόριθµος
µπορεί να θεωρηθεί και σαν ένα εργαλείο για την επίλυση ενός υπολογιστικού προ-
βλήµατος, όπου ο ορισµός του προβλήµατος καθορίζει την επιθυµητή σχέση µετα-
ξύ των δεδοµένων εισόδου και εξόδου.
Στο βιβλίο αυτό µε τον όρο αλγόριθµος θα εννοούµε µια «συνταγή» ή ένα καθορισµέ-
νο σύνολο κανόνων ή οδηγιών για την επίλυση ενός υπολογιστικού προβλήµατος. Κατά
νου θα έχουµε ότι το έργο αυτό θα εκτελεσθεί µέσω µίας εξελιγµένης υπολογιστικής
µηχανής (ενός Υπολογιστή – Computer). Όπως συµβαίνει µε κάθε συνηθισµένη «συντα-
γή», ένας αλγόριθµος πρέπει να έχει πεπερασµένη περιγραφή και να οδηγεί στην επί-
λυση του προβλήµατος ύστερα από την εκτέλεση πεπερασµένου αριθµού βηµάτων.
Όχι νωρίτερα από το 1930, διάφοροι µαθηµατικοί ορισµοί της έννοιας µιας «πεπε-
ρασµένης υπολογιστικής διαδικασίας» δόθηκαν από τους Church, Godel, Herbrand,
Kleene, Post, Turing, και άλλους. Οι ορισµοί αυτοί είχαν ως βάση µεθόδους που επι-
φανειακά εµφανίζονταν πολύ διαφορετικές µεταξύ τους (π.χ. τυπικά συστήµατα επε-
ξεργασίας συµβόλων, ιδανικά µοντέλα υπολογιστικών µηχανών). Όµως, όλοι οι ορι-
σµοί αυτοί καταλήγουν στο να είναι ισοδύναµοι, µε την έννοια ότι όλες οι «µορφές»
αλγορίθµων υπολογίζουν την ίδια κατηγορία συναρτήσεων, η οποία είναι ακριβώς η
κατηγορία των µερικώς αναδροµικών συναρτήσεων (partial recursive functions).
Μέχρι τώρα, και παρά τις προόδους της τεχνολογίας, το σύνολο της εµπειρίας µας
καταδεικνύει ότι η κλάση των συναρτήσεων αυτών είναι ακριβώς ότι µπορεί να υπο-
λογισθεί συστηµατικά (από υπολογιστές, προγράµµατα, ή πεπερασµένες διαδικασίες).
Οι µέθοδοι πολλαπλασιασµού και διαίρεσης (πολυψηφίων) αριθµών που µαθαίνου-
µε στο σχολείο είναι αλγόριθµοι, αφού αποτελούν µία «συνταγή» για τον µετασχη-
µατισµό ενός ζεύγους αριθµών στο γινόµενό τους και στο πηλίκο τους αντίστοιχα.
Ο πλέον γνωστός ιστορικά αλγόριθµος είναι ο αλγόριθµος του Ευκλείδη για τον υπο-
λογισµό του Μέγιστου Κοινού ∆ιαιρέτη δύο ακεραίων.
Οι αλγόριθµοι είναι λοιπόν οι συνταγές µε βάση τις οποίες οι υπολογιστές απαντούν
18 KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™
¶·Ú¿‰ÂÈÁÌ·1.1
∞ÏÁfiÚÈıÌÔ˜ ÔÏÏ·Ï·ÛÈ·ÛÌÔ‡
Έστω ότι πρέπει να πολλαπλασιάσουµε δύο θετικούς ακεραίους µε χρήση µόνο στυλό
και χαρτιού. Το ∆ηµοτικό Σχολείο µάς διδάσκει να πολλαπλασιάσουµε τον ένα από τους
αριθµούς (τον «µεγαλύτερο» σε µήκος, τον πολλαπλασιαστέο) διαδοχικά µε κάθε ψηφίο
του πολλαπλασιαστή από δεξιά προς τα αριστερά. Έπειτα, γράφουµε το κάθε ενδιάµεσο
αποτέλεσµα κάτω από το προηγούµενο, κάθε φορά µετατοπίζοντας µια θέση αριστερά.
Τέλος, προσθέτουµε κατά στήλη (µε κρατούµενα) για να βρούµε το σωστό αποτέλεσµα.
Αυτός είναι ο «κλασσικός» αλγόριθµος πολλαπλασιασµού. Υπάρχουν και άλλοι τρό-
ποι, π.χ. ο πολλαπλασιασµός a la russe: Γράψτε τον πολλαπλασιαστέο και τον πολ-
λαπλασιαστή δίπλα – δίπλα. ∆ηµιουργήστε δύο στήλες (µία για κάθε αριθµό), επα-
ναλαµβάνοντας τον εξής κανόνα, έως ότου ο αριθµός κάτω από τον πολλαπλασια-
στέο γίνει 1: Γράψτε στη στήλη κάτω από τον πολλαπλασιαστέο το ακέραιο πηλίκο
του τελευταίου αριθµού δια 2 (αγνοώντας το υπόλοιπο), και γράψτε στη στήλη κάτω
από τον πολλαπλασιαστή το διπλάσιο του τελευταίου αριθµού (προσθέτοντάς τον
στον εαυτό του). Στο τέλος, όταν δηλαδή ο αριθµός κάτω από τον πολλαπλασιαστέο
γίνει 1, σβήστε κάθε γραµµή στην οποία ο αριθµός στη στήλη του πολλαπλασια-
στέου είναι ζυγός και έπειτα, προσθέστε τους αριθµούς που παραµένουν στη στήλη
του πολλαπλασιαστή. Ο Πίνακας 1.1 απεικονίζει τη διαδικασία πολλαπλασιασµού
a la russe για τον υπολογισµό του 19 ¥ 45 = 855.
¶›Ó·Î·˜ 1.1
Παράδειγµα πολλαπλασιασµού a la russe.
45 19
22 38 (σβήνω)
11 76
5 152
2 304 (σβήνω)
1 608
855
1 . 2 ∞ ¡ ∞ ¶ ∞ ƒ∞ ™ ∆∞ ™ ∏ ∞ § ° √ ƒ π £ ª ø ¡ 19
Αυτός ο αλγόριθµος είναι κατά βάση ό,τι χρησιµοποιείται σήµερα στο hardware πολ-
λών υπολογιστών. ∆εν χρειάζεται την «προπαίδεια», αλλά χρειάζεται µόνο πρόσθε-
ση και διαίρεση δια 2.
που σηµαίνει ότι η οµάδα εντολών <εντολή 1> έως <εντολή κ> εκτελούνται η µία
κατόπιν της άλλης. Πολλές φορές, για να αποφευχθεί η πληθώρα των 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
¢Ú·ÛÙËÚÈfiÙËÙ· 1.2
Έστω φ ένας πίνακας n φυσικών αριθµών και x ένας φυσικός αριθµός για τον οποίο
θέλουµε να διαπιστώσουµε αν υπάρχει στον πίνακα Α. Γράψτε ψευδοκώδικα για
τον αλγόριθµο γραµµικής αναζήτησης (linear search), που εντοπίζει τη θέση του x
στον πίνακα Α ελέγχοντας όλα τα στοιχεία του µε τη σειρά. Στην περίπτωση που
το x υπάρχει στον πίνακα Α, ο αλγόριθµος επιστρέφει τη θέση του x. ∆ιαφορετικά,
ο αλγόριθµος επιστρέφει 0.
είναι µία n – άδα αριθµών, η έξοδος είναι επίσης µία n – άδα αριθµών και, επιπλέ-
ον, η έξοδος πρέπει να είναι µία αναδιάταξη των αριθµών εισόδου σε αύξουσα σειρά.
Έχοντας ορίσει τη µορφή των δεδοµένων εισόδου, κάθε έγκυρο σύνολο δεδοµένων
εισόδου αποτελεί ένα στιγµιότυπο του προβλήµατος. Έτσι, κάθε ζεύγος φυσικών
αριθµών είναι ένα στιγµιότυπο του προβλήµατος του πολλαπλασιασµού και κάθε n
– άδα αριθµών είναι ένα στιγµιότυπο για το πρόβληµα της διάταξης n αριθµών.
Τα προβλήµατα που ενδιαφέρουν τη Θεωρία Αλγορίθµων έχουν άπειρο αριθµό στιγ-
µιότυπων. Ένας αλγόριθµος πρέπει να λειτουργεί σωστά, δηλαδή να δίνει σωστές
απαντήσεις, για όλα τα στιγµιότυπα του προβλήµατος το οποίο λύνει. Για να δείξει
κάποιος ότι ένας αλγόριθµος είναι λανθασµένος, αρκεί να βρει ένα στιγµιότυπο του
προβλήµατος για το οποίο ο αλγόριθµος δίνει λάθος αποτέλεσµα. Από την άλλη
πλευρά, συνήθως, είναι δυσκολότερο να δείξει κάποιος ότι ένας αλγόριθµος είναι
σωστός, αφού απαιτείται µαθηµατική απόδειξη ότι ο αλγόριθµος δίνει σωστό απο-
τέλεσµα για όλα τα στιγµιότυπα του προβλήµατος.
Έστω ότι για ένα πρόβληµα υπάρχουν περισσότεροι από ένας αλγόριθµοι που το
λύνουν. Ποιον θα επιλέξουµε; Ποιος είναι ο καλύτερος; Η εµπειρική απάντηση είναι
να τους προγραµµατίσουµε όλους σε κάποια γλώσσα προγραµµατισµού, να τους δοκι-
µάσουµε και να επιλέξουµε. Η θεωρητική απάντηση (την οποία αυτό το βιβλίο υπη-
ρετεί) έγκειται στο να προσδιορίσουµε µε µαθηµατικό τρόπο την ποσότητα των απα-
ραίτητων πόρων για την εκτέλεση του αλγορίθµου (π.χ. µνήµη, χρόνος εκτέλεσης,
αριθµός επεξεργαστών, κλπ.) ως συνάρτηση του µεγέθους του στιγµιότυπου εισόδου.
Το µέγεθος ενός στιγµιότυπου ενός προβλήµατος αντιστοιχεί τυπικά στον αριθµό
των δυαδικών ψηφίων (bits) που απαιτούνται για να αναπαρασταθεί το στιγµιότυπο
στη µνήµη του υπολογιστή. Στην πραγµατικότητα, για να διευκολυνθούµε στον
προσδιορισµό των πόρων που απαιτούνται για την εκτέλεση ενός αλγορίθµου, χρη-
σιµοποιούµε σαν µέγεθος ενός στιγµιότυπου µία ποσότητα που αποτελεί µέτρο των
συνιστωσών του.
Για παράδειγµα, στο πρόβληµα της διάταξης φυσικών αριθµών, συνήθως, θεωρού-
µε ότι η αναπαράσταση ενός φυσικού αριθµού έχει µοναδιαίο µέγεθος (π.χ. µια θέση
µνήµης). Έτσι, το µέγεθος ενός στιγµιότυπου που περιλαµβάνει n αριθµούς είναι n,
ακόµα και αν η αναπαράσταση ενός ακεραίου µπορεί να χρειάζεται περισσότερα του
ενός bit. Από την άλλη πλευρά, το µέγεθος των αριθµητικών προβληµάτων καθορί-
1 . 4 ∞ ¶ √ ∆ ∂ § ∂ ™ ª ∞∆ π ∫ √ ∆ ∏ ∆∞ ∞ § ° √ ƒ π £ ª ø ¡ 23
ζεται συνήθως µε βάση τον αριθµό των bits που απαιτούνται για την αναπαράστα-
ση των δεδοµένων εισόδου. Έτσι, το µέγεθος ενός στιγµιότυπου για το πρόβληµα
του πολλαπλασιασµού δύο αριθµών, των οποίων η αναπαράσταση απαιτεί n και m
bits αντίστοιχα, είναι n + m.
Το πλεονέκτηµα της θεωρητικής µεθόδου είναι ακριβώς αυτή η µη εµµονή σε λεπτο-
µέρειες που εξαρτώνται από τεχνικά χαρακτηριστικά. Αυτό που έχει σηµασία είναι
το µέγεθος που, όταν αυξηθεί, δυσκολεύει κατά πολύ το πρόβληµα. Για παράδειγ-
µα, είναι πολύ εύκολο να διατάξουµε 5 αριθµούς, αλλά δεν είναι καθόλου εύκολο
να κάνουµε το ίδιο για 1000 αριθµούς. Επίσης, φαίνεται εύκολο να πολλαπλασιά-
σουµε δύο µονοψήφιους αριθµούς, ενώ είναι πολύ δυσκολότερο να πολλαπλασιά-
σουµε δύο εκατονταψήφιους αριθµούς.
Έχοντας καταλήξει σε ένα µέτρο του µεγέθους των στιγµιότυπων ενός προβλήµα-
τος, ανακύπτει το ερώτηµα σε ποια µονάδα θα ανάγουµε το θέµα της µέτρησης της
αποτελεσµατικότητας ενός αλγορίθµου, π.χ. όσον αφορά στο χρόνο υπολογισµού
tA(n) για έναν αλγόριθµο Α που λύνει το πρόβληµα όταν το στιγµιότυπο του έχει
µέγεθος n.
Η αρχή του αναλλοίωτου (principle of invariance) είναι µια απάντηση. Η αρχή αυτή
λεει ότι δύο διαφορετικές υλοποιήσεις του ίδιου αλγορίθµου δεν θα διαφέρουν σε
αποτελεσµατικότητα παρά µόνο κατά µια σταθερή αναλογία, που εξαρτάται από την
τεχνολογία του λογισµικού και του υπολογιστή. Έτσι, για τη θεωρητική εκτίµηση
αλγορίθµων, καλό είναι να εκφράζουµε τη µέτρηση της αποτελεσµατικότητας αγνο-
ώντας πολλαπλασιαστικές σταθερές.
Ορισµός 1.1: Ένας αλγόριθµος απαιτεί χρόνο της τάξεως t(n) για να εκτελεσθεί,
όπου n είναι το µέγεθος του στιγµιότυπου του προβλήµατος προς
επίλυση, εάν υπάρχει θετική σταθερά c, και κάποια υλοποίηση του
αλγορίθµου, ικανή να λύσει κάθε στιγµιότυπο του προβλήµατος
µεγέθους n σε χρόνο όχι περισσότερο από c ◊ t(n) βήµατα.
Με χρήση της αρχής του αναλλοίωτου, κάθε άλλη υλοποίηση του ίδιου αλγορίθµου
θα έχει την ίδια ιδιότητα (µε πιθανή αλλαγή της σταθεράς c). Αυτή η σηµαντική
έννοια, γνωστή ως ασυµπτωτική εκτίµηση, καταδεικνύει την εξάρτηση της επιδόσε-
ως του αλγορίθµου από µεγάλα µεγέθη εισόδου.
Μερικές τάξεις µεγεθών είναι τόσο συνήθεις ώστε να έχουν συγκεκριµένο όνοµα.
Όταν το t(n) είναι n λέµε ότι ο αλγόριθµος είναι γραµµικός (linear) στο µέγεθος της
24 KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™
εισόδου. Όταν το t(n) είναι n2, n3, nκ (για κάποιο συγκεκριµένο κ), ή dn (για κάποιο
συγκεκριµένο d) τότε, αντίστοιχα, λέµε ότι ο αλγόριθµος είναι τετραγωνικός
(quadratic), κυβικός (cubic), πολυωνυµικός (polynomial), ή εκθετικός (exponential)
ως προς το χρόνο εκτέλεσης.
Η (κρυµµένη) πολλαπλασιαστική σταθερά στον ασυµπτωτικό ορισµό της τάξεως
µεγέθους είναι πηγή παρεξηγήσεων. Έστω αλγόριθµοι Α, Β για το ίδιο πρόβληµα,
µε χρόνους της τάξεως των n2 και n3 αντίστοιχα, και σταθερές (σε κάποια υλοποίη-
ση) 1000 και 1. Μόνο για εισόδους µε µέγεθος µεγαλύτερο του 1000 (n > 1000), ο
Α είναι καλύτερος του Β. Παρά ταύτα, ο Α είναι ασυµπτωτικά καλύτερος από τον Β.
¢Ú·ÛÙËÚÈfiÙËÙ· 1.3
Ποιά είναι η µικρότερη τιµή του n, ώστε ένας αλγόριθµος µε χρόνο εκτέλεσης
100n2 να ολοκληρώνεται γρηγορότερα από έναν αλγόριθµο µε χρόνο εκτέλεσης
2n, όταν αυτοί εκτελούνται στον ίδιο υπολογιστή;
Στον Ορισµό 1.1, η έννοια του χρόνου εκτέλεσης µπορεί να αντικατασταθεί από
οποιοδήποτε µέγεθος πόρου του υπολογιστικού περιβάλλοντος (π.χ. µνήµη, αριθµό
επεξεργαστών, µηνύµατα δικτύου, κλπ.) ως προς το οποίο υπολογίζουµε την ασυ-
µπτωτική συµπεριφορά του αλγορίθµου.
Η ανάλυση ενός αλγορίθµου είναι η εκτίµηση του πλήθους των πόρων που απαιτού-
νται για την εκτέλεση του αλγορίθµου. Για να αναλύσουµε έναν αλγόριθµο πρέπει να
θεωρήσουµε ένα µοντέλο υπολογιστή στον οποίο θα εκτελεστεί ο αλγόριθµος. Για το
σκοπό αυτού του βιβλίου, θεωρούµε ότι κάθε αλγόριθµος θα υλοποιηθεί σαν πρό-
γραµµα σε µία Υπολογιστική Μηχανή Άµεσης Προσπέλασης Μνήµης (Random
Access Machine, RAM) µε έναν επεξεργαστή. Σε αυτό το µοντέλο οι εντολές εκτε-
λούνται ακολουθιακά, ενώ η προσπέλαση κάθε θέσης µνήµης έχει µοναδιαίο κόστος.
Η πιο συνηθισµένη κατηγορία ανάλυσης ενός αλγορίθµου αφορά το χρόνο εκτέλε-
σης. Ο χρόνος εκτέλεσης ενός αλγορίθµου συνήθως υπολογίζεται σαν συνάρτηση
του αριθµού των στοιχειωδών βηµάτων που εκτελούνται. Το είδος των στοιχειωδών
βηµάτων τα οποία προσµετρώνται στο χρόνο εκτέλεσης του αλγορίθµου ποικίλουν
ανάλογα µε το πρόβληµα. Για παράδειγµα, στο πρόβληµα της διάταξης φυσικών
αριθµών, σαν στοιχειώδη βήµατα µπορούν να θεωρηθούν οι συγκρίσεις µεταξύ
1 . 4 ∞ ¶ √ ∆ ∂ § ∂ ™ ª ∞∆ π ∫ √ ∆ ∏ ∆∞ ∞ § ° √ ƒ π £ ª ø ¡ 25
τουλάχιστον µία φορά, είναι tj ≥ 1. Επειδή το while – loop τερµατίζει όταν i £ 0 και,
αρχικά, το i έχει τιµή j –1, το tj είναι πάντα µικρότερο ή ίσο του j.
¢Ú·ÛÙËÚÈfiÙËÙ· 1.4
Ο µικρότερος χρόνος εκτέλεσης για τον αλγόριθµο insertion sort επιτυγχάνεται όταν
οι αριθµοί του πίνακα εισόδου είναι ήδη διατεταγµένοι σε αύξουσα σειρά. Τότε, για
n
εκτέλεσης του αλγορίθµου insertion sort είναι γραµµικός στο µέγεθος της εισόδου.
Θεωρείστε έναν αλγόριθµο που διατάσσει έναν πίνακα n φυσικών αριθµών Α βρί-
σκοντας (για κάθε i = 1, …, n) το µικρότερο στοιχείο του υποπίνακα A[i,…,n], και
τοποθετώντας το στη θέση A[i]. Αυτή η µέθοδος είναι γνωστή σαν διάταξη µε επι-
λογή (selection sort). Περιγράψτε αυτόν τον αλγόριθµο σε ψευδοκώδικα. Ποια είναι
τα στιγµιότυπα καλύτερης και χειρότερης περίπτωσης για αυτόν τον αλγόριθµο;
∆ώστε µια ασυµπτωτική εκτίµηση του χρόνου εκτέλεσης του αλγορίθµου για την
καλύτερη και τη χειρότερη περίπτωση.
µιότυπα (για κάθε δεδοµένο µέγεθος εισόδου) στα οποία ο αλγόριθµος καταναλίσκει
τον περισσότερο χρόνο. Αυτή είναι η εκτίµηση της απόδοσης ενός αλγορίθµου για την
χειρότερη περίπτωση (worst case analysis). Η ανάλυση χειρότερης περίπτωσης δίνει
ένα εγγυηµένο άνω φράγµα (ασυµπτωτικά) για την απόδοση του αλγορίθµου.
Είναι προφανής η αξία της ανάλυσης χειρότερης περίπτωσης (ο,τιδήποτε και να συµ-
βεί σε µια ορθή εκτέλεση του αλγορίθµου, ο χρόνος απόκρισης θα είναι το πολύ τόσο
άσχηµος). Ωστόσο, οι αλγόριθµοι πολλές φορές χρησιµοποιούνται κατ’ επανάληψη,
και για πολλές διαφορετικές εισόδους. Υπάρχουν n! τρόποι να διατάξουµε αρχικά
τον πίνακα εισόδου για τον αλγόριθµο insertion sort. Εάν γνωρίζαµε και την πιθα-
νότητα του κάθε τρόπου, καθώς και τον χρόνο εκτέλεσης σε κάθε αρχική διάταξη
(που θα ποικίλει ανάµεσα σε n και n2), τότε θα είµαστε σε θέση να υπολογίσουµε τη
µέση τιµή του χρόνου διάταξης ενός πίνακα µε τον αλγόριθµο insertion sort, ως προς
τη δεδοµένη κατανοµή της εισόδου.
∆υστυχώς, η εκ των προτέρων γνώση της κατανοµής των εισόδων είναι συνήθως µη
ρεαλιστική υπόθεση. Στο βιβλίο αυτό, θα µας αφορά κυρίως η ανάλυση χειρότερης
περίπτωσης, εκτός αν ρητά διατυπωθεί το ζήτηµα κατά άλλον τρόπο.
¢Ú·ÛÙËÚÈfiÙËÙ· 1.5
Θεωρήστε ότι µια υλοποίηση του αλγορίθµου insertion sort χρειάζεται να εκτελέ-
σει 2n2 εντολές για να διατάξει έναν πίνακα n στοιχείων, και ότι µία υλοποίηση
ενός άλλου αλγορίθµου διάταξης Β χρειάζεται να εκτελέσει 50n log n εντολές για
την ίδια εργασία. Αν ο insertion sort τρέχει σε έναν υπολογιστή µε δυνατότητα εκτέ-
λεσης 108 εντολών το δευτερόλεπτο και ο Β σε έναν υπολογιστή µε δυνατότητα
εκτέλεσης 106 εντολών το δευτερόλεπτο, πόσο χρόνο χρειάζονται για να διατάξουν
103, 104, 105, 106 και 107 στοιχεία, αντίστοιχα.
™‡ÓÔ„Ë
Σε αυτό το κεφάλαιο ορίστηκε η έννοια του αλγορίθµου σαν µεθοδολογία επίλυσης
προβληµάτων, παρουσιάστηκε η µορφή του ψευδοκώδικα που θα χρησιµοποιηθεί για
την περιγραφή των αλγορίθµων, περιγράφηκαν µερικοί στοιχειώδεις αλγόριθµοι (π.χ.
πολλαπλασιασµός a la russe, insertion sort, linear search), τεκµηριώθηκε η ανα-
γκαιότητα για ποσοτικό προσδιορισµό των πόρων που απαιτεί η εκτέλεση ενός αλγο-
ρίθµου, παρουσιάστηκε η έννοια της ασυµπτωτικής ανάλυσης των αλγορίθµων, ορί-
στηκε η ανάλυση µέσης και χειρότερης περίπτωσης, και προσδιορίστηκε ο χρόνος
εκτέλεσης µερικών στοιχειωδών αλγορίθµων.
30 KEºA§AIO 1: Eπ™∞°ø°π∫∂™ ∂¡¡√π∂™
µÈ‚ÏÈÔÁÚ·Ê›·
™ÎÔfi˜
∫ ∂
2
º
Σκοπός αυτού του κεφαλαίου είναι ο ορισµός του συµβολισµού που χρησιµοποιείται
για την ασυµπτωτική εκτίµηση, και η παρουσίαση µερικών µεθόδων για τον υπολο-
γισµό αθροισµάτων και την επίλυση αναδροµικών εξισώσεων, τα οποία είναι µαθη-
µατικά προβλήµατα που συχνά ανακύπτουν κατά την ανάλυση των αλγορίθµων.
∞ § ∞ π √
¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·
Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση:
• Να ορίσει και να χρησιµοποιήσει τον ασυµπτωτικό συµβολισµό.
• Να συγκρίνει την τάξη µεγέθους δύο συναρτήσεων µε χρήση του ασυµπτωτικού
συµβολισµού.
• Να προσδιορίσει την τάξη µεγέθους αθροισµάτων ενδιάµεσου βαθµού δυσκολίας.
• Να υπολογίσει ακριβείς ασυµπτωτικές εκτιµήσεις για τη λύση απλών αναδροµικών
εξισώσεων.
ŒÓÓÔȘ ÎÏÂȉȿ
• ασυµπτωτικός συµβολισµός (Θ, Ο, Ω, • αναδροµική εξίσωση
ο, ω – συµβολισµοί)
• µέθοδοι επίλυσης αναδροµικών εξι-
• µέθοδοι υπολογισµού αθροισµάτων
σώσεων (επανάληψη, δέντρο της
(µαθηµατική επαγωγή, υπολογισµός
φραγµάτων) αναδροµής, αντικατάσταση, Θεώρη-
• αναδροµικός αλγόριθµος µα της Κυριαρχίας)
∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Η ανάλυση των αλγορίθµων διευκολύνεται και, συχνά, βασίζεται στη χρήση µαθη-
µατικών εργαλείων. Μερικά από αυτά τα εργαλεία είναι απλά και γνωστά, όπως για
παράδειγµα, ο υπολογισµός του κλειστού τύπου απλών αθροισµάτων, ενώ άλλα µπο-
ρεί να µοιάζουν καινούργια και δυσκολότερα, όπως για παράδειγµα, ο ασυµπτωτι-
κός συµβολισµός και η επίλυση αναδροµικών εξισώσεων.
Η κατανόηση και η εξοικείωση µε το συµβολισµό και τις µαθηµατικές τεχνικές που
34 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
Στο προηγούµενο κεφάλαιο είδαµε ότι η ασυµπτωτική εκτίµηση του χρόνου εκτέ-
λεσης ενός αλγορίθµου επιτρέπει τη σύγκριση διαφορετικών αλγορίθµων µε κριτή-
ριο την αποτελεσµατικότητά τους, και παρέχει µια απλή κατηγοριοποίηση των αλγο-
ρίθµων. Η ασυµπτωτική εκτίµηση αγνοεί τις σταθερές και εξετάζει µόνο την τάξη
µεγέθους της συνάρτησης που προσδιορίζει το χρόνο εκτέλεσης ενός αλγορίθµου.
Αυτό γιατί, όπως είδαµε και σε σχετικά παραδείγµατα, όταν το µέγεθος της εισόδου
n γίνει αρκετά µεγάλο, τότε οι τιµές µιας συνάρτησης µεγαλύτερης τάξης µεγέθους,
π.χ. n2, είναι σηµαντικά µεγαλύτερες από τις τιµές µιας συνάρτησης µικρότερης
τάξης µεγέθους, π.χ. n log n. Εποµένως, ένας ασυµπτωτικά αποδοτικότερος αλγό-
ριθµος είναι και στην πράξη αποδοτικότερος, για την µεγάλη πλειοψηφία των στιγ-
µιότυπων εισόδου.
Στη συνέχεια, θα περιγράψουµε διάφορους καθιερωµένους τύπους ασυµπτωτικού
συµβολισµού, οι οποίοι χρησιµοποιούνται πολύ συχνά στην ασυµπτωτική εκτίµηση
του χρόνου εκτέλεσης των αλγορίθµων. Ο ασυµπτωτικός συµβολισµός, που χρησι-
µοποιείται για την περιγραφή του χρόνου εκτέλεσης των αλγορίθµων, ορίζεται σε
συναρτήσεις, οι οποίες έχουν πεδίο ορισµού το σύνολο των φυσικών αριθµών IN =
{0, 1, 2, …}. Τέτοιου είδους συµβολισµός είναι κατάλληλος για την περιγραφή µιας
συνάρτησης T(n), η οποία δίνει το χρόνο εκτέλεσης ενός αλγορίθµου, και ορίζεται
µόνο για ακέραια µεγέθη εισόδου. Από την άλλη πλευρά, είναι συχνά βολικό να γίνε-
ται κατάχρηση του συµβολισµού µε διάφορους τρόπους. Το πλέον συνηθισµένο
παράδειγµα είναι η χρήση του ίδιου συµβολισµού για συναρτήσεις µε πεδίο ορισµού
τους πραγµατικούς αριθµούς, ή κάποιο υποσύνολο του N. Παρόλα αυτά, σηµαντι-
κή είναι η κατανόηση της ουσίας του ασυµπτωτικού συµβολισµού, ώστε η κατά-
χρησή του να µην κινδυνεύει να µετατραπεί σε λάθος χρήση.
2.1.1 √ Û˘Ì‚ÔÏÈÛÌfi˜ £
σεων Θ(g(n)), αν υπάρχουν θετικές σταθερές c1, c2 τέτοιες ώστε η f(n) να περιορί-
ζεται µεταξύ c1g(n) και c2g(n) για αρκετά µεγάλες τιµές του n. Αυτό αναπαρίσταται
γραφικά στο Σχήµα 2.1.(α). Για όλες τις τιµές του n που είναι µεγαλύτερες του n0,
οι τιµές της f(n) βρίσκονται πάνω από το c1g(n) και κάτω από το c2g(n). ∆ιαφορετι-
κά, για κάθε n ≥ n0, η g(n) προσεγγίζει την f(n) κατά ένα σταθερό παράγοντα. Για
αυτό λέµε ότι η g(n) αποτελεί µια ασυµπτωτικά ακριβή εκτίµηση (asymptotically tight
bound) για την f(n).
c2g(n)
c g(n)
f(n) f(n)
c1g(n) f(n)
c g(n)
n0 n n0 n n0 n
(
c1 = α/4, c2 = 7α/4, και n0 = 2◊max | b | /a , | g | /a . )
2.1 ∞™Àª¶∆ø∆π∫√™ ™Àªµ√§π™ª√™ 37
Â
d
a i ni , όπου τα αi είναι σταθερές και αd > 0, είναι p(n) = Θ(nd).
i =0
Επίσης, αφού κάθε σταθερά είναι ένα πολυώνυµο µηδενικού βαθµού, κάθε σταθε-
ρά µπορεί να εκφραστεί σαν Θ(n0), ή απλούστερα σαν Θ(1). Βέβαια, ο συµβολισµός
Θ(1) είναι καταχρηστικός γιατί δεν ξεκαθαρίζει τη µεταβλητή n. Στη συνέχεια, θα
χρησιµοποιούµε συχνά το συµβολισµό Θ(1) για να δηλώσουµε είτε µία σταθερά,
είτε µια συνάρτηση η οποία έχει σταθερή τιµή.
2.1.2 √ Û˘Ì‚ÔÏÈÛÌfi˜ √
Είδαµε ότι ο συµβολισµός Θ παρέχει µία ακριβή εκτίµηση της τάξης µεγέθους µιας
συνάρτησης. Στην περίπτωση που χρειαζόµαστε µόνο ένα ασυµπωτικό άνω φράγµα
στην τάξη µεγέθους µιας συνάρτησης, χρησιµοποιούµε το συµβολισµό Ο. ∆εδοµέ-
νης µιας συνάρτησης g(n), συµβολίζουµε µε Ο(g(n)) το σύνολο των συναρτήσεων
Ο(g(n)) = {f(n): υπάρχουν θετικές σταθερές c και n0 τέτοιες, ώστε:
0 £ f(n) £ cg(n) για κάθε n ≥ n0} .
Η συνάρτηση g(n) πολλαπλασιασµένη µε ένα σταθερό παράγοντα αποτελεί ένα ασυ-
µπτωτικό άνω φράγµα για τη συνάρτηση f(n). Το Σχήµα 2.1.(β) δίνει τη διαίσθηση
πίσω από το συµβολισµό Ο. Για όλα τα n ≥ n0, η συνάρτηση f(n) βρίσκεται κάτω από
38 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
τη c g(n). Όπως και στην περίπτωση του συµβολισµού Θ, αν και το Ο(g(n)) ορίζει
κλάση συναρτήσεων, γράφουµε f(n) = O(g(n)) για να δηλώσουµε ότι η f(n) είναι
µέλος του συνόλου O(g(n)).
Συγκρίνοντας τους ορισµούς των συµβολισµών Θ και Ο, καταλήγουµε στο συµπέ-
ρασµα ότι κάθε συνάρτηση f(n) που ανήκει στο Θ(g(n)), ανήκει και στο O(g(n)).
∆ηλαδή, Θ(g(n)) Õ O(g(n)). Εποµένως, το γεγονός ότι κάθε τετραγωνική συνάρτη-
ση f(n) = Α n2 + β n + γ, Α > 0, ανήκει στο Θ(n2), σηµαίνει, επίσης, ότι f(n) = O(n2).
Επιπλέον, αν θεωρήσουµε µια οποιαδήποτε γραµµική συνάρτηση f(n) = Α n + β, Α
> 0, θέτοντας τις σταθερές c = Α + |β|, και n0 = 1, έχουµε ότι, για κάθε n ≥ n0, f(n) £
c n2. Εποµένως, κάθε γραµµική συνάρτηση, επίσης, ανήκει στο O(n2).
Ο συµβολισµός Ο, πολλές φορές, χρησιµοποιείται για τη διατύπωση κατά προσέγ-
γιση εκτιµήσεων σχετικά µε το χρόνο εκτέλεσης ενός αλγορίθµου. Για παράδειγµα,
έστω ένας αλγόριθµος ο οποίος περιέχει το ακόλουθο διπλό φωλιασµένο βρόγχο:
for i ¨ 1 to n do
for j ¨ i to n do
<ÂÓÙÔÏ‹>
Αν το κόστος εκτέλεσης της <εντολής> είναι Ο(1), δηλαδή σταθερό, τότε το συνο-
λικό κόστος για την εκτέλεση του βρόγχου είναι Ο(n2), γιατί οι δείκτες i και j παίρ-
νουν τιµές από 1 µέχρι n, και για κάθε τιµή του i, η <εντολή> εκτελείται το πολύ n
φορές (για την ακρίβεια εκτελείται n – i + 1 φορές).
Παρατηρείστε ότι, αφού ο συµβολισµός Ο παρέχει ένα άνω φράγµα, όταν τον χρη-
σιµοποιούµε για να φράξουµε το χρόνο εκτέλεσης χειρότερης περίπτωσης ενός αλγο-
ρίθµου, έχουµε, επίσης, και ένα άνω φράγµα στο χρόνο εκτέλεσης για κάθε δεδοµέ-
νη είσοδο. Για παράδειγµα, το γεγονός ότι ο χρόνος εκτέλεσης χειρότερης περίπτω-
σης της insertion sort είναι O(n2) σηµαίνει ότι ο χρόνος εκτέλεσης της insertion sort
(για κάθε είσοδο) είναι O(n2). Κάτι αντίστοιχο δεν ισχύει για το συµβολισµό Θ. Αν
και ο χρόνος εκτέλεσης χειρότερης περίπτωσης της insertion sort είναι Θ(n2), είδα-
µε ότι υπάρχουν στιγµιότυπα εισόδου για τα οποία ο χρόνος εκτέλεσης της insertion
sort είναι γραµµικός, εποµένως, όχι Θ(n2).
Αν και τεχνικά είναι κατάχρηση, θα χρησιµοποιούµε συχνά την έκφραση «ο χρόνος
εκτέλεσης ενός αλγορίθµου είναι Ο(n2)». Η κατάχρηση έγκειται στο γεγονός ότι, αφού
ο χρόνος εκτέλεσης ενός αλγορίθµου εξαρτάται από τη συγκεκριµένη είσοδο, δεν
µπορεί να εκφραστεί σαν συνάρτηση του n. Η παραπάνω φράση όµως σηµαίνει ότι
ο χρόνος εκτέλεσης στη χειρότερη περίπτωση (ο οποίος φράσσει άνω το χρόνο εκτέ-
λεσης για κάθε στιγµιότυπο εισόδου, και είναι συνάρτηση του n) ανήκει στο O(n2).
2.1 ∞™Àª¶∆ø∆π∫√™ ™Àªµ√§π™ª√™ 39
2.1.3 √ Û˘Ì‚ÔÏÈÛÌfi˜ ø
Όπως ο συµβολισµός Ο παρέχει ένα ασυµπτωτικό άνω φράγµα, έτσι και ο συµβολι-
σµός Ω παρέχει ένα ασυµπτωτικό κάτω φράγµα στην τάξη µεγέθους µιας συνάρτη-
σης. ∆εδοµένης µιας συνάρτησης g(n), συµβολίζουµε µε Ω(g(n)) το σύνολο των
συναρτήσεων
Ω(g(n)) = {f(n): υπάρχουν θετικές σταθερές c και n0 τέτοιες, ώστε:
0 £ cg(n) £ f(n) για κάθε n ≥ n0} .
Το Σχήµα 2.1.(γ) αναπαριστά τη διαίσθηση του συµβολισµού Ω. Χρησιµοποιώντας
τους ορισµούς των ασυµπτωτικών συµβολισµών Θ, Ο και Ω, µπορούµε να αποδεί-
ξουµε το ακόλουθο θεώρηµα.
Θεώρηµα 2.1: Για κάθε ζευγάρι συναρτήσεων f(n) και g(n), f(n) = Θ(g(n)) αν και
µόνο αν f(n) = O(g(n)) και f(n) = Ω(g(n)).
¢Ú·ÛÙËÚÈfiÙËÙ· 2.1
Στο προηγούµενο κεφάλαιο είχαµε αναλύσει τους αλγορίθµους 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
2.1.4 √ Û˘Ì‚ÔÏÈÛÌfi˜ Ô
2.1.5 √ Û˘Ì‚ÔÏÈÛÌfi˜ ˆ
¢Ú·ÛÙËÚÈ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)
Όταν ένας ασυµπτωτικός συµβολισµός αποτελεί το δεξιό µέλος µιας ισότητας, π.χ.,
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).
(Α). Βάλτε τις συναρτήσεις που ακολουθούν σε αύξουσα σειρά τάξης µεγέθους:
(Β). Στον πίνακα που ακολουθεί, για κάθε ζευγάρι συναρτήσεων (f, g), σηµειώστε
αν η συνάρτηση f είναι Ο, ο, Ω, ω, ή Θ της g. Θεωρείστε ότι k ≥ 3 και ε > 0
είναι σταθερές οι οποίες δίνονται.
f(n) g(n) Ο ο Ω ω Θ
(α) 2n + k 2n + 2k – nk
3
(β) (log n ) 3 log(nlog( n ) )
(γ) kn (3k)n/3
(δ) (kn)1– ε n1– ε
(ε) n3– 10n 8log n
2.2 ∞ıÚÔ›ÛÌ·Ù·
Για παράδειγµα, ο αλγόριθµος insertion sort αποτελείται από ένα for βρόγχο, ο οποί-
ος εκτελείται n – 1 φορές στη χειρότερη περίπτωση, και η j–οστή επανάληψη του βρόγ-
χου διαρκεί χρόνο ανάλογο του j. Εποµένως, ο χρόνος εκτέλεσης χειρότερης περί-
44 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
Â
n
πτωσης του αλγορίθµου insertion sort είναι ανάλογος του αθροίσµατος j.
j =2
Â
n -1
του αθροίσµατος (n - i + 1) .
i =1
Στη συνέχεια αυτής της ενότητας θα ανακεφαλαιώσουµε δύο γενικές τεχνικές για
τον υπολογισµό και την εκτίµηση απλών αθροισµάτων. Συγκεκριµένα, θα αναφερ-
θούµε στη χρήση µαθηµατικής επαγωγής για τον υπολογισµό γνωστών αθροισµά-
των, και στον υπολογισµό φραγµάτων, ενώ πολλές φορές θα χρειαστεί να συνδυά-
σουµε αυτές τις τεχνικές για να έχουµε το επιθυµητό αποτέλεσµα.
Â
n -1
µα, έστω το άθροισµα (n - i + 1) , το οποίο ανέκυψε κατά την ανάλυση του
i =1
n -1 Ê n ˆ
Â
i =1
(n - i + 1) = n + (n - 1) + (n - 2 ) + L + 3 + 2 = Á
Ë
 i˜¯ - 1 .
i =1
¢Ú·ÛÙËÚÈfiÙËÙ· 2.3
 Â
n n
(n - i + 1) = i .
i =1 i =1
Στην ανάλυση της selection sort χρησιµοποιήσαµε απ’ ευθείας το γεγονός ότι
n
n(n + 1)
Âi =
i =1
2
, το οποίο είναι γνωστό από τα Μαθηµατικά της ∆ευτεροβάθµιας
n +1 n
 i = (n + 1) +  i
i =1 i =1
Â
n
Ας υποθέσουµε ότι θέλουµε να υπολογίσουµε το άθροισµα Q(n) = i 2 . Προ-
i =1
φανώς, το Q(n) = Ω(n2). Επιπλέον, αν θεωρήσουµε µόνο τους όρους
για i ≥ n/2, µπορούµε να υπολογίσουµε το ακόλουθο κάτω φράγµα για το Q(n):
n n
Âi ≥ Ân
i = n/2
2
i = n/2
2
/ 4 = n 3 / 8 = W (n 3 )
.
 Â
n n
Επίσης, ισχύει ότι i2 £ n2 = n 3 . Εποµένως, Q(n) = Θ(n3).
i =1 i =1
Έχοντας αυτό σαν δεδοµένο, είναι εύλογο να υποθέσουµε ότι ο κλειστός τύπος του
Q(n) θα είναι ένα πολυώνυµο τρίτου βαθµού, δηλαδή Q(n) = An3 + Bn2 + Cn + D.
Για να προσδιορίσουµε τους συντελεστές, υπολογίζουµε το άθροισµα για µικρές
τιµές του n.
n = 1: A + B + C + D = 1
n = 2: 8A + 4B + 2C + D = 5
n = 3: 27A + 9B + 3C + D = 14
n = 4: 64A + 16B + 4C + D = 30
Αυτό το γραµµικό σύστηµα τεσσάρων εξισώσεων µε τέσσερις αγνώστους έχει µονα-
46 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
δικές λύσεις τις Α = 1/3, Β = 1/2, C = 1/6, και D = 0. Συνεπώς, ένας υποψήφιος κλει-
στός τύπος για το άθροισµα Q(n) είναι:
n
2n 3 + 3n2 + n n(n + 1)( 2n + 1)
Â
n 3 n2 n
i2 = + + +0= = .
i = n/2
3 2 6 6 6
Έχοντας έναν υποψήφιο κλειστό τύπο για το άθροισµα Q(n), µπορούµε να χρησιµο-
ποιήσουµε µαθηµατική επαγωγή για να αποδείξουµε την ορθότητα του ισχυρισµού µας.
¢Ú·ÛÙËÚÈfiÙËÙ· 2.4
n(n + 1)( 2n + 1)
Â
n
i2 = .
i =1 6
¢Ú·ÛÙËÚÈfiÙËÙ· 2.5
Â
n
∆είξτε ότι 1 i 2 = O (1) .
i =1
Â
n
Υπολογίστε τον κλειστό τύπο του αθροίσµατος C (n ) = i3 .
i =1
Â
n
Αποδείξτε ότι 3i £ c ¥ 3 n , για κάποια σταθερά c ≥ 1. Ποιά είναι η ελάχιστη
i =0
τιµή του c για την οποία ισχύει η ανισότητα; Αποδείξτε την αντίστοιχη ανισότητα,
όταν αντί του 3 έχετε µια οποιαδήποτε σταθερά a > 1 .
conquer) για την επίλυση ενός προβλήµατος. Για την επίλυση ενός προβλήµατος,
ένας αναδροµικός αλγόριθµος διαιρεί το πρόβληµα σε µικρότερα, επιµέρους προ-
βλήµατα, και εφαρµόζει τον εαυτό του για τη επίλυση αυτών των προβληµάτων.
Τέλος, συνδυάζει τις λύσεις των επιµέρους προβληµάτων για να δηµιουργήσει µια
λύση του αρχικού προβλήµατος.
Προφανώς, ο χρόνος εκτέλεσης ενός τέτοιου αλγορίθµου είναι ίσος µε το άθροισµα
των χρόνων για την επίλυση των επιµέρους προβληµάτων και του χρόνου για να συν-
δυαστούν οι επιµέρους λύσεις σε µία λύση για το αρχικό πρόβληµα. Σε αυτή την ενό-
τητα θα παρουσιάσουµε τρεις βασικές τεχνικές για την επίλυση τέτοιας µορφής ανα-
δροµικών εξισώσεων, οι οποίες ανακύπτουν κατά την ανάλυση των αναδροµικών
αλγορίθµων. Συγκεκριµένα, θα δούµε τη µέθοδο της επανάληψης (iteration method),
τη µέθοδο της αντικατάστασης (substitution method) και το Θεώρηµα της Κυριαρ-
χίας (Master Theorem).
Πριν ξεκινήσουµε την παρουσίαση των τεχνικών για την επίλυση αναδροµικών εξι-
σώσεων, θα περιγράψουµε και θα αναλύσουµε τον αλγόριθµο merge sort, που είναι
ένας αναδροµικός αλγόριθµος για τη διάταξη n αριθµών. Για να διατάξει έναν πίνα-
κα n αριθµών, ο αλγόριθµος merge sort διαιρεί τον αρχικό πίνακα σε δύο υποπίνα-
κες n/2 στοιχείων. Ο merge sort διατάσσει τους δύο υποπίνακες καλώντας αναδρο-
µικά τον εαυτό του και συνενώνει τους δύο (διατεταγµένους) υποπίνακες σε έναν
πίνακα του οποίου τα στοιχεία είναι διατεταγµένα σε αύξουσα σειρά.
merge_sort(A, p, r)
{¢È·Ù¿ÛÛÂÈ ÙÔÓ ˘Ô›Ó·Î· A[p, ..., r]}
if p < r then
{ ∞Ó Ô ›Ó·Î·˜ ¤¯ÂÈ ÌfiÓÔ ¤Ó· ÛÙÔȯ›Ô,
ÌÔÚ› Ó· ıˆÚËı› ‰È·ÙÂÙ·Á̤ÓÔ˜ }
q ¨ (p + r)/2;
{ ¢È·›ÚÂÛË ÙÔ˘ ÚÔ‚Ï‹Ì·ÙÔ˜ Û ‰‡Ô
ÈÛÔÌÂÁ¤ıË ˘ÔÚÔ‚Ï‹Ì·Ù· }
merge_sort(A, p, q);
merge_sort(A, q + 1, r);
{ ™˘Ó¤ÓˆÛË ÙˆÓ ‰‡Ô ‰È·ÙÂÙ·ÁÌ¤ÓˆÓ ˘ÔÈÓ¿ÎˆÓ }
merge(A, p, q, r);
Στον ψευδοκώδικα της merge sort, χρησιµοποιούµε τη διαδικασία merge(A, p, q, r),
48 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
όπου A είναι ένας πίνακας, και p £ q £ r είναι οι δείκτες σε θέσεις του πίνακα Α που
ορίζουν τους υποπίνακες που θα συνενωθούν. Η διαδικασία merge πραγµατοποιεί
τη συνένωση των διατεταγµένων υποπινάκων A[p, …,q] και A[q + 1, …, r] σε έναν
διατεταγµένο υποπίνακα A[p, …, r].
¢Ú·ÛÙËÚÈfiÙËÙ· 2.6
Στη συνέχεια, βλέπουµε ένα απλό παράδειγµα της λειτουργίας της διαδικασίας
merge_sort. Ο πίνακας εισόδου είναι A = [5, 2, 4, 6, 1, 3, 7, 6]. Οι αναδροµικές κλή-
σεις της διαδικασίας merge_sort διαιρούν τον πίνακα Α. Η ανάπτυξη της αναδροµής
σταµατά όταν κάθε υποπίνακας περιέχει µόνο ένα στοιχείο. Από αυτό το σηµείο, µε
διαδοχικές συνενώσεις, καταλήγουµε στον διατεταγµένο πίνακα Α = [1, 2, 3, 4, 5, 6,
7, 8]. Αριστερά, στο Σχήµα 2.2, φαίνονται οι πίνακες µε τους οποίους γίνονται οι ανα-
δροµικές κλήσεις της merge_sort, ενώ δεξιά οι διατεταγµένοι πίνακες που προκύ-
πτουν, κατά την επιστροφή της αναδροµής, από την εφαρµογή της διαδικασίας merge.
[5, 2, 4, 8, 1, 3, 7, 6] [1, 2, 3, 4, 5, 6, 7, 8]
ÏQ (1) αν n = 1,
T (n ) = Ì
Ó2T (n / 2 ) + Q (n ) αν n > 1.
Έχοντας καταλήξει στην αναδροµική εξίσωση που περιγράφει το χρόνο εκτέλεσης,
έχουµε ολοκληρώσει τη σηµαντικότερη φάση του σχεδιασµού και της ανάλυσης του
αλγορίθµου. Αποµένει το µαθηµατικό µέρος της επίλυσης της αναδροµικής εξίσωσης.
¢Ú·ÛÙËÚÈfiÙËÙ· 2.7
Αξίζει να σηµειωθεί ότι συχνά κατά τη διατύπωση και την επίλυση αναδροµικών
εξισώσεων θα αγνοούµε συγκεκριµένες τεχνικές λεπτοµέρειες, δίνοντας έµφαση
στην ουσία. Για παράδειγµα, παρατηρείστε ότι στις ∆ραστηριότητες 2.6 και 2.7 έχου-
µε αγνοήσει το γεγονός ότι η συνάρτηση του χρόνου εκτέλεσης T(n) ορίζεται µόνο
για ακέραια n και χρησιµοποιούµε στη διατύπωση των αναδροµικών εξισώσεων το
T(n/2), αν και το n/2 µπορεί να µην είναι ακέραιος. Τυπικά, η εξίσωση που περι-
γράφει το χρόνο εκτέλεσης χειρότερης περίπτωσης για τη merge sort είναι:
ÏÔQ (1) αν n = 1,
T (n ) = Ì
ÔÓT ( În / 2û ) + T ( Èn / 2ù ) + Q (n ) αν n > 1.
50 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
Μία άλλη τεχνική λεπτοµέρεια που συχνά θα αγνοούµε είναι οι αρχικές συνθήκες
της αναδροµικής εξίσωσης. Ο λόγος είναι ότι, για τις περισσότερες περιπτώσεις, οι
αλγόριθµοι που θα αναλύσουµε έχουν T(n) = Θ(1), για µικρές τιµές του n, και ο
προσδιορισµός συγκεκριµένης σταθεράς για τις αρχικές συνθήκες δεν επηρεάζει την
ασυµπτωτική συµπεριφορά του T(n).
Η βασική ιδέα της µεθόδου της επανάληψης (iteration method) είναι να εκφράσου-
µε την αναδροµική εξίσωση σαν άθροισµα, αναπτύσσοντάς την και, στη συνέχεια,
να υπολογίσουµε τον κλειστό τύπο του αθροίσµατος. Για παράδειγµα, ας θεωρή-
σουµε την παρακάτω αναδροµική εξίσωση, η οποία έχει τη µορφή της εξίσωσης που
περιγράφει το χρόνο εκτέλεσης της merge sort.
Ï2 αν n = 2,
T (n ) = Ì
Ó2T (n / 2 ) + n αν n = 2 k , k > 1.
Η υπόθεση ότι το n πρέπει να είναι δύναµη 2 γίνεται για να αποφύγουµε την περίπτωση
που το n/2 δεν είναι ακέραιος. Αναπτύσσοντας την αναδροµική εξίσωση έχουµε:
T (n ) = n + 2T (n / 2 )
2n
=n+ + 22 T ( n / 4 )
2
2n 22 n
=n+ + + 2 4 T (n / 8 )
2 4
M
2n 22 n 2i -1 n
=n+ + + L + i -1 + 2i T (n / 2i )
2 4 2
= ni + 2 T (n / 2 )
i i
Μία απλή και χρήσιµη µέθοδος για την αναπαράσταση της ανάπτυξης µιας ανα-
δροµικής εξίσωσης είναι το δέντρο της αναδροµής (recursion tree). Το δέντρο της
αναδροµής επιτρέπει την καλύτερη οργάνωση των αλγεβρικών υπολογισµών κατά
την ανάπτυξη της αναδροµικής εξίσωσης. Έστω η αναδροµική εξίσωση T(n) =
2T(n/2) + n2. Το δέντρο της αναδροµής για αυτή την εξίσωση φαίνεται στο Σχήµα
2.3. Παρατηρούµε ότι η συνεισφορά κάθε γραµµής του δέντρου σε ύψος i (η ρίζα
θεωρείται ότι βρίσκεται σε ύψος 0) είναι n2/ 2i. Αφού σε κάθε επίπεδο το n υποδι-
πλασιάζεται, το ύψος του δέντρου είναι log n (δηλαδή το δέντρο έχει log n + 1 επί-
Â
log n 1
πεδα). Επειδή < 2 σαν άθροισµα όρων γεωµετρικής προόδου µε λόγο 1/2,
i =0 2i
είναι T(n) = Θ(n2).
n2 n2
...
¢Ú·ÛÙËÚÈfiÙËÙ· 2.8
Με χρήση του δέντρου της αναδροµής, δώστε µια ακριβή ασυµπτωτική εκτίµηση
της λύσης της αναδροµικής εξίσωσης
T (n ) = 4T ( În / 2û ) + n
52 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
Ï1 αν n = 1,
T (n ) = Ì
ÓT (n / 2 ) + 1 αν n = 2 k , k ≥ 1 .
Η βασική ιδέα της µεθόδου της αντικατάστασης (substitution method) είναι να µαντέ-
ψουµε τη µορφή της λύσης και να χρησιµοποιήσουµε µαθηµατική επαγωγή για να
υπολογίσουµε µε ακρίβεια τις σταθερές, όταν αυτό απαιτείται, και να αποδείξουµε
ότι η λύση είναι σωστή. Η µέθοδος είναι ισχυρή και απλή, αλλά µπορεί να εφαρµο-
στεί µόνο στις περιπτώσεις που µπορούµε να µαντέψουµε τη µορφή της λύσης. Επι-
πλέον, η µέθοδος της αντικατάστασης µπορεί να εφαρµοστεί για την απόδειξη ασυ-
µπτωτικών εκτιµήσεων σχετικά µε τη λύση µιας αναδροµικής εξίσωσης.
Σε περιπτώσεις που δεν φαίνεται εύκολο να µαντέψουµε τη µορφή της λύσης, µπο-
ρούµε να εφαρµόσουµε τη µέθοδο της επανάληψης, υπολογίζοντας απλώς κάποια
φράγµατα στο άθροισµα που προκύπτει. Στη συνέχεια, µπορούµε να χρησιµοποιή-
σουµε αυτά τα φράγµατα για την εφαρµογή της µεθόδου της αντικατάστασης.
Για παράδειγµα, ας θεωρήσουµε την αναδροµική εξίσωση T(n) = 2T(n/2) + Θ(n),
που δίνει το χρόνο εκτέλεσης χειρότερης περίπτωσης για τη merge sort. Έχουµε δει
ότι η εξίσωση
Ï2 αν n = 2,
T ' (n ) = Ì
Ó2T ' (n / 2 ) + n αν n = 2 k , k > 1 ,
η οποία είναι απολύτως παρόµοια µε αυτή της merge sort, έχει λύση T¢ (n) = n log
n. Θα χρησιµοποιήσουµε τη µέθοδο της αντικατάστασης για να αποδείξουµε ότι Τ(n)
= Θ(n log n). Όσον αφορά στις αρχικές συνθήκες, αν και 1 log 1 = 0, εντούτοις, για
µικρές τιµές του n που ξεπερνούν τη µονάδα, π.χ. n = 2, 3, 4, κοκ., είναι T(n) = Θ(1).
Υποθέτουµε ότι T(n/2) = Θ(n/2 log(n/2)), όπου οι σταθερές c1, c2, που κρύβει ο συµ-
βολισµός Θ είναι ίδιες µε αυτές που κρύβει το Θ(n) στον ορισµό της εξίσωσης. Αντι-
καθιστώντας αυτή την υπόθεση στην αναδροµική εξίσωση, έχουµε
2.3 ∞¡∞¢ƒ√ªπ∫∂™ ∂•π™ø™∂π™ 53
Ê n nˆ Ê n nˆ
T (n ) £ 2Á c2 log ˜ + c2 n T (n ) ≥ 2Á c1 log ˜ + c1n
Ë 2 2¯ Ë 2 2¯
και
£ c2 n(log n - 1) + c2 n ≥ c1n(log n - 1) + c1n
= c2 n log n , = c1n log n .
Εποµένως, για κάθε n > 1, υπάρχουν θετικές σταθερές c1, c2, τέτοιες, ώστε c1 n log
n £ T(n) £ c2 n log n. Συνεπώς, ο χρόνος εκτέλεσης χειρότερης περίπτωσης της merge
sort είναι Θ(n log n).
¢Ú·ÛÙËÚÈfiÙËÙ· 2.9
Κατά την εφαρµογή της µεθόδου της αντικατάστασης, είναι δυνατόν να µαντέψου-
µε σωστά ένα ασυµπτωτικό φράγµα για τη λύση της αναδροµικής εξίσωσης, αλλά
το ζητούµενο να µην προκύπτει από την επαγωγή. Το πρόβληµα, συνήθως, είναι ότι
η επαγωγική υπόθεση δεν είναι αρκετά ισχυρή ώστε να αποδειχθεί το συγκεκριµέ-
νο φράγµα. Σε τέτοιες περιπτώσεις, η αφαίρεση ενός όρου µικρότερης τάξης, συνή-
θως, επιτρέπει την απόδειξη του φράγµατος. Για παράδειγµα, θεωρούµε την ανα-
δροµική εξίσωση:
T (n ) = T ( În / 2û + T ( Èn / 2ù ) + 1
Μαντεύουµε ότι η λύση της εξίσωσης είναι Ο(n) και προσπαθούµε να δείξουµε ότι
T(n) £ c n, για µια κατάλληλα επιλεγµένη σταθερά c. Εφαρµόζοντας τη µέθοδο της
αντικατάστασης, έχουµε T(n) £ c n + 1, από το οποίο δεν συνάγεται ότι T(n) £ c n,
για καµία επιλογή σταθεράς c. Αντίθετα, αν δοκιµάσουµε να αποδείξουµε µε επα-
γωγή ότι T(n) £ c n – b, όπου b µια σταθερά όχι µικρότερη της µονάδας, έχουµε
T (n ) £ ( c În / 2û - b ) + ( c Èn / 2ù - b ) + 1
£ cn - 2 b + 1 £ cn - b .
Όπως συνήθως, η σταθερά c πρέπει να επιλεγεί αρκετά µεγάλη, ώστε να πληρούνται
οι αρχικές συνθήκες.
54 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
Συµπληρώστε τον πίνακα µε ακριβείς ασυµπτωτικές εκτιµήσεις για τις λύσεις των
αναδροµικών εξισώσεων. Για όλες τις εξισώσεις, θεωρείστε σαν αρχική συνθήκη
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
Το Θεώρηµα της Κυριαρχίας (Master Theorem) αποτελεί µια εύκολη συνταγή για
την επίλυση αναδροµικών εξισώσεων της µορφής T(n) – aT(n\b) + f(n) όπου α ≥ 1
και b > 1 είναι σταθερές, και f(n) είναι µία ασυµπτωτικά θετική συνάρτηση.
Το Θεώρηµα της Κυριαρχίας εφαρµόζεται για αλγορίθµους που διαιρούν το πρόβληµα
σε α επιµέρους προβλήµατα, καθένα µεγέθους n / b, τα οποία λύνονται αναδροµικά,
και το συνολικό κόστος για τη διαίρεση και το συνδυασµό των επιµέρους λύσεων
είναι f(n). Για παράδειγµα, στην περίπτωση της merge sort a = 2, b = 2, και f(n) =
Θ(n), ενώ στην περίπτωση της δυαδικής αναζήτησης a =1, b = 2, και f(n) = Θ(1).
Το Θεώρηµα της Κυριαρχίας διακρίνει τις ακόλουθες τρεις περιπτώσεις:
( ) ( )
1. Αν f(n) = O nlog b a - e , για κάποια σταθερά ε > 0, τότε T(n) = Q nlog b a .
τέτοια ώστε, για κάθε n ≥ n0, af(n/b) £ cf(n), για κάποια σταθερά c < 1, τότε
T(n) = Θ(f(n)).
Κατά την εφαρµογή του Θεωρήµατος της Κυριαρχίας, η µεγαλύτερη από τις συναρ-
τήσεις f(n) και nlog b a καθορίζει τη λύση της εξίσωσης. Στην πρώτη περίπτωση, δεν
2.3 ∞¡∞¢ƒ√ªπ∫∂™ ∂•π™ø™∂π™ 55
αρκεί η f(n) να είναι µικρότερη από την nlog b a , πρέπει να είναι πολυωνυµικά µικρό-
τερη (δηλαδή µικρότερη κατά ένα παράγοντα nε, για κάποια σταθερά ε > 0). Στη δεύ-
τερη περίπτωση, όπου οι συναρτήσεις f(n) και nlog b a είναι ίσες, πολλαπλασιάζουµε
( )
µε ένα λογαριθµικό παράγοντα και έχουµε T (n ) = Q nlog b a log n .
Στην τρίτη περίπτωση, η f(n) πρέπει να είναι πολυωνυµικά µεγαλύτερη από την
nlog b a και να ικανοποιεί τη συνθήκη af(n/b) £ cf(n), η οποία ικανοποιείται από τις
περισσότερες συναρτήσεις που θα συναντήσουµε. Παρόλα αυτά, είναι δυνατόν η
f(n) να µην µπορεί να ενταχθεί σε καµία από τις παραπάνω περιπτώσεις και το θεώ-
ρηµα να µην µπορεί να εφαρµοστεί.
Σαν ένα πρώτο παράδειγµα, θεωρούµε την εξίσωση T(n) = 9T(n/3) + n. Είναι
nlog 3 9 = n2 και f(n) = n. Εποµένως, εφαρµόζοντας την πρώτη περίπτωση του Θεω-
ρήµατος της Κυριαρχίας, καταλήγουµε στο συµπέρασµα ότι T(n) = Θ(n2).
Σαν ένα δεύτερο παράδειγµα, θεωρούµε την εξίσωση T(n) = T(2n/3) + 1. Σε αυτή
την περίπτωση, έχουµε f (n ) = Q (1) = nlog 3/ 2 1 = n0 . Εποµένως, εφαρµόζεται η δεύ-
τερη περίπτωση του θεωρήµατος, και T(n) = Θ(log n).
Για την αναδροµική εξίσωση T(n) = 3T(n/4) + nlog n. εφαρµόζεται η τρίτη περί-
πτωση, αφού f(n) = n log n, nlog 4 3 = O (n0,793 ) , και η συνθήκη 3 f(n/4) = 3 (n/4)
log(n/4) £ 3/4 n log n £ 3/4 f(n) ισχύει για αρκετά µεγάλες τιµές του n. Εποµένως,
T(n) = Θ(n log n).
Σαν ένα τελευταίο παράδειγµα, θεωρούµε την εξίσωση T(n) = 2T(n/2) + nlog n.
Παρατηρήστε ότι δεν µπορούµε να εφαρµόσουµε το Θεώρηµα της Κυριαρχίας για
αυτή την εξίσωση, γιατί η ποσότητα nlog 2 2 = n είναι µικρότερη από το f(n) = n log
n, αλλά όχι πολυωνυµικά µικρότερη. Εποµένως, αυτή η αναδροµική εξίσωση δεν
µπορεί να ενταχθεί ούτε στην περίπτωση 2, ούτε στην περίπτωση 3.
¢Ú·ÛÙËÚÈfiÙËÙ· 2.10
∆ώστε µια ακριβή ασυµπτωτική εκτίµηση για τη λύση της αναδροµικής εξίσωσης
T(n) = 2T(n/2) + nlog n
56 K E º A § A I O 2 : ª ∞ £ ∏ ª ∞∆ π ∫ √ À ¶ √ µ ∞ £ ƒ √
™‡ÓÔ„Ë
Αρχικά ορίστηκε ο συµβολισµός Θ, που παρέχει µια ακριβή ασυµπτωτική εκτίµηση
για την τάξη µεγέθους µιας συνάρτησης, ο συµβολισµός Ο, που παρέχει ένα ασυ-
µπτωτικό άνω φράγµα, και ο συµβολισµός Ω, που παρέχει ένα ασυµπτωτικό κάτω
φράγµα. Οι συµβολισµοί ο και ω χρησιµοποιούνται για να δηλώσουν ασυµπτωτικά
άνω και κάτω φράγµατα τα οποία δεν είναι ακριβή.
Ο υπολογισµός αθροισµάτων ανακύπτει, πολλές φορές, κατά την ανάλυση αλγορίθ-
µων των οποίων η λειτουργία βασίζεται σε βρόγχους επανάληψης. Η µαθηµατική
επαγωγή είναι ένα ισχυρό εργαλείο για τον υπολογισµό αθροισµάτων, όταν υπάρχει
µια εκτίµηση για τη µορφή του κλειστού τύπου. Τέτοιες εκτιµήσεις µπορούν να προ-
κύψουν από τον υπολογισµό άνω και κάτω φραγµάτων στις τιµές του αθροίσµατος.
Ο χρόνος εκτέλεσης των αναδροµικών αλγορίθµων περιγράφεται από αναδροµικές
εξισώσεις. Η µέθοδος της επανάληψης, αναπτύσσοντας την αναδροµή, ανάγει την
επίλυση µιας εξίσωσης στον υπολογισµό ενός αθροίσµατος. Το δέντρο της αναδρο-
µής αναπαριστά την ανάπτυξη της αναδροµής, και συχνά διευκολύνει σηµαντικά στον
υπολογισµό του αθροίσµατος. Στις περιπτώσεις που το άθροισµα είναι δύσκολο να
υπολογιστεί και γνωρίζουµε τη µορφή της λύσης, µπορεί να χρησιµοποιηθεί η µέθο-
δος της αντικατάστασης, η οποία επιβεβαιώνει τη λύση της εξίσωσης επαγωγικά. Το
Θεώρηµα της Κυριαρχίας αποτελεί µία ισχυρή και εύκολη στην εφαρµογή συνταγή
για την επίλυση αναδροµικών εξισώσεων συγκεκριµένης µορφής.
B I B § I O ° PA º I A 57
µÈ‚ÏÈÔÁÚ·Ê›·
™ÎÔfi˜
∫ ∂
3
º
Σκοπός αυτού του κεφαλαίου είναι η αναλυτική παρουσίαση της µεθόδου σχεδιασµού
αλγορίθµων «διαίρει και βασίλευε». Η παρουσίαση της µεθόδου γίνεται µέσα από
παραδείγµατα αλγορίθµων που επιλύουν προβλήµατα προερχόµενα από διαφορετι-
κά πεδία, ώστε να τονισθεί η σηµασία, η αποτελεσµατικότητα και το ευρύ φάσµα
εφαρµογών της µεθόδου.
∞ § ∞ π √
¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·
Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση:
• Να εφαρµόζει τη µέθοδο «διαίρει και βασίλευε» για την επίλυση προβληµάτων
ενδιάµεσου βαθµού δυσκολίας.
• Να εφαρµόζει, να συνθέτει ή να τροποποιεί γνωστούς αλγορίθµους για την επίλυ-
ση άλλων απλών προβληµάτων.
• Να υπολογίζει κάτω φράγµατα στο χρόνο εκτέλεσης χειρότερης περίπτωσης αλγο-
ρίθµων που επιλύουν απλά προβλήµατα.
ŒÓÓÔȘ ÎÏÂȉȿ
• µέθοδος «διαίρει και βασίλευε» αλγόριθµος
∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Στο προηγούµενο κεφάλαιο, είδαµε µερικά παραδείγµατα αναδροµικών αλγορίθµων,
των οποίων η λειτουργία βασίζεται στη µέθοδο «διαίρει και βασίλευε» (divide and
conquer). Η ιδέα του «διαίρει και βασίλευε» παρέχει µια απλή και ισχυρή τεχνική
σχεδιασµού αλγορίθµων, η οποία βρίσκει εφαρµογή σε πληθώρα προβληµάτων από
διαφορετικά πεδία (π.χ. προβλήµατα διάταξης, πολλαπλασιασµού πινάκων, πολλα-
πλασιασµού πολυωνύµων, µετασχηµατισµός Fourier).
60 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
Η µέθοδος του «διαίρει και βασίλευε» συνίσταται στη διάσπαση του στιγµιότυπου
εισόδου σε µικρότερα, επιµέρους στιγµιότυπα του ίδιου προβλήµατος, στην επίλυση
των επιµέρους στιγµιότυπων και στον υπολογισµό µιας λύσης για το αρχικό στιγµιό-
τυπο εισόδου από τις λύσεις των επιµέρους στιγµιότυπων. Η επίλυση των επιµέρους
στιγµιότυπων, συνήθως, γίνεται µε επίκληση του ίδιου αλγορίθµου. Σε αυτές τις περι-
πτώσεις, το αποτέλεσµα της µεθόδου «διαίρει και βασίλευε» είναι ένας αναδροµικός
αλγόριθµος. Μερικές φορές, όταν το µέγεθος των επιµέρους στιγµιότυπων γίνει αρκε-
τά µικρό, είναι προτιµότερη η εφαρµογή κάποιου άλλου, µη αναδροµικού αλγορίθ-
µου, για την επίλυση των επιµέρους στιγµιότυπων.
Η µέθοδος «διαίρει και βασίλευε» βρίσκει εφαρµογή σε όσα προβλήµατα η λύση ενός
αρχικού στιγµιότυπου εισόδου µπορεί να συντεθεί από τις λύσεις επιµέρους στιγµιό-
τυπων, που έχουν προέλθει από τη διάσπαση του αρχικού. Για παράδειγµα, στον αλγό-
ριθµο διάταξης merge sort, κατασκευάζουµε τη διατεταγµένη ακολουθία εξόδου από
τις δύο διατεταγµένες, επιµέρους ακολουθίες, που έχουν προέλθει από τη διαίρεση
της (µη διατεταγµένης) ακολουθίας εισόδου. Η διάταξη των επιµέρους ακολουθιών
γίνεται µε την αναδροµική εφαρµογή του αλγορίθµου merge sort.
Εκτός από την απλότητα στη σύλληψη και την εφαρµογή, ένα σηµαντικό πλεονέκτη-
µα της µεθόδου «διαίρει και βασίλευε» είναι ότι οδηγεί σε αλγορίθµους που είναι εύκο-
λο να αναλυθούν. Η ανάλυση ενός αλγορίθµου που βασίζεται στη µέθοδο «διαίρει και
βασίλευε» συνίσταται στη διατύπωση και την επίλυση της αναδροµικής εξίσωσης που
διέπει τη λειτουργία του αλγορίθµου. Η αναδροµική εξίσωση, συνήθως, προκύπτει
απευθείας από την ιδέα στην οποία βασίζεται ο αλγόριθµος. Επιπλέον, είναι γνωστά
πολλά ισχυρά µαθηµατικά εργαλεία για την επίλυση αναδροµικών εξισώσεων.
Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες:
3.1. Quicksort
3.2. Το πρόβληµα της επιλογής
3.3. Πολλαπλασιασµός αριθµών και πινάκων
3.4. Πολυώνυµα και FFT
3.1 QUICKSORT 61
3.1 Quicksort
Έχουµε ήδη παρουσιάσει µια εφαρµογή της µεθόδου «διαίρει και βασίλευε» στο
πρόβληµα της διάταξης n αριθµών (αλγόριθµος merge sort). Μάλιστα, δείξαµε ότι
ο χρόνος εκτέλεσης χειρότερης περίπτωσης του αλγορίθµου merge sort είναι Θ(n
log n). Όπως θα δούµε στη συνέχεια, δεν µπορεί να υπάρξει αλγόριθµος διάταξης
µε χρόνο εκτέλεσης χειρότερης περίπτωσης καλύτερο του Θ(n log n), οπότε ο αλγό-
ριθµος merge sort έχει τον καλύτερο δυνατό χρόνο εκτέλεσης (ασυµπτωτικά).
Σε αυτή την ενότητα, θα παρουσιάσουµε τον αλγόριθµο quicksort, ο οποίος ανακα-
λύφθηκε από τον C.A.R. Hoare το 1962 και, επίσης, βασίζεται στη µέθοδο του «διαί-
ρει και βασίλευε». Αν και ο χρόνος εκτέλεσης χειρότερης περίπτωσης του quicksort
είναι Θ(n2), στην πράξη αποδεικνύεται πολύ γρήγορος, ενώ έχει χρόνο εκτέλεσης
µέσης περίπτωσης O(n log n).
Όπως κάθε αλγόριθµος που βασίζεται στη µέθοδο «διαίρει και βασίλευε», ο αλγό-
ριθµος quicksort διατάσσει έναν πίνακα αριθµών Α[p, …, r] σε τρία βήµατα.
• ∆ιαίρεση. Ο πίνακας A[p, …, r] αναδιατάσσεται και διαιρείται σε δύο υποπίνα-
κες A[p, …, q] και Α[q + 1, …, r], έτσι ώστε κάθε στοιχείο του υποπίνακα A[p,
…, q] να είναι µικρότερο ή ίσο από κάθε στοιχείο του υποπίνακα A[q + 1, …, r].
Ο υπολογισµός του δείκτη q είναι µέρος της διαδικασίας διαίρεσης.
• Επίλυση επιµέρους στιγµιότυπων. Οι υποπίνακες A[p, …, q] και A[q + 1, …, r]
διατάσσονται µε αναδροµικές κλήσεις του αλγορίθµου quicksort.
• Σύνθεση λύσεων επιµέρους στιγµιότυπων. Αφού κάθε στοιχείο του υποπίνακα
A[p, …, q] είναι µικρότερο ή ίσο από κάθε στοιχείο του υποπίνακα A[q + 1, …,
r], και οι A[p, …, q] και Α[q + 1, …, r] είναι διατεταγµένοι, ο πίνακας A[p, …, r]
είναι επίσης διατεταγµένος.
Ο παρακάτω ψευδοκώδικας υλοποιεί τον αλγόριθµο quicksort. Για την διάταξη ενός
πίνακα n αριθµών A[1, …, n], καλούµε quicksort(A, 1, n).
quicksort(A, p, r)
if p < r then
q ¨ partition(A, p, r);
quicksort(A, p, q);
quicksort(A, q + 1, r);
Το σηµείο κλειδί στη λειτουργία του αλγορίθµου quicksort είναι η διαδικασία
partition, η οποία πραγµατοποιεί την αναδιάταξη και τη διαίρεση του πίνακα Α[p,
…, r].
62 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
partition(A, p, r)
x ¨ A[p]; i ¨ p – 1; j ¨ r + 1;
while TRUE do
repeat j ¨ j – 1
until A[j] £ x;
repeat i ¨ i + 1
until A[i] ≥ x;
if i < j then swap(A[i], A[j])
{∏ swap ·ÓÙÈÌÂÙ·ı¤ÙÂÈ Ù· ÛÙÔȯ›· A[i] Î·È A[j]}
else return j;
Η διαδικασία partition οργανώνει τη διαίρεση του πίνακα A[p, …, r] γύρω από το
στοιχείο x = A[p]. Η partition συνεχώς αναπτύσσει τις περιοχές A[p, …, i] και Α[j,
…, r], ξεκινώντας από το αριστερό και το δεξιό άκρο του Α, αντίστοιχα, ώστε κάθε
στοιχείο της περιοχής A[p, …, i] να είναι µικρότερο του x, και κάθε στοιχείο της
περιοχής A[j, …, r] να είναι µεγαλύτερο του x. Αρχικά, είναι i = p – 1 και j = r + 1,
εποµένως, οι περιοχές δεν περιέχουν στοιχεία. Ο πρώτος repeat – βρόγχος εντοπίζει
το πρώτο προς τα αριστερά στοιχείο που εµποδίζει την ανάπτυξη της περιοχής A[j,
…, r], δηλαδή την πρώτη θέση j για την οποία ισχύει A[j] £ x. Ο δεύτερος repeat –
βρόγχος εντοπίζει το πρώτο προς τα δεξιά στοιχείο που εµποδίζει την ανάπτυξη της
περιοχής A[p, …, i], δηλαδή την πρώτη θέση i για την οποία ισχύει A[i] ≥ x.
Εφόσον οι δύο περιοχές δεν επικαλύπτονται, το στοιχείο A[i] είναι πολύ µεγάλο για να
ανήκει στην περιοχή του αριστερού άκρου, και το στοιχείο A[j] είναι πολύ µικρό για
να ανήκει στην περιοχή του δεξιού άκρου. Έτσι, τα στοιχεία A[i] και A[j] αλλάζουν
αµοιβαία θέσεις και συνεχίζεται η ανάπτυξη των δύο περιοχών. Όταν για πρώτη φορά
οι περιοχές A[p, …, i] και A[j, …, r] επικαλυφθούν, δηλαδή γίνει i ≥ j, η διαδικασία
της διαίρεσης ολοκληρώνεται, και σαν όριο των δύο υποπινάκων ορίζεται η θέση j.
¢Ú·ÛÙËÚÈfiÙËÙ· 3.1
∆ώστε µια αναπαράσταση της λειτουργίας της διαδικασίας partition για τον πίνα-
κα Α = [5, 3, 2, 6, 4, 1, 3, 7]. Επαναλάβετε για τον πίνακα B = [13, 19, 9, 5, 12, 8,
7, 4, 11, 2, 6, 21].
3.1 QUICKSORT 63
¢Ú·ÛÙËÚÈfiÙËÙ· 3.2
∆είξτε ότι ο χρόνος εκτέλεσης της διαδικασίας partition είναι Θ(n), όπου n = r – p
+ 1 είναι ο αριθµός των στοιχείων που συµµετέχουν στη διαίρεση.
Ο χρόνος εκτέλεσης Τ(n) που χρειάζεται η quicksort για να διατάξει έναν πίνακα n
στοιχείων είναι ίσος µε το άθροισµα του Θ(n), για την εκτέλεση της partition, και
των χρόνων εκτέλεσης των δύο αναδροµικών κλήσεων για τη διάταξη των δύο υπο-
πινάκων. Οι χρόνοι εκτέλεσης των αναδροµικών κλήσεων εξαρτώνται από τη θέση
της διαίρεσης q, που καθορίζει το µέγεθος των δύο υποπινάκων. Εποµένως, T(n) =
T(q) + T(n – q) + Θ(n), και µπορούµε πάντα να θεωρούµε ότι T(1) = Θ(1).
∆ιαισθητικά, το µέγεθος του µεγαλύτερου από τα επιµέρους στιγµιότυπα που προ-
κύπτουν από τη διαδικασία της διαίρεσης αποτελεί µέτρο για την πρόοδο ενός αλγό-
ριθµου «διαίρει και βασίλευε». Για την quicksort συγκεκριµένα, αν ο µεγαλύτερος
από τους δύο υποπίνακες έχει µέγεθος σχεδόν ίσο µε αυτό του αρχικού πίνακα, αφε-
νός ο αλγόριθµος ανάλωσε χρόνο Θ(n) για να πραγµατοποιηθεί η διαίρεση και, αφε-
τέρου, το µεγαλύτερο επιµέρους στιγµιότυπο είναι σχεδόν το ίδιο δύσκολο να λυθεί
όσο το αρχικό στιγµιότυπο. Αντίθετα, αν ο µεγαλύτερος από τους δύο υποπίνακες
είναι σηµαντικά µικρότερος από τον αρχικό πίνακα, και τα επιµέρους στιγµιότυπα
θα είναι σηµαντικά ευκολότερο να επιλυθούν. Εποµένως, στην τελευταία περίπτω-
ση, η εφαρµογή της διαίρεσης µοιάζει να άξιζε τον κόπο.
Με βάση τις παραπάνω παρατηρήσεις, η χειρότερη περίπτωση για την quicksort συµ-
βαίνει όταν, σε κάθε βήµα, η διαδικασία partition παράγει έναν υποπίνακα µεγέθους
n – 1 και έναν υποπίνακα µεγέθους 1. Σε αυτή την περίπτωση, η αναδροµική εξίσω-
ση που περιγράφει το χρόνο εκτέλεσης γίνεται T(n) = T(n – 1) + Θ(n). Η λύση αυτής
της εξίσωσης (βλ. Άσκηση Αυτοαξιολόγησης 2.6, περίπτωση 2) είναι T(n) = Θ(n2).
Αντίθετα, η καλύτερη περίπτωση συµβαίνει όταν, σε κάθε της εφαρµογή, η διαδι-
κασία partition παράγει δύο υποπίνακες µεγέθους n/2. Τότε, ο χρόνος εκτέλεσης της
quicksort δίνεται από την αναδροµική εξίσωση T(n) = 2T(n/2) + Θ(n), η οποία γνω-
ρίζουµε ότι έχει λύση Τ(n) = Θ(n log n). ∆ηλαδή, ο χρόνος εκτέλεσης της quicksort
είναι O(n2) και Ω(n log n).
¢Ú·ÛÙËÚÈfiÙËÙ· 3.3
∆ώστε στιγµιότυπα για τα οποία η quicksort χρειάζεται χρόνο Θ(n log n), και Θ(n2).
64 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
Είναι εύλογος ο ισχυρισµός ότι, για την ανάλυση της quicksort, είναι πολύ περιορι-
στικό να υποθέσουµε ότι η διαδικασία partition παράγει, σε κάθε βήµα, δύο ισοµε-
γέθεις υποπίνακες. Αντ’ αυτού, ας υποθέσουµε ότι, σε κάθε βήµα, οι δύο υποπίνα-
κες που παράγονται από την partition έχουν την ίδια τάξη µεγέθους Θ(n). Και σε
αυτή την περίπτωση, µπορούµε να αποδείξουµε ότι ο χρόνος εκτέλεσης της quicksort
είναι Τ(n) = Θ(n log n). Ο λόγος είναι ότι, όταν σε κάθε βήµα, οι δύο υποπίνακες
έχουν µέγεθος Θ(n), το ύψος του δέντρου της αναδροµής είναι Θ(log n), ενώ κάθε
επίπεδο του δέντρου συνεισφέρει Θ(n) στο συνολικό χρόνο εκτέλεσης. Το ίδιο επι-
χείρηµα ισχύει και όταν για όλα, εκτός από O(log n) βήµατα, η διαδικασία partition
παράγει υποπίνακες που αµφότεροι έχουν τάξη µεγέθους Θ(n).
¢Ú·ÛÙËÚÈfiÙËÙ· 3.4
Έστω ότι σε κάθε βήµα, η διαδικασία partition παράγει έναν υποπίνακα µεγέθους cn
και έναν υποπίνακα µεγέθους dn, όπου c, d θετικές σταθερές, c + d = 1. Αποδείξτε
ότι, και σε αυτή την περίπτωση, ο χρόνος εκτέλεσης της quicksort είναι Θ(n log n).
Ο λόγος που η quicksort, αν και έχει χρόνο εκτέλεσης χειρότερης περίπτωσης Θ(n2),
είναι πολύ γρήγορη στην πράξη, είναι ότι στις περισσότερες περιπτώσεις η διαδικα-
σία partition παράγει δύο υποπίνακες της ίδιας τάξης µεγέθους.
Για να τεκµηριώσουµε και θεωρητικά την ταχύτητα της quicksort στην πράξη, θα
τροποποιήσουµε τη διαδικασία partition, ώστε να επιλέγει τυχαία το στοιχείο γύρω
από το οποίο οργανώνεται η διαίρεση σε υποπίνακες και θα υπολογίσουµε το χρόνο
εκτέλεσης µέσης περίπτωσης για αυτήν την παραλλαγή της quicksort. Συγκεκριµέ-
να, στον κώδικα της quicksort αντικαθιστούµε την κλήση της διαδικασίας partition
µε κλήση της ακόλουθης παραλλαγής της.
r_partition(A, p, r)
∂¤ÏÂÍ ¤Ó·Ó ·Î¤Ú·ÈÔ i Ù˘¯·›· ÛÙÔ ‰È¿ÛÙËÌ· [p, r), ÒÛÙÂ
οı ÙÈÌ‹ Ó· ¤¯ÂÈ Èı·ÓfiÙËÙ· 1/(r – p) Ó· ÂÈÏÂÁ›.
swap(A[i], A[p]);
return partition(A, p, r);
3.1 QUICKSORT 65
™∏ª∂πø™∏
Οι αλγόριθµοι, όπως η βασική εκδοχή της quicksort, που δεν χρησιµοποιούν τυχαι-
ότητα στις επιλογές τους, ονοµάζονται ντετερµινιστικοί αλγόριθµοι (deterministic
algorithms), ενώ οι αλγόριθµοι, όπως η παραπάνω παραλλαγή της quicksort, που
χρησιµοποιούν τυχαιότητα σε κάποιες από τις επιλογές τους, ονοµάζονται πιθανοτι-
κοί αλγόριθµοι (randomized algorithms). Οι πιθανοτικοί αλγόριθµοι είναι συχνά
ευκολότεροι στο σχεδιασµό και αποτελεσµατικότεροι από τους ντετερµινιστικούς.
Επιπλέον, υπάρχουν προβλήµατα για τα οποία δεν είναι γνωστοί ντετερµινιστικοί
αλγόριθµοι των οποίων η απόδοση να είναι παρόµοια µε αυτή των καλύτερων πιθα-
νοτικών. Από την άλλη πλευρά, η ανάλυση των πιθανοτικών αλγορίθµων είναι συχνά
δυσκολότερη τεχνικά από αυτή των ντετερµινιστικών αλγορίθµων.
Συχνά, οι τυχαίες επιλογές ενός πιθανοτικού αλγόριθµου επηρεάζουν σηµαντικά το
χρόνο εκτέλεσής του, δηµιουργώντας διαφορετικά ενδεχόµενα εκτέλεσης του αλγό-
ριθµου, καθένα από τα οποία έχει διαφορετικό χρόνο εκτέλεσης. Σε αυτές τις περιπτώ-
σεις, προσπαθούµε να προσδιορίσουµε τη µέση τιµή του χρόνου εκτέλεσης του αλγό-
ριθµου που δίνεται από το άθροισµα, για όλα τα διαφορετικά ενδεχόµενα, των γινοµέ-
νων του χρόνου εκτέλεσης για κάθε ενδεχόµενο επί την πιθανότητα να προκύψει αυτό
το ενδεχόµενο (και, εποµένως, ο αλγόριθµος να έχει αυτόν το χρόνο εκτέλεσης).
Επιστρέφοντας στην ανάλυση της πιθανοτικής εκδοχής της quicksort, έστω n = r –
p + 1 ο αριθµός των στοιχείων του πίνακα Α[p, …, r]. Στην νέα έκδοση της partition,
η οποία επιλέγει τυχαία το στοιχείο x γύρω από το οποίο οργανώνεται η διαίρεση σε
υποπίνακες, κάθε στοιχείο Α[i] (p £ i < r) µπορεί να επιλεγεί µε πιθανότητα 1/(n –
1) . Επιπλέον, σε κάθε δυνατό όριο q (q = p, …, r – 1) για τη διαίρεση του πίνακα
Α[p, …, r], αντιστοιχεί ακριβώς ένα στοιχείο A[iq], το οποίο, αν επιλεγεί για να οργα-
νωθεί η διαίρεση γύρω από αυτό, οι υποπίνακες που θα προκύψουν θα είναι A[p, …,
q] και A[q + 1, …, r].
Έστω S(n) ο µέσος χρόνος που χρειάζεται η πιθανοτική εκδοχή της quicksort µε τη
διαδικασία διαίρεσης r_partition για να διατάξει n αριθµούς. Το S(n) είναι ίσο µε το
άθροισµα του Θ(n), για την εκτέλεση της r_partition και των µέσων χρόνων για τη
διάταξη των υποπινάκων που προκύπτουν. Αφού κάθε όριο q, q = p, …, r – 1, προ-
κύπτει µε πιθανότητα 1/(n – 1), έχουµε:
n -1 n -1
Â( ) Â S (i ) .
1 2
S (n ) = Q (n ) + S (i ) + S (n - i ) = Q (n ) +
n -1 i =1
n -1 i =1
Προφανώς, S(n) = Ω(n log n) και S(n) = O(n2), αφού ο µέσος χρόνος εκτέλεσης πρέ-
66 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
πει να βρίσκεται µεταξύ της καλύτερης και της χειρότερης περίπτωσης. Έστω c > 0
µια σταθερά, ώστε ο χρόνος που χρειάζεται η r_partition για τη διαίρεση ενός πίνα-
κα n στοιχείων να µην ξεπερνά το cn. Χρησιµοποιώντας τη µέθοδο της αντικατά-
στασης, θα δείξουµε ότι, για κάθε n ≥ 1, S(n) £ 8cn log n .
Μπορούµε να υποθέσουµε ότι S(1) = 0 και να επιλέξουµε τη σταθερά c ώστε S(2) £
16c. Πράγµατι, αντικαθιστώντας την υπόθεση S(n) £ 8cn log n στην αναδροµική εξί-
σωση, έχουµε:
n -1
 i log i
16 c
S (n ) £ cn +
n -1 i =1
Â
n -1
i log i σε δύο µέρη.
i =1
n -1 n / 2 -1 n -1
Εκτός από την ταχύτητα, ένα άλλο σηµαντικό πλεονέκτηµα της quicksort είναι ότι ο
αριθµός των – επιπλέον του πίνακα Α – θέσεων µνήµης που χρησιµοποιούνται είναι
µικρός και σταθερός, δηλαδή ανεξάρτητος από τον αριθµό n των στοιχείων του πίνακα.
a1£a2
Nαι Όχι
a2£a3 a1£a3
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/k οµά-
δες που καθεµία περιέχει k στοιχεία. Τα στοιχεία κάθε συγκεκριµένης οµάδας είναι
µεγαλύτερα από αυτά της προηγούµενης και είναι µικρότερα από αυτά της επόµε-
νης. Εποµένως, για να διατάξουµε το σύνολο των στοιχείων, αρκεί να διατάξουµε
τα στοιχεία κάθε οµάδας. Αποδείξτε ένα κάτω φράγµα στον αριθµό των συγκρί-
σεων που χρειάζεται κάθε ντετερµινιστικός αλγόριθµος που βασίζεται σε συγκρί-
σεις και λύνει αυτό το πρόβληµα.
¢Ú·ÛÙËÚÈfiÙËÙ· 3.5
Μια απάντηση σε αυτό το ερώτηµα προκύπτει από την επανεξέταση της λειτουργίας
της quicksort. Αφού κανένα στοιχείο του υποπίνακα Α[p, …, q] δεν είναι µεγαλύτε-
ρο από τα στοιχεία του Α[q + 1, …, r], αν k £ q, το k – οστό στοιχείο του Α[p, …, r]
θα είναι το k – οστό στοιχείο του υποπίνακα Α[p, …, q]. ∆ιαφορετικά, αν k > q, το
k – οστό στοιχείο του Α[p, …, r] θα είναι το (k – (q + 1 – p)) – οστό στοιχείο του
υποπίνακα A[q + 1, …, r]. Αυτή η παρατήρηση µας οδηγεί στον ακόλουθο, πιθανο-
τικό, «διαίρει και βασίλευε» αλγόριθµο για το πρόβληµα της επιλογής.
r_quickselect(A, p, r, k)
if p = r then return A[p];
q ¨ r_partition(A, p, r);
m ¨ q + 1 – p;
if k £ m then
return r_quickselect(A, p, q, k);
else
return r_quickselect(A, q + 1, r, k – m);
Η χειρότερη περίπτωση για αυτό τον αλγόριθµο συµβαίνει όταν, σε κάθε βήµα, το
k – οστό στοιχείο του Α να βρίσκεται στον µεγαλύτερο από τους δύο υποπίνακες, ο
οποίος έχει µέγεθος n – 1 (n = r – p + 1). Σε αυτή την περίπτωση, ο αλγόριθµος χρει-
άζεται χρόνο Θ(n2) για την εύρεση ακόµα και του ελάχιστου ή του µέγιστου στοι-
χείου του Α. Λόγω όµως της πιθανοτικής του φύσης, δεν υπάρχει συγκεκριµένο στιγ-
µιότυπο εισόδου για το οποίο ο αλγόριθµος να επιδεικνύει αυτή τη συµπεριφορά. Η
χειρότερη περίπτωση µπορεί να συµβεί µόνο εξαιτίας συνεχών «άτυχων» επιλογών
του στοιχείου γύρω από το οποίο οργανώνεται η διαίρεση.
Παρόλα αυτά, ο χρόνος εκτέλεσης µέσης περίπτωσης του αλγόριθµου r_quickselect
είναι σηµαντικά µικρότερος. Έστω S(n) ο µέσος χρόνος για να επιλέξει ο
r_quickselect το k – οστό στοιχείο από έναν πίνακα Α µε n στοιχεία. Το S(n) είναι
ίσο µε Θ(n), από την κλήση της r_partition, συν το µέσο χρόνο που χρειάζεται για
την αναδροµική κλήση της r_quickselect. Ο µέσος χρόνος για την αναδροµική κλήση
εξαρτάται τόσο από το σηµείο διαίρεσης q (δηλαδή από το µέγεθος των υποπινά-
κων), όσο και από τον υποπίνακα στον οποίο θα συνεχιστεί η αναζήτηση για το k –
οστό στοιχείο. Χωρίς βλάβη της γενικότητας, θεωρούµε ότι η αναζήτηση συνεχίζε-
ται πάντα στο µεγαλύτερο υποπίνακα. Εποµένως, έχουµε:
3.2 ∆√ ¶ƒ√µ§∏ª∞ ∆∏™ ∂¶π§√°∏™ 71
n -1
 S (max{i, n - i})
1
S (n ) = Q (n ) +
n -1 i =1
n -1
Â
2
£ Q (n ) + S (i ) .
n - 1 i = n/2
Έστω c > 0 µία σταθερά, τέτοια ώστε ο χρόνος για την κλήση της r_partition να είναι
το πολύ cn. Με τη µέθοδο της αντικατάστασης, θα δείξουµε ότι S(n) £ 4cn. Αφού
S(1) = Θ(1), µπορούµε να επιλέγουµε τη σταθερά c, ώστε η ανισότητα να ισχύει για
µικρές τιµές του n, π.χ. S(1) £ 4c, S(2) £ 8c, κλπ. Πράγµατι, αντικαθιστώντας στην
αναδροµική εξίσωση, έχουµε:
n -1
Â
2
S (n ) £ cn + 4 ci
n - 1 i = n/2
8c Ê
n -1 n / 2 -1 ˆ
= cn + Á Â Â
n - 1 Ë i =1
i -
i =1 ¯
i˜
8 c Ê n(n - 1) n(n - 2 ) ˆ
= cn + Á - ˜
n -1 Ë 2 8 ¯
8 c n(3n - 2 )
£ cn + ◊
n -1 8
£ cn + 3 cn = 4 cn .
Συνεπώς, ο χρόνος εκτέλεσης µέσης περίπτωσης του αλγορίθµου r_quickselect είναι
γραµµικός.
¢Ú·ÛÙËÚÈfiÙËÙ· 3.6
Αν 1/c + 1/d < 1, αποδείξτε ότι η λύση της αναδροµικής εξίσωσης T(n) = Θ(n) +
T(n/c) + T(n/d) είναι T(n) = Θ(n). Τι συµβαίνει στην περίπτωση που 1/c + 1/d = 1;
(βλ. Άσκηση Αυτοαξιολόγησης 2.8, περιπτώσεις 5 και 6).
Ας εστιάσουµε λοιπόν στην επιλογή του δείγµατος. Έχοντας θέσει σαν στόχο τον
σχεδιασµό ενός ντετερµινιστικού αλγορίθµου, δεν µπορούµε να επιλέξουµε το δείγ-
µα µε τυχαίο τρόπο (π.χ. τυχαία δειγµατοληψία µε ή χωρίς αντικατάσταση των στοι-
χείων). Επίσης, δεν µπορούµε να επιλέξουµε χωρίς συγκεκριµένη µέθοδο κάποια n/c
στοιχεία του πίνακα Α, γιατί, αν η διαίρεση οργανωθεί γύρω από το ενδιάµεσο στοι-
χείο ενός τέτοιου του δείγµατος, µπορούµε απλώς να εγγυηθούµε ότι ο µεγαλύτερος
υποπίνακας θα έχει µέγεθος (1 – 1/2c).
Γι’ αυτό διαιρούµε τον πίνακα Α σε Èn / 5ù οµάδες, 5 στοιχείων η κάθε µία (η τελευ-
ταία οµάδα θα έχει ακριβώς n mod 5 στοιχεία), και βρίσκουµε το ενδιάµεσο στοι-
χείο κάθε τέτοιας οµάδας. Το δείγµα αποτελείται από αυτά τα Èn / 5ù ενδιάµεσα
στοιχεία. Προφανώς, το ενδιάµεσο στοιχείο κάθε οµάδας µπορεί να υπολογισθεί σε
σταθερό χρόνο, οπότε ο χρόνος χειρότερης περίπτωσης για την επιλογή του δείγµα-
τος είναι Θ(n). Ένα παράδειγµα αυτής της διαδικασίας φαίνεται στον Πίνακα 3.1.
Το ενδιάµεσο στοιχείο του δείγµατος είναι το 7 και η διαίρεση που προκύπτει είναι
[2, 1, 4, 6, 5, 3] και [9, 7, 15, 10, 11, 13, 8, 12, 14].
¶›Ó·Î·˜ 3.1
Ένα παράδειγµα της διαδικασίας επιλογής του δείγµατος.
Πίνακας Α 9 7 15 2 1 10 4 11 6 5 13 8 12 14 3
Οµάδες [9, 7, 15, 2, 1] [10, 4, 11, 6, 5] [14, 15, 12, 10, 9]
∆είγµα 7 6 12
Όσον αφορά το µέγεθος του µεγαλύτερου από τους δύο υποπίνακες που προκύπτουν
από τη διαίρεση γύρω από το ενδιάµεσο στοιχείου του δείγµατος, αυτό δεν µπορεί
να είναι µεγαλύτερο του 7n/10. Για να αποδείξουµε αυτό, θεωρούµε ότι τα στοιχεία
του Α είναι οργανωµένα σε έναν πίνακα µε Èn / 5ù στήλες και 5 γραµµές. Κάθε
στήλη περιέχει τα στοιχεία µιας από τις Èn / 5ù οµάδες (στις οποίες έχουν χωριστεί
τα στοιχεία του Α για την επιλογή του δείγµατος) σε αύξουσα σειρά. Εποµένως, όλα
τα ενδιάµεσα στοιχεία των στηλών βρίσκονται στην 3η γραµµή. Επιπλέον, η θέση
74 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
των στηλών είναι τέτοια ώστε το ενδιάµεσο στοιχείο µιας στήλης να µην είναι µεγα-
λύτερο από το ενδιάµεσο στοιχείο της επόµενης. Συνεπώς, το ενδιάµεσο στοιχείο
του δείγµατος βρίσκεται στην (n/10) – η στήλη και στην 3η γραµµή.
Από την κατασκευή αυτή φαίνεται ότι τα στοιχεία που ανήκουν στις στήλες από 1
µέχρι και n/10 και στις γραµµές 1η, 2η, και 3η (συνολικά 3n/10 στοιχεία) είναι µικρό-
τερα του ενδιάµεσου στοιχείου του δείγµατος. Εποµένως, αυτά τα στοιχεία θα τοπο-
θετηθούν στον πρώτο υποπίνακα. Επίσης, τα στοιχεία που βρίσκονται στις στήλες
από n/10 µέχρι και Èn / 5ù και στις γραµµές 3η, 4η και 5η (συνολικά 3n/10 στοιχεία)
είναι µεγαλύτερα του ενδιάµεσου στοιχείου του δείγµατος και, συνεπώς, θα τοπο-
θετηθούν στον δεύτερο υποπίνακα. Άρα, κανένας από τους δύο υποπίνακες δεν µπο-
ρεί να έχει περισσότερα από 7n/10 στοιχεία.
Η κατασκευή αυτή για το παράδειγµα του Πίνακα 3.1 φαίνεται στον Πίνακα 3.2.
Επίσης, η γενική µορφή της κατασκευής φαίνεται στο Σχήµα 3.2, όπου τα στοιχεία
σηµειώνονται µε µαύρους κύκλους, τα στοιχεία του δείγµατος µε λευκούς κύκλους,
και το ενδιάµεσο στοιχείο του δείγµατος µε x. Τα βέλη δηλώνουν ότι το στοιχείο
προορισµού είναι µικρότερο από το στοιχείο αφετηρίας.
¶›Ó·Î·˜ 3.2
Τουλάχιστον 5 στοιχεία είναι µεγαλύτερα και άλλα πέντε µικρότερα
από το ενδιάµεσο στοιχείο του δείγµατος.
4 1 3
5 2 8
6 7 12
10 9 13
11 15 14
... ...
... ...
™¯‹Ì· 3.2
... x
...
Το µέγεθος του
µικρότερου υποπί-
... ...
νακα είναι τουλά-
χιστον 3n/10.
... ...
3.2 ∆√ ¶ƒ√µ§∏ª∞ ∆∏™ ∂¶π§√°∏™ 75
Αφού 1/5 + 7/10 = 9/10 < 1, η ∆ραστηριότητα 3.5 καταδεικνύει ότι ο χρόνος εκτέ-
λεσης χειρότερης περίπτωσης του αλγορίθµου quickselect είναι Θ(n).
¢Ú·ÛÙËÚÈfiÙËÙ· 3.7
¢Ú·ÛÙËÚÈfiÙËÙ· 3.8
Έστω n διαφορετικά στοιχεία x1, x2, …, xn στα οποία έχουµε αντιστοιχήσει θετικά
Â
n
βάρη w1, w2, …, wn τέτοια ώστε wi = 1 . Το πρόβληµα της εύρεσης του βεβα-
i =1
ρυµένου ενδιάµεσου στοιχείου
(weighted median) είναι να βρεθεί ένα στοιχείο xk που ικανοποιεί τις σχέσεις:
 w £ 2 , και  w £ 2
1 1
i i
xi < xk xi > xk
είναι ίσο µε 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), ο οποίος όµως δεν χρησιµοποιείται στην πράξη
εξαιτίας της µεγάλης πολλαπλασιαστικής σταθεράς που «κρύβεται» από τον ασυ-
µπτωτικό συµβολισµό.
Κάθε στοιχείο του πίνακα C µπορεί να υπολογιστεί µε βάση τον παραπάνω τύπο σε Θ(n)
78 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
χρόνο, και αφού ο C έχει n2 στοιχεία, ο χρόνος εκτέλεσης του αλγορίθµου είναι Θ(n3).
Στα τέλη της δεκαετίας του 1960, ο V. Strassen παρουσίασε έναν αλγόριθµο για τον
πολλαπλασιασµό δύο πινάκων µε χρόνο εκτέλεσης O(nlog 7) = O(n2.81). Ο αλγόριθ-
µος αυτός χρησιµοποιεί τη µέθοδο «διαίρει και βασίλευε» µε έµµεσο τρόπο, όπως
και ο αλγόριθµος πολλαπλασιασµού πολυψηφίων αριθµών που παρουσιάστηκε στην
προηγούµενη ενότητα.
Υποθέτουµε ότι το n είναι ζυγός. Τότε ο καθένας από τους πίνακες Α, Β και C µπο-
ρεί να διαιρεθεί σε τέσσερις υποπίνακες µεγέθους n/2 ¥ n/2 ως εξής:
Με αυτόν τον τρόπο, ο υπολογισµός του γινοµένου δύο πινάκων µεγέθους 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:
Στη συνέχεια, υπολογίζουµε τους τέσσερις υποπίνακες του γινοµένου 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
 Â
n -1 n -1
Έστω A( x ) = ai x i και B( x ) = bi x i πολυώνυµα βαθµού (n – 1). Το
i =0 i =0
άθροισµα δύο πολυωνύµων A(x) και B(x) βαθµού (n – 1) είναι ένα πολυώνυµο βαθ-
Â
n -1
µού (n – 1) C ( x ) = ci x i , το οποίο έχει συντελεστές ci = αi + bi. Το γινόµενο
i =0
δύο πολυωνύµων A(x) και B(x) βαθµού (n – 1) είναι ένα πολυώνυµο βαθµού (2n –
 Â
2 n-2 i
2) C ( x ) = ci x i , το οποίο έχει συντελεστές ci = j =0
a j bi - j . Η τιµή ενός
i =0
πολυωνύµου στο σηµείο x0 προκύπτει αν όπου x αντικαταστήσουµε την τιµή x0, και
κάνουµε τις αριθµητικές πράξεις.
Ο απλούστερος τρόπος για να αναπαρασταθεί ένα πολυώνυµο είναι µε το διάνυσµα
των συντελεστών τουA=[α0, α1, …, αn–1]. Αυτή η µέθοδος ονοµάζεται αναπαράστα-
80 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
∆ώστε ψευδοκώδικα για τον υπολογισµό της τιµής ενός πολυωνύµου στη θέση x0
µε τη µέθοδο Horner. Αποδείξτε ότι ο χρόνος εκτέλεσης της µεθόδου είναι Θ(n).
Πολλαπλασιασµός
α0,α1...,αn–1 Θ(n2)
c0,c1...,cn–1 Aναπαράσταση
b0,b1...,bn–1 µε συντελεστές
Αρχικά, θα δούµε πώς η µέθοδος του «διαίρει και βασίλευε» µπορεί να εφαρµοστεί
στο πρόβληµα του υπολογισµού τιµών σε n σηµεία. Έστω Α(x) ένα πολυώνυµο βαθ-
µού (n – 1), όπου το n είναι δύναµη του 2. Το πολυώνυµο A(x) µπορεί να γραφεί σαν
A(x) = A[0] (x2) + xA[1](x2), όπου
A[0](x) = α0 + α2x + α4x2 + … + αn–2xn/2– 1 και A[1](x) = α1 + α3x + α5x2 + … + αn–1xn/2 – 1.
Υποθέστε ότι επιλέγουµε τα n σηµεία για υπολογίσουµε την τιµή του A(x) ως εξής:
1, – 1, 2, – 2, …, n/2, – n/2. Για τον υπολογισµό της τιµής του A(x), πρέπει να υπο-
λογίσουµε τις τιµές των A[0](x) και A[1](x) στα τετράγωνα αυτών σηµείων. Αλλά τα
τετράγωνα των 1 και –1, 2 και –2, κοκ., είναι ίδια, οπότε υπάρχουν µόνο n/2 διαφο-
ρετικά τετράγωνα. Εποµένως, το αρχικό πρόβληµα µεγέθους n έχει αναχθεί στη λύση
δύο επιµέρους προβληµάτων µεγέθους n/2 το καθένα, τα οποία µπορούν να λυθούν
αναδροµικά. Επιπλέον, οι λύσεις των επιµέρους προβληµάτων µπορούν να συνδυα-
στούν σε µία λύση του αρχικού προβλήµατος σε Θ(n) χρόνο. Με αυτό τον τρόπο
καταλήγουµε ότι ο χρόνος εκτέλεσης T(n) αυτής της αναδροµικής διαδικασίας δίνε-
ται από την αναδροµική εξίωση T(n) = 2T(n/2) + Θ(n), η οποία γνωρίζουµε ότι έχει
λύση T(n) = Θ(n log n).
Το µοναδικό πρόβληµα στην παραπάνω αναδροµική διαδικασία είναι ότι, για την
εφαρµογή της αναδροµής σε περισσότερα του ενός επίπεδα, τα σηµεία στα οποία θα
υπολογιστεί η τιµή του πολυωνύµου πρέπει να είναι µιγαδικοί αριθµοί.
Μιγαδικές Ρίζες της Μονάδας
ω28 i
ω38 ω18
ω48 ω08
–1 1
™¯‹Ì· 3.4
Οι µιγαδικές ρίζες ω78
ω58
της µονάδας ω68 –i
για n = 8.
3.4 ¶√§Àø¡Àª∞ ∫∞π FFT 83
Μία n – οστή µιγαδική ρίζα της µονάδας είναι ένας αριθµός ω, τέτοιος, ώστε ωn =
1. Υπάρχουν ακριβώς n µιγαδικές n – οστές ρίζες της µονάδας, οι οποίες είναι οι
αριθµοί e2πik/n, για k = 0, 1, …, n – 1, όπου e = 2,71… η βάση των φυσικών λογα-
ρίθµων, π = 3,14…, και i2 = – 1. Για να ερµηνεύσουµε αυτό τον τύπο, θεωρούµε τον
ορισµό του εκθέτη ενός µιγαδικού αριθµού:
eiu = cos(u) + i sin(u) .
Το Σχήµα 3.4. δείχνει ότι οι n µιγαδικές ρίζες της µονάδας κατανέµονται οµοιόµορ-
φα γύρω από έναν κύκλο που έχει µοναδιαία ακτίνα και κέντρο την αρχή των αξό-
νων του µιγαδικού επιπέδου.
Η τιµή ωn = e2πi/n ονοµάζεται κύρια n – οστή ρίζα της µονάδας και όλες οι υπόλοι-
πες n – οστές ρίζες µπορούν να γραφούν σαν δυνάµεις της ωn. Το σύνολο των n –
οστών ριζών της µονάδας είναι κλειστό ως προς τον πολλαπλασιασµό, δηλαδή το
γινόµενο δύο n – οστών ριζών της µονάδας είναι επίσης n – οστή ρίζα της µονάδας.
Συγκεκριµένα, ωj ωk = ωj + k = ω(j + k) mod n. Η βασική ιδιότητα των µιγαδικών ριζών
της µονάδας που θα χρησιµοποιήσουµε στη συνέχεια είναι ότι, αν το n είναι δύνα-
µη του 2, το σύνολο των τετραγώνων των n – οστών ριζών της µονάδας είναι το
σύνολο των (n/2) – οστών ριζών της µονάδας. Συγκεκριµένα, ισχύει:
Για να αποδείξουµε τον παραπάνω ισχυρισµό, παρατηρούµε ότι, για κάθε 0 £ k £ n/2
– 1, έχουµε (w n ) = (e
k 2
) = e 2 pik /( n / 2 ) = w nk / 2 .
2 pik / n 2
Επιπλέον,
(w nk + n / 2 )2 = w n2 k + n = w n2 k w nn = w n2 k = e 2 pi ( 2 k )/ n = e 2 pik /( n / 2 ) = w nk / 2 .
Â
n -1
µεγέθους n, όπου, για κάθε k = 0, 1, …, n – 1, είναι y k = a jw nkj . ∆ηλαδή, το
j =0
Â
n -1
µου A( x ) = ai x i , και κάθε στοιχείο yk του διανύσµατος Y είναι η τιµή του
i =0
πολυωνύµου Α(x) στο σηµείο w nk , δηλαδή στην k στη σειρά n – οστή ρίζα της µονάδας.
84 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
ω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;
Â
n -1
της µονάδας, πρέπει να λύσουµε το σύστηµα εξισώσεων y k = A(w nk ) = a jw nkj ,
j =0
È y0 ù È1 1 1 1 K 1 ù È a0 ù
Í ú Í n -1 ú Í ú
Í y1 ú Í1 w n wn 2
w n3 K wn ú Í a1 ú
Í y2 ú Í1 w n2 w n4 w n6 K w n2 ( n -1) ú Í a2 ú
Í ú = Í ú Í ú
Í y3 ú Í1 w n
3
w n6 w n9 K w n3( n -1) ú Í a3 ú
ÍM ú ÍM M M M O M ú ÍM ú
Í ú Í 2 ( n -1) 3( n -1)
ú Í ú
ÍÎ y n -1 úû n -1
ÍÎ1 w n wn wn K w n( n -1)( n -1) úû ÍÎ an -1 úû
n -1
Â
1
(VV -1 )[ k , j] = w nkmw n- jm
n m=0
n -1
Â
1
= w nm( k - j )
n m=0
n -1
Â
1
= (w nk - j )m
n m=0
Â
n -1
ak = (1 / n ) y jw n- kj , για κάθε 0 £ k £ n – 1, ο οποίος µοιάζει πολύ µε αυτόν του
j =0
υπολογισµού των τιµών yk του πολυωνύµου στις θέσεις των ριζών της µονάδας.
Συνεπώς, αν αλλάξουµε αµοιβαία τους ρόλους των διανυσµάτων Α και Y και των
στοιχείων τους, αντικαταστήσουµε το ωn µε το ωn– 1 και διαιρέσουµε κάθε στοιχείο
του αποτελέσµατος µε το n, ο αλγόριθµος FFT µπορεί να χρησιµοποιηθεί για τον
υπολογισµό των συντελεστών του πολυωνύµου από τις τιµές του στις n – οστές ρίζες
της µονάδας.
Έτσι, χρησιµοποιώντας την ορθή και την αντίστροφη µορφή του FFT, µπορούµε να
µετατρέψουµε την αναπαράσταση µε συντελεστές ενός πολυωνύµου βαθµού (n – 1)
σε αναπαράσταση µε ζεύγη σηµείων – τιµών σε χρόνο Θ(n log n), και να υπολογί-
σουµε το γινόµενο δύο πολυωνύµων στον ίδιο χρόνο.
™‡ÓÔ„Ë
Σε αυτό το κεφάλαιο παρουσιάστηκε αναλυτικά η µέθοδος «διαίρει και βασίλευε»
µέσα από παραδείγµατα αλγορίθµων.
Αρχικά, παρουσιάστηκε ο αλγόριθµος quicksort για τη διάταξη ενός πίνακα αριθµών.
Η quicksort επιλέγει ένα στοιχείο x του πίνακα και διαιρεί τον πίνακα εισόδου σε δύο
υποπίνακες, ώστε κανένα στοιχείο του ενός να µην ξεπερνά το x και κανένα στοιχείο
του δεύτερου να µην είναι µικρότερο από το x. Η βασική ντετερµινιστική εκδοχή της
quicksort έχει χρόνο εκτέλεσης Ω(n log n) και Ο(n2), ενώ η πιθανοτική εκδοχή της
quicksort έχει χρόνο εκτέλεσης µέσης περίπτωσης Θ(n log n).
Επίσης, αποδείξαµε ότι κάθε ντετερµινιστικός αλγόριθµος, του οποίου η λειτουργία
βασίζεται σε συγκρίσεις µεταξύ των στοιχείων εισόδου, χρειάζεται (στη χειρότερη
περίπτωση) χρόνο Ω(n log n) για να διατάξει έναν πίνακα n στοιχείων.
Στη συνέχεια, είδαµε έναν πιθανοτικό και έναν ντετερµινιστικό αλγόριθµο γραµµι-
κού χρόνου για το πρόβληµα της επιλογής. Η λειτουργία και των δύο αλγορίθµων
βασίζεται στην ιδέα της διαίρεσης του πίνακα εισόδου µε βάση ένα στοιχείο και στην
αναδροµική επίλυση του προβλήµατος στον έναν από τους δύο υποπίνακες. Οι αλγό-
ριθµοι διαφέρουν στον τρόπο επιλογής του στοιχείου γύρω από το οποίο οργανώνε-
ται η διαίρεση.
Η µέθοδος «διαίρει και βασίλευε» βρίσκει εφαρµογή στον πολλαπλασιασµό πολυ-
ψήφιων αριθµών, τον πολλαπλασιασµό πινάκων και στον πολλαπλασιασµό πολυω-
νύµων. Ειδικά για τα πολυώνυµα, είδαµε έναν αποδοτικό αλγόριθµο πολλαπλασια-
σµού που βασίζεται στη µετατροπή από της αναπαράσταση από διάνυσµα συντελε-
στών σε ζεύγη σηµείων – τιµών. Η µετατροπή γίνεται µε τον αλγόριθµο FFT, ο οποί-
ος βασίζεται στη µέθοδο «διαίρει και βασίλευε» και υπολογίζει το ∆ιακριτό Μετα-
σχηµατισµό Fourier ενός διανύσµατος σε χρόνο Θ(n log n).
88 KEºA§AIO 3: ¢π∞πƒ∂π ∫∞π µ∞™π§∂À∂
µÈ‚ÏÈÔÁÚ·Ê›·
™ÎÔfi˜
∫ ∂
4
Σκοπός αυτού του κεφαλαίου είναι η αναλυτική παρουσίαση της µεθόδου του δυνα-
µικού προγραµµατισµού. Η παρουσίαση εστιάζει στα ιδιαίτερα χαρακτηριστικά της
º
µεθόδου και στις ιδιότητες που καθιστούν ένα πρόβληµα κατάλληλο για επίλυση µε
δυναµικό προγραµµατισµό.
∞ § ∞ π √
¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·
• Να αναγνωρίσει τις ιδιότητες των βέλτιστων επιµέρους δοµών και των επικαλυ-
πτόµενων επιµέρους προβληµάτων σε ένα πρόβληµα.
• Να εκτιµήσει τον αριθµό των θέσεων µνήµης που απαιτεί ένας αλγόριθµος δυνα-
µικού προγραµµατισµού.
ŒÓÓÔȘ ÎÏÂȉȿ
• δυναµικός προγραµµατισµός • ιδιότητα επικαλυπτόµενων επιµέρους
• πρόβληµα βελτιστοποίησης προβληµάτων
• ιδιότητα βέλτιστων επιµέρους δοµών • στρατηγικές top – down και bottom – up
∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Η µέθοδος του δυναµικού προγραµµατισµού (dynamic programming), όπως και η
µέθοδος «διαίρει και βασίλευε», επιλύει ένα πρόβληµα συνδυάζοντας τις λύσεις
κατάλληλα επιλεγµένων, επιµέρους προβληµάτων. Στην περίπτωση του δυναµικού
προγραµµατισµού, ο όρος «προγραµµατισµός» περιγράφει τη διαδικασία υπολογι-
σµού / συµπλήρωσης των στοιχείων ενός πίνακα, και όχι τη δηµιουργία ενός προ-
γράµµατος για εκτέλεση σε υπολογιστή.
90 K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™
Όπως είδαµε στο προηγούµενο κεφάλαιο, η µέθοδος «διαίρει και βασίλευε» διαιρεί το
πρόβληµα σε ανεξάρτητα επιµέρους προβλήµατα, επιλύει τα επιµέρους προβλήµατα
αναδροµικά και συνδυάζει τις λύσεις τους για να υπολογίσει µια λύση για το αρχικό
πρόβληµα. Η µέθοδος του δυναµικού προγραµµατισµού εφαρµόζεται όταν τα επιµέ-
ρους προβλήµατα που πρέπει να επιλυθούν δεν είναι ανεξάρτητα, αλλά τα ίδια περιέ-
χουν κοινά επιµέρους προβλήµατα. Αυτό το χαρακτηριστικό ονοµάζεται ιδιότητα των
επικαλυπτόµενων επιµέρους προβληµάτων (overlapping subproblems). Σε αυτά τα προ-
βλήµατα, ένας αλγόριθµος «διαίρει και βασίλευε» κάνει περισσότερη δουλειά από όση
χρειάζεται, αφού επιλύει πολλές φορές το ίδιο επιµέρους πρόβληµα. Αντίθετα, ένας
αλγόριθµος δυναµικού προγραµµατισµού είναι πιο αποδοτικός, επειδή επιλύει µία φορά
κάθε διαφορετικό επιµέρους πρόβληµα και αποθηκεύει τη λύση σε έναν πίνακα για µελ-
λοντική χρήση. Αυτό το χαρακτηριστικό κάνει τους αλγορίθµους δυναµικού προγραµ-
µατισµού ιδιαίτερα απαιτητικούς σε αποθηκευτικό χώρο / θέσεις µνήµης, οι οποίες χρη-
σιµοποιούνται για την αποθήκευση των λύσεων των επιµέρους προβληµάτων.
Η µέθοδος του δυναµικού προγραµµατισµού, συνήθως, εφαρµόζεται σε προβλήµατα
βελτιστοποίησης (optimization problems). Ένα πρόβληµα βελτιστοποίησης έχει πολ-
λές αποδεκτές λύσεις, σε καθεµία από τις οποίες αντιστοιχεί µία τιµή. Το ζητούµενο
είναι ο υπολογισµός της λύσης µε τη βέλτιστη (µέγιστη ή ελάχιστη) τιµή. Ο δυναµι-
κός προγραµµατισµός εφαρµόζεται σε προβλήµατα βελτιστοποίησης των οποίων οι
βέλτιστες λύσεις αποτελούνται από τις βέλτιστες λύσεις συγκεκριµένων επιµέρους
δοµών (optimal substructures).
Ο σχεδιασµός ενός αλγορίθµου δυναµικού προγραµµατισµού για κάποιο συγκεκρι-
µένο πρόβληµα βελτιστοποίησης, συνήθως, ακολουθεί τα παρακάτω βήµατα:
Μελέτη του προβλήµατος ως προς την ιδιότητα των βέλτιστων επιµέρους δοµών και
χαρακτηρισµός της δοµής µιας βέλτιστης λύσης.
∆ιατύπωση της αναδροµικής εξίσωσης που περιγράφει την τιµή µιας βέλτιστης λύσης.
Υπολογισµός της τιµής µιας βέλτιστης λύσης, προχωρώντας από τα µικρότερα στα
µεγαλύτερα επιµέρους προβλήµατα (bottom – up στρατηγική).
Υπολογισµός µιας βέλτιστης λύσης. Το βήµα αυτό µπορεί να παραληφθεί, αν ενδια-
φερόµαστε µόνο για την τιµή µιας βέλτιστης λύσης.
Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες:
4.1. Πολλαπλασιασµός Ακολουθίας Πινάκων
4.2. Χαρακτηριστικά ∆υναµικού Προγραµµατισµού
4.3. Μεγαλύτερη Κοινή Υπό – Ακολουθία
4.1 ¶√§§∞¶§∞™π∞™ª√™ ∞∫√§√À£π∞™ ¶π¡∞∫ø¡ 91
µε αρχική συνθήκη P(1) = 1. Μπορεί να αποδειχθεί ότι P(n) = C(n – 1), όπου C(n)
είναι ο n – οστός αριθµός Catalan:
1 Ê 2nˆ Ê 4n ˆ
C (n ) = Á ˜ = W Á 3/ 2 ˜
n +1 Ë n ¯ Ën ¯ .
Εποµένως, ο αλγόριθµος που εξετάζει όλες τις δυνατές τοποθετήσεις παρενθέσεων
δεν συνιστά µία αποδοτική λύση στο πρόβληµά µας. Μια εναλλακτική προσέγγιση
είναι η εφαρµογή της µεθόδου του δυναµικού προγραµµατισµού.
Στην προσπάθεια να σχεδιάσουµε έναν αλγόριθµο δυναµικού προγραµµατισµού, ξεκι-
νάµε µελετώντας τη δοµή µιας βέλτιστης λύσης. Ας συµβολίσουµε µε Αi..j το επιµέ-
ρους γινόµενο Αi…Aj. Κάθε βέλτιστη λύση θα διαιρεί την ακολουθία µεταξύ των πινά-
κων i και i + 1, για κάποιο 1 £ i < n, θα υπολογίζει τα επιµέρους γινόµενα Α1..i και Αi +
1..n και θα τα πολλαπλασιάζει για να υπολογίσει το γινόµενο Α1…n. Ο αριθµός των πολ-
λαπλασιασµών στοιχείων για τον υπολογισµό του γινοµένου Α1…n είναι ίσος µε d0 ¥ di
¥ dn συν τον αριθµό των πολλαπλασιασµών για τον υπολογισµό των Α1…i και Αi + 1…n
. Εποµένως, αν το Α1…n υπολογίζεται µε βέλτιστο τρόπο, και τα Α1…i και Αi + 1…n πρέ-
πει να υπολογίζονται µε βέλτιστο τρόπο. ∆ιαφορετικά, αν υπήρχε καλύτερος τρόπος
υπολογισµού για κάποιο από τα Α1…i και Αi + 1…n, θα χρησιµοποιούσαµε αυτόν τον τρόπο
για να βελτιώσουµε τον αριθµό των πολλαπλασιασµών στον υπολογισµό του Α1…n.
Για παράδειγµα, ας θεωρήσουµε πάλι το στιγµιότυπο που αποτελείται από τέσσερις
πίνακες Α1, Α2, Α3, και Α4, διαστάσεων 13 ¥ 5, 5 ¥ 89, 89 ¥ 3 και 3 ¥ 34. Είδαµε ότι
η βέλτιστη λύση για αυτό το στιγµιότυπο διαιρεί την ακολουθία στη θέση 3, υπολο-
γίζοντας πρώτα το Α1…3 και, στη συνέχεια, το Α1…3 Α4. Ο υπολογισµός του Α1…3 Α4
απαιτεί 1.326 πολλαπλασιασµούς στοιχείων, ενώ υπάρχουν δύο τρόποι να υπολογι-
σθεί το Α1…3. Ο πρώτος είναι Α1…2 Α3 και απαιτεί 9.256 πολλαπλασιασµούς στοιχεί-
94 K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™
ων, ενώ ο δεύτερος είναι Α1Α2…3 και απαιτεί 1.530 πολλαπλασιασµού στοιχείων. Η
λύση που χρησιµοποιεί τον πρώτο τρόπο υπολογίζει (Α1…2Α3)Α4 εκτελώντας 10.582
πολλαπλασιασµούς στοιχείων. Η βέλτιστη λύση χρησιµοποιεί τον βέλτιστο τρόπο
για τον υπολογισµό του Α1….3, ο οποίος είναι ο δεύτερος, και υπολογίζει το (Α1 Α2…3)Α4
εκτελώντας 2.856 πολλαπλασιασµούς στοιχείων.
Κάθε βέλτιστη λύση για ένα στιγµιότυπο περιέχει / αποτελείται από τις βέλτιστες
λύσεις συγκεκριµένων επιµέρους στιγµιότυπων. Αυτό ονοµάζεται ιδιότητα βέλτι-
στων επιµέρους δοµών (optimal substructure) ή αρχή των βέλτιστων επιµέρους λύσε-
ων (principle of optimality) και αποτελεί µια χαρακτηριστική ιδιότητα των προβλη-
µάτων στα οποία εφαρµόζεται ο δυναµικός προγραµµατισµός.
Το επόµενο βήµα είναι, εκµεταλλευόµενοι την ιδιότητα των βέλτιστων επιµέρους
δοµών, να διατυπώσουµε µια αναδροµική εξίσωση που θα περιγράφει τη βέλτιστη
λύση. Έστω m[i, j] ο ελάχιστος αριθµός πολλαπλασιασµών στοιχείων που απαιτού-
νται για τον υπολογισµό του γινοµένου Αi…j. Προφανώς, για κάθε 1 £ i £ n, m[i, i] =
0, αφού Αi…i = Ai που είναι ένας µεµονωµένος πίνακας. Η ιδιότητα των βέλτιστων
επιµέρους δοµών υποδεικνύει ότι ο βέλτιστος υπολογισµός του Αi..j γίνεται υπολο-
γίζοντας τα Ai…k και Ak + 1…j, για κάποιο i £ k < j, µε βέλτιστο τρόπο και πολλαπλα-
σιάζοντας τα επιµέρους γινόµενα Αi..kAk + 1…j. Εποµένως,
m[i,j] = m[j,k] + m[k + 1, j] + di–1dkdj .
Επειδή δεν γνωρίζουµε το σηµείο k στο οποίο πρέπει να διαιρέσουµε την ακολου-
θία πινάκων Ai, …, Aj, και υπάρχουν µόνο j – i πιθανές τιµές για το k (k = i, i + 1, …,
j – 1), µπορούµε να υπολογίσουµε το m[i, j] για όλες τις τιµές του k και να διαλέ-
ξουµε την καλύτερη. ∆ηλαδή, ο βέλτιστος αριθµός πολλαπλασιασµών στοιχείων m[i,
j] για τον υπολογισµό του Αi…j δίνεται από την αναδροµική εξίσωση:
ÏÔ0 αν i = j
m[i, j] = Ì
min{m[i, k ] + m[ k + 1, j] + di -1d k d j } αν i < j
ÔÓi £ k < j
Το ζητούµενο είναι ο υπολογισµός του m[1, n], δηλαδή του ελάχιστου αριθµού πολ-
λαπλασιασµών στοιχείων που απαιτούνται για τον υπολογισµό του γινοµένου Α1…n.
Ο υπολογισµός του m[1, n] απαιτεί τον υπολογισµό των ποσοτήτων m[i, j], για όλες
n(n +1)
τις τιµές 1 £ i < j £ n. ∆ηλαδή έχουµε να λύσουµε επιµέρους προβλήµατα,
2
καθένα από τα οποία µπορεί να λυθεί σε γραµµικό χρόνο.
Για να υπολογίσουµε το m[1, n] εφαρµόζουµε τη µέθοδο του δυναµικού προγραµ-
4.1 ¶√§§∞¶§∞™π∞™ª√™ ∞∫√§√À£π∞™ ¶π¡∞∫ø¡ 95
¢Ú·ÛÙËÚÈfiÙËÙ· 4.1
¢Ú·ÛÙËÚÈfiÙËÙ· 4.2
Στην προηγούµενη ενότητα είδαµε ότι ένα από τα χαρακτηριστικά των προβληµά-
των στα οποία εφαρµόζεται ο δυναµικός προγραµµατισµός είναι η ιδιότητα των βέλ-
τιστων επιµέρους δοµών. Ο αναδροµική εξίσωση περιγραφής της βέλτιστης λύσης,
συνήθως, βασίζεται στην ιδιότητα των βέλτιστων επιµέρους δοµών. Έτσι, η ύπαρ-
ξη της ιδιότητας των βέλτιστων επιµέρους δοµών για ένα πρόβληµα αποτελεί ικα-
νοποιητική ένδειξη ότι ο δυναµικός προγραµµατισµός εφαρµόζεται σε αυτό.
Ένα άλλο χαρακτηριστικό των προβληµάτων στα οποία εφαρµόζεται ο δυναµικός
προγραµµατισµός, είναι ο σχετικά µικρός αριθµός των διαφορετικών επιµέρους προ-
βληµάτων, τα οποία εµφανίζονται κατά την εφαρµογή της µεθόδου. Με τον όρο
«σχετικά µικρός», συνήθως, εννοούµε έναν αριθµό επιµέρους προβληµάτων που
φράσσεται άνω από κάποιο πολυώνυµο του µεγέθους της εισόδου, δηλαδή είναι
Ο(nd), δια κάποια σταθερά d > 0. Όταν ένας αναδροµικός, «διαίρει και βασίλευε»
αλγόριθµος, αντί να δηµιουργεί συνεχώς νέα επιµέρους προβλήµατα, δηµιουργεί και
λύνει τα ίδια επιµέρους προβλήµατα, πολλές φορές, λέµε ότι το πρόβληµα περιέχει
επικαλυπτόµενα επιµέρους προβλήµατα (overlapping subproblems). Σε αντίθεση µε
τον αναδροµικό αλγόριθµο, ο δυναµικός προγραµµατισµός εκµεταλλεύεται την ιδιό-
τητα των επικαλυπτόµενων προβληµάτων, λύνοντας κάθε επιµέρους πρόβληµα ακρι-
βώς µία φορά και αποθηκεύοντας τις λύσεις για µελλοντική αναφορά. Εποµένως,
όταν ο αριθµός των διαφορετικών επιµέρους προβληµάτων είναι µικρός, και υπάρ-
χουν επικαλυπτόµενα επιµέρους προβλήµατα, τότε είναι πολύ πιθανόν η εφαρµογή
του δυναµικού προγραµµατισµού να δώσει έναν αποδοτικό αλγόριθµο.
4 . 2 à ∞ ƒ ∞ ∫ ∆ ∏ ƒ π ™ ∆ π ∫ ∞ ∆ √ À ¢ À ¡ ∞ ª π ∫ √ À ¶ ƒ √ ° ƒ∞ ª ª ∞ ∆ π ™ ª √ À 97
Το πρόβληµα του πολλαπλασιασµού ακολουθίας πινάκων έχει την ιδιότητα των επι-
καλυπτόµενων επιµέρους προβληµάτων. Το Σχήµα 4.1 δείχνει τις παραµέτρους i και
j των κλήσεων του αναδροµικού αλγορίθµου της ∆ραστηριότητας 4.2 για n = 4.
Παρατηρήστε ότι τα προβλήµατα που σηµειώνονται µε γκρίζο χρώµα έχουν ήδη
λυθεί σε προηγούµενες κλήσεις του αλγορίθµου. Στην περίπτωση του δυναµικού
προγραµµατισµού, αυτές οι κλήσεις αντικαθιστώνται από την απλή ανάγνωση µιας
θέσης στον πίνακα των επιµέρους λύσεων.
1...4
2...2 3...4 2...3 4...4 1...1 2...2 3...3 4...4 1...1 2...3 1...2 3...3
™¯‹Ì· 4.1
Είναι συχνά δυνατόν να συνδυαστεί η αποδοτικότητα του δυναµικού προγραµµατι-
Οι κλήσεις
σµού µε την ευκολία στο σχεδιασµό που προσφέρει η µέθοδος «διαίρει και βασί-
του αναδροµικού
λευε», η οποία προχωρεί από µεγαλύτερα προς ολοένα µικρότερα επιµέρους προ-
αλγορίθµου
βλήµατα (top – down στρατηγική). Η ιδέα είναι να χρησιµοποιήσουµε έναν πίνακα υπολογισµού
επιµέρους λύσεων, αλλά η στρατηγική για τη συµπλήρωση αυτού του πίνακα να του m[1, 4].
µιµείται την πορεία του αναδροµικού αλγορίθµου. Αρχικά, κάθε στοιχείο του πίνα-
κα περιέχει µία ειδική τιµή, η οποία δηλώνει ότι το αντίστοιχο επιµέρους πρόβληµα
δεν έχει επιλυθεί ακόµη. Όταν ο αναδροµικός αλγόριθµος δηµιουργήσει και επιλύ-
σει το επιµέρους πρόβληµα για πρώτη φορά, αποθηκεύουµε τη λύση στον πίνακα
των επιµέρους λύσεων. Κάθε φορά που εµφανίζεται το ίδιο επιµέρους πρόβληµα,
αντί να το λύσουµε πάλι, όπως θα έκανε ο αναδροµικός αλγόριθµος, ανατρέχουµε
στην αντίστοιχη εγγραφή του πίνακα των επιµέρους λύσεων, σύµφωνα µε τις επι-
ταγές του δυναµικού προγραµµατισµού. Αυτή η τεχνική ονοµάζεται memoization.
Οι παρακάτω διαδικασίες αποτελούν την εφαρµογή αυτής της τεχνικής στο πρό-
βληµα του πολλαπλασιασµού ακολουθίας πινάκων.
MEMOIZED_MATRIX_CHAIN(d[0,...,n])
for i ¨ 1 to n do
for j ¨ 1 to n do
m[i,j] ¨ •;
return LOOKUP_CHAIN(d[0,...,n], 1, n);
98 K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™
LOOKUP_CHAIN(d[i – 1,...,j], i, j)
if m[i,j] < • then return m[i,j];
if i = j then m[i, j] = 0;
else
for k ¨ i to j – 1 do
q ¨ LOOKUP_CHAIN(d[i – 1,...,k], i, k) +
LOOKUP_CHAIN(d[k,...j], k + 1,j) +
d[i – 1]d[k]d[j];
if q < m[i,j] then m[i,j] ¨ q;
return m[i,j];
Η διαδικασία MEMOIZED_MATRIX_CHAIN, όπως και η MATRIX_CHAIN_MULT, χρησιµο-
ποιεί έναν πίνακα επιµέρους λύσεων m[1…n, 1…n], το στοιχείο m[i, j] του οποίου
περιέχει τον ελάχιστο αριθµό πολλαπλασιασµών για τον υπολογισµό του γινοµένου
Αi..j. Η MEMOIZED_MATRIX_CHAIN αρχικοποιεί όλες τις εγγραφές του πίνακα m στην
ειδική τιµή •, και καλεί την αναδροµική διαδικασία LOOKUP_CHAIN, η οποία υπο-
λογίζει τα στοιχεία του πίνακα m. Η LOOKUP_CHAIN λειτουργεί µε τον ίδιο τρόπο
όπως ο αναδροµικός αλγόριθµος της ∆ραστηριότητας 4.2, εκτός τις περιπτώσεις που
εµφανίζονται επιµέρους προβλήµατα, που έχουν εµφανιστεί πάλι στο παρελθόν. Τότε,
η lookup_chain δεν λύνει το πρόβληµα, αλλά επιστρέφει την τιµή της λύσης που δια-
βάζει από την αντίστοιχη θέση του πίνακα επιµέρους λύσεων.
Ο χρόνος εκτέλεσης της διαδικασίας MEMOIZED_MATRIX_CHAIN είναι Ο(n3). Οι Θ(n2)
θέσεις του πίνακα m αρχικοποιούνται από τη διαδικασία MEMOIZED_MATRIX_CHAIN.
Κάθε θέση m[i, j], 1 £ i < j £ n συµπληρώνεται µε την τιµή της αντίστοιχης επιµέ-
ρους λύσης µόνο µία φορά, από την (πρώτη) κλήση της LOOKUP_CHAIN(d[i – 1,…,j],
i, j). Ο χρόνος εκτέλεσης αυτής της κλήσης της LOOKUP_CHAIN είναι Ο(n).
<i1, i2, …, ik> δεικτών της Χ, τέτοια ώστε, για κάθε j = 1, 2, …, k, xi j = z j . Για παρά-
δειγµα, η ακολουθία Ζ = <Β, Γ, ∆, Β> αποτελεί υπακολουθία της Χ = <Α, Β, Γ, Β, ∆,
Α, Β> µε αντίστοιχη ακολουθία δεικτών <2, 3, 5, 7,>.
∆εδοµένων δύο ακολουθιών x και Υ, µια ακολουθία Ζ αποτελεί κοινή υπακολουθία
(common subsequence) των Χ και Υ, αν η Ζ είναι υπακολουθία τόσο της Χ όσο και
της Υ. Για παράδειγµα, αν Χ = <Α, Β, Γ, Β, ∆, Α, Β> και Υ = <Β, ∆, Γ, Α, Β, Α>, η ακο-
λουθία Ζ = <Β, Γ, Α> είναι µία κοινή υπακολουθία των Χ και Υ. Όµως, η ακολουθία
Ζ δεν είναι η µεγαλύτερη κοινή υπακολουθία των Χ και Υ, αφού έχει µήκος 3, ενώ η
ακολουθία Ζ¢ = <Β, Γ, Β, Α> είναι επίσης κοινή υπακολουθία των Χ και Υ και έχει
µήκος 4. Η ακολουθία Ζ¢ είναι η µεγαλύτερη κοινή υπακολουθία των Χ και Υ, αφού
δεν υπάρχει κοινή υπακολουθία των Χ και Υ µε µήκος µεγαλύτερο ή ίσο του 5.
Το πρόβληµα της µεγαλύτερης κοινής υπακολουθίας είναι, δεδοµένων δύο ακολου-
θιών Χ = <x1, x2, …, xn> και Υ = <y1, y2, …, ym>, να βρεθεί µια µεγίστου µήκους,
κοινή υπακολουθία των Χ και Υ. Η µεγαλύτερη κοινή υπακολουθία των x και Υ συµ-
βολίζεται µε LCS(X, Y), ενώ το µήκος της συµβολίζεται µε |LCS(X, Y)|. Από τον ορι-
σµό, γίνεται φανερό ότι το πρόβληµα της µεγαλύτερης κοινής υπακολουθίας είναι
ένα πρόβληµα βελτιστοποίησης.
Μία απλοϊκή προσέγγιση στο πρόβληµα είναι να παράγουµε, µε κάποιο συστηµατι-
κό τρόπο, όλες τις υπακολουθίες της Χ, να ελέγξουµε ποιες από αυτές είναι υπακο-
λουθίες της Υ και να επιστρέψουµε αυτή µε το µεγαλύτερο µήκος. Υπάρχουν ακρι-
βώς 2n υπακολουθίες της Χ, εποµένως, αυτή η προσέγγιση απαιτεί εκθετικό χρόνο.
Επιδιώκοντας να εφαρµόσουµε τη µέθοδο του δυναµικού προγραµµατισµού σε αυτό
το πρόβληµα, θα προσπαθήσουµε να χαρακτηρίσουµε τη δοµή µιας βέλτιστης λύσης.
Έστω Ζ = <z1, z2, …, zk> µία βέλτιστη κοινή υπακολουθία των x και Υ. Αν τα τελευ-
ταία στοιχεία των ακολουθιών x και Y ταυτίζονται, δηλαδή xn = ym, το τελευταίο στοι-
χείο της Ζ θα είναι zk = xn = ym και, ενώ τα υπόλοιπα στοιχεία της Ζ θα είναι τα στοι-
χεία της LCS(Χn – 1, Υm – 1), όπου Xn – 1 και Ym – 1 είναι τα προθέµατα µήκους n – 1 και
m – 1 των ακολουθιών x και Υ, αντίστοιχα.
Αν τα στοιχεία xn και ym είναι διαφορετικά, τότε το xn ή το ym δεν θα συµπεριληφθεί
στην κοινή υπακολουθία Ζ. Σε αυτή την περίπτωση, η κοινή υπακολουθία Ζ θα είναι
η µεγαλύτερη σε µήκος από τις LCS(Χn – 1, Υ), και LCS(X, Ym – 1). ∆ηλαδή, µη ξέρο-
ντας ποιο από τα xn και ym δεν θα συµπεριληφθεί στην Ζ, δοκιµάζουµε και τις δύο
περιπτώσεις και κρατάµε την καλύτερη.
Βλέπουµε ότι το πρόβληµα της µεγαλύτερης κοινής υπακολουθίας έχει την ιδιότη-
100 K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™
τα των βέλτιστων επιµέρους δοµών, αφού κάθε βέλτιστη λύση για το στιγµιότυπο
(Χ, Υ) περιέχει τη βέλτιστη λύση ενός από τα επιµέρους στιγµιότυπα (Xn – 1, Ym – 1),
(Χn – 1, Y) ή (X, Ym – 1).
Για παράδειγµα, έστω οι ακολουθίες Χ = <Α, Β, Γ, ∆, Ε> και Υ = <Β, ∆, Ε, Α>. Θα
προσπαθήσουµε να καταλήξουµε στη βέλτιστη λύση εφαρµόζοντας την ιδιότητα των
βέλτιστων επιµέρους δοµών. Τα τελευταία στοιχεία των Χ και Υ είναι διαφορετικά,
άρα, η βέλτιστη κοινή υπακολουθία τους θα είναι η µεγαλύτερη από τις βέλτιστες
κοινές υπακολουθίες των στιγµιότυπων (Χ4 = <Α, Β, Γ, ∆>, Υ) και (Χ, Υ3 = <Β, ∆,
Ε>.) Το τελευταίο στοιχείο του δεύτερου ζευγαριού είναι κοινό, άρα, η βέλτιστη
κοινή υπακολουθία των <Α, Β, Γ, ∆, Ε> και <Β, ∆, Ε> θα έχει τελευταίο στοιχείο το
Ε, και πρόθεµα τη βέλτιστη κοινή υπακολουθία των <Α, Β, Γ, ∆> και <Β, ∆>. Οι κοι-
νές υπακολουθίες των <Α, Β, Γ, ∆> και <Β, ∆> είναι οι < > (κενή), <Β>, <∆> και <Β,
∆>. Είναι προφανές ότι, επιλέγοντας κάποια από τις < >, <Β> ή <∆>, αποµακρυνό-
µαστε από την περίπτωση να καταλήξουµε σε βέλτιστη λύση για το αρχικό στιγµιό-
τυπο. Επιλέγοντας τη <Β, ∆>, η οποία είναι η βέλτιστη κοινή υπακολουθία για το
στιγµιότυπο (<Α, Β, Γ, ∆>, <Β, ∆>), καταλήγουµε στην <Β, ∆, Ε>, που είναι η βέλ-
τιστη κοινή υπακολουθία των <Α, Β, Γ, ∆, Ε> και <Β, ∆, Ε>. Η <Β, ∆, Ε> είναι και
η µεγαλύτερη κοινή υπακολουθία των Χ και Υ.
Με βάση τις παραπάνω παρατηρήσεις µπορούµε να διατυπώσουµε την αναδροµική
εξίσωση που δίνει το µήκος της µεγαλύτερης κοινής υπακολουθίας των x και Υ. Έστω
c[i, j] το µήκος της µεγαλύτερης κοινής υπακολουθίας των ακολουθιών Xi και Yj.
Προφανώς, αν κάποια από τις Xi,Yj είναι κενή, κάθε κοινή υπακολουθία τους θα είναι
κενή και c[i, j] = 0. Εποµένως, τα στοιχεία c[i, j], i = 1, 2, …, n, j = 1, 2, …, m, δίνο-
νται από την αναδροµική εξίσωση:
Ï0 αν i = 0 ή j = 0
Ô
c[i, j] = Ìc[i - 1, j - 1] + 1 αν i, j > 0 κ αι xi = y j
Ômax{ c[i, j - 1], c[i - 1, j]} αν i, j > 0 κ αι x π y
Ó i j
¢Ú·ÛÙËÚÈfiÙËÙ· 4.3
Παρατηρούµε ότι, στην περίπτωση xi π yj, η τιµή της θέσης c[i, j] εξαρτάται από τις
τιµές των c[i, j – 1] και c[i – 1, j]. Ακόµη, αν xi π yj – 1και xi – 1 π yj, οι τιµές των θέσε-
ων c[i, j – 1] και c[i – 1, j] εξαρτώνται από την τιµή της θέσης c[i – 1, j – 1].
4 . 3 ª ∂ °∞ § À ∆ ∂ ƒ ∏ ∫ √ π ¡ ∏ À ¶ ∞ ∫ √ § √ À £ π ∞ 101
¢Ú·ÛÙËÚÈfiÙËÙ· 4.4
Η διαδικασία LCS – LENGTH επιστρέφει το µήκος της µεγαλύτερης κοινής υπό – ακο-
λουθίας δύο ακολουθιών Χ και Υ, µήκους n και m, αντίστοιχα. Ο χρόνος εκτέλεσης
της διαδικασίας LCS – LENGTH είναι Θ(nm), αφού ο πίνακας c[1 … n, 1 … m] έχει
nm στοιχεία, και κάθε στοιχείο του υπολογίζεται µόνο µία φορά, σε Θ(1) χρόνο.
Επίσης, ο αριθµός των θέσεων µνήµης που απαιτεί η διαδικασία LCS – LENGTH είναι
Θ(nm), αφού υπολογίζει όλα τα nm στοιχεία του πίνακα c[1 … n, 1 … m]. Παρατη-
ρούµε όµως ότι, καθώς η LCS – LENGTH υπολογίζει τα στοιχεία c[i, j] κατά γραµµές
(i = 1, 2, …, n), ο υπολογισµός κάθε στοιχείου c[i, j] χρησιµοποιεί στοιχεία είτε της
ίδιας (c[i, j – 1]), είτε της προηγούµενης γραµµής (c[i – 1, j] και c[i – 1, j – 1]). Επο-
µένως, προκειµένου για τον υπολογισµό του στοιχείου c[n, m], σε κάθε επανάληψη
102 K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™
¢Ú·ÛÙËÚÈfiÙËÙ· 4.5
™‡ÓÔ„Ë
Σε αυτό το κεφάλαιο παρουσιάσαµε τη µέθοδο του δυναµικού προγραµµατισµού για
την επίλυση προβληµάτων βελτιστοποίησης. Ένα πρόβληµα βελτιστοποίησης δέχεται
πολλές διαφορετικές λύσεις, σε καθεµία από τις αντιστοιχεί µία τιµή. Το ζητούµενο
είναι ο υπολογισµός της λύσης µε την βέλτιστη τιµή.
Η µέθοδος του δυναµικού προγραµµατισµού επιλύει ένα πρόβληµα βελτιστοποίησης
συνδυάζοντας τις βέλτιστες λύσεις κατάλληλα επιλεγµένων επιµέρους προβληµάτων.
Ο δυναµικός προγραµµατισµός εφαρµόζεται σε προβλήµατα µε την ιδιότητα των βέλ-
τιστων επιµέρους δοµών, όπου κάθε βέλτιστη λύση περιέχει τις βέλτιστες λύσεις
συγκεκριµένων επιµέρους προβληµάτων. Αυτή η ιδιότητα επιτρέπει τη διατύπωση της
αναδροµικής εξίσωσης για το κόστος µιας βέλτιστης λύσης. Η αναδροµική εξίσωση
αποτελεί τη βάση του αλγορίθµου δυναµικού προγραµµατισµού.
Ο αλγόριθµος δυναµικού προγραµµατισµού υπολογίζει µε bottom – up τρόπο όλες
τις τιµές της συνάρτησης που περιγράφεται από την αναδροµική εξίσωση, µέχρι να
φτάσει στην τιµή που αντιστοιχεί στην βέλτιστη λύση. Ένας αλγόριθµος δυναµικού
προγραµµατισµού πλεονεκτεί σηµαντικά σε χρόνο εκτέλεσης ενός αλγορίθµου «διαί-
ρει και βασίλευε», ο οποίος υπολογίζει µε top – down τρόπο την ίδια συνάρτηση, όταν
το πρόβληµα έχει την ιδιότητα των επικαλυπτόµενων επιµέρους προβληµάτων. Σε
αυτή την περίπτωση, ο δυναµικός προγραµµατισµός επιλύει κάθε διαφορετικό επι-
µέρους πρόβληµα µία φορά και αποθηκεύει τη λύση για µελλοντική αναφορά, ενώ ο
αλγόριθµος «διαίρει και βασίλευε» επιλύει κάθε επιµέρους πρόβληµα πολλές φορές.
Μερικές φορές χρησιµοποιούµε memoized αλγόριθµους, οι οποίοι συνδυάζουν τον top
– down τρόπο υπολογισµού µιας αναδροµικής εξίσωσης µε την αποθήκευση των λύσε-
ων των επιµέρους προβληµάτων, ώστε κάθε πρόβληµα να λυθεί µία και µόνη φορά.
104 K E º A § A I O 4 : ¢ À ¡ ∞ ª π ∫ √ ™ ¶ ƒ √ ° ƒ∞ ª ª ∞∆ π ™ ª √ ™
µÈ‚ÏÈÔÁÚ·Ê›·
™ÎÔfi˜
∫ ∂
Σκοπός αυτού του κεφαλαίου είναι η παρουσίαση της µεθόδου της απληστίας για το
σχεδιασµό αποδοτικών αλγορίθµων επίλυσης προβληµάτων βελτιστοποίησης. Η
παρουσίαση βασίζεται σε παραδείγµατα άπληστων αλγορίθµων, και η έµφαση δίνε-
ται στα χαρακτηριστικά των προβληµάτων βελτιστοποίησης που επιτρέπουν την επι-
5
º ∞ § ∞ π √
τυχηµένη εφαρµογή της µεθόδου της απληστίας και στην τεχνική µε την οποία απο-
δεικνύεται η ορθότητα των άπληστων αλγορίθµων.
¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·
• Να αποδείξει ότι ένα πρόβληµα έχει την ιδιότητα της άπληστης επιλογής.
• Να αποδείξει ότι ένας άπληστος αλγόριθµος υπολογίζει τη βέλτιστη λύση ενός προ-
βλήµατος.
ŒÓÓÔȘ ÎÏÂȉȿ
• µέθοδος απληστίας • απόδειξη ορθότητας
• ιδιότητα άπληστης επιλογής • Κκώδικας Huffman
∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Οι αλγόριθµοι για προβλήµατα βελτιστοποίησης συνήθως λειτουργούν σε βήµατα, κάνο-
ντας ορισµένες επιλογές που σχετίζονται µε τη µορφή της βέλτιστης λύσης σε κάθε βήµα.
Στο δυναµικό προγραµµατισµό οι επιλογές βασίζονται στις βέλτιστες λύσεις επιµέρους
στιγµιότυπων, γι΄ αυτό και µερικές φορές καταναλώνεται πολύ περισσότερος υπολογι-
στικός χρόνος από όσον πραγµατικά απαιτείται για να γίνουν οι βέλτιστες επιλογές.
Ένας άπληστος αλγόριθµος (greedy algorithm) πάντα επιλέγει αυτό, που µε βάση την
τρέχουσα κατάσταση, δείχνει καλύτερο. ∆ηλαδή, ένας άπληστος αλγόριθµος κάνει
τοπικά βέλτιστες επιλογές, ελπίζοντας ότι αυτή η στρατηγική θα οδηγήσει σε µια συνο-
λικά βέλτιστη λύση.
106 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
Αν και για µερικά προβλήµατα είναι επιτυχηµένη, η στρατηγική των τοπικά βέλτιστων
επιλογών δεν οδηγεί στις βέλτιστες λύσεις για αρκετά προβλήµατα. Η επιτυχία της
εφαρµογής της µεθόδου της απληστίας βασίζεται στην ύπαρξη των ιδιοτήτων της
άπληστης επιλογής (greedy – choice property) και των βέλτιστων επιµέρους δοµών
(optimal substructure). Η ιδιότητα της άπληστης επιλογής εξασφαλίζει ότι οι τοπικά
βέλτιστες επιλογές µπορούν να οδηγήσουν σε µια βέλτιστη λύση, ενώ η ιδιότητα των
βέλτιστων επιµέρους δοµών πρέπει να ισχύει για τα επιµέρους προβλήµατα που δηµι-
ουργούνται από τις τοπικά βέλτιστες επιλογές.
Οι άπληστοι αλγόριθµοι είναι συνήθως απλοί στη σύλληψη, εύκολοι στο σχεδιασµό
και ιδιαίτερα αποδοτικοί από πλευράς υπολογιστικών απαιτήσεων (π.χ. χρόνος εκτέ-
λεσης, αριθµός θέσεων µνήµης). Το δυσκολότερο κοµµάτι της ανάλυσης είναι η από-
δειξη ότι ο άπληστος αλγόριθµος πραγµατικά καταλήγει σε µία βέλτιστη λύση.
Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες:
5.1. Επιλογή ανταγωνιστικών δραστηριοτήτων
5.2. Χαρακτηριστικά µεθόδου της απληστίας
5.3. Συµπίεση δεδοµένων – κώδικας Huffman
5 . 1 ∂ ¶ π § √ ° ∏ ∞ ¡ ∆∞ ° ø ¡ π ™ ∆ π ∫ ø ¡ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 107
Θα ξεκινήσουµε παρουσιάζοντας µια εφαρµογή της µεθόδου της απληστίας για την
επίλυση ενός απλού προβλήµατος επιλογής / δροµολόγησης δραστηριοτήτων, οι
οποίες ανταγωνίζονται για την πρόσβαση σε έναν κοινόχρηστο πόρο.
Στην απλούστερή του µορφή, ένα πρόβληµα επιλογής δραστηριοτήτων (activity
selection problem) αποτελείται από ένα σύνολο δραστηριοτήτων Α = {1, 2, …, n},
όπου κάθε δραστηριότητα i αρχίζει τη χρονική στιγµή si και ολοκληρώνεται τη χρο-
νική στιγµή fi, fi ≥ si ≥ 0. Όλες οι δραστηριότητες του συνόλου Α απαιτούν τη χρήση
ενός κοινόχρηστου πόρου (π.χ. επεξεργαστή για υπολογιστικές διεργασίες, αίθου-
σας διδασκαλίας για µαθήµατα) για να εκτελεστούν. Άρα, το πολύ µία δραστηριό-
τητα µπορεί να βρίσκεται σε εξέλιξη κάθε χρονική στιγµή. Θεωρούµε ότι κάθε δρα-
στηριότητα i έχει αρχίσει τη χρονική στιγµή si, και έχει ολοκληρωθεί µέχρι τη χρο-
νική στιγµή fi, δηλαδή απαιτεί δέσµευση του πόρου κατά το ανοικτό δεξιά, χρονικό
διάστηµα [ si, fi). ∆ύο δραστηριότητες i και j καλούνται συµβατές (compatible) όταν
τα διαστήµατα [ si, fi) και [ sj, fj) δεν επικαλύπτονται, δηλαδή ισχύει si ≥ fj ή sj ≥ fi.
Στο πρόβληµα επιλογής δραστηριοτήτων που θα µελετήσουµε, θέλουµε να υπολο-
γίσουµε ένα σύνολο αµοιβαία συµβατών δραστηριοτήτων µεγίστου µεγέθους, δηλα-
δή, δεδοµένου του µοναδικού κοινόχρηστου πόρου, θέλουµε να µεγιστοποιήσουµε
το σύνολο των δραστηριοτήτων που θα εκτελεσθεί.
Ένας τυπικός άπληστος αλγόριθµος για το πρόβληµα επιλογής δραστηριοτήτων θα
λειτουργεί σε βήµατα, επιλέγοντας / δροµολογώντας µία δραστηριότητα σε κάθε
βήµα. Ο αλγόριθµος θα διατηρεί ένα σύνολο C µε τις δραστηριότητες που έχουν επι-
λεγεί, το οποίο αρχικά θα είναι κενό. Σε κάθε βήµα, θα επιλέγει από το A / C µια δρα-
στηριότητα που είναι συµβατή µε όλες τις δραστηριότητες του C και µοιάζει καλύ-
τερη µε βάση την τρέχουσα κατάσταση. Η επιλεγµένη δραστηριότητα θα προστίθε-
ται στο C και ο αλγόριθµος θα συνεχίζει ενόσω το A / C περιέχει δραστηριότητες
που είναι συµβατές µε αυτές του C.
Αν και υπάρχουν διάφορα κριτήρια µε τα οποία ο άπληστος αλγόριθµος µπορεί να
επιλέξει την «καλύτερη» δραστηριότητα, ο αντικειµενικός σκοπός είναι η δραστη-
ριότητα που θα επιλεγεί να µην κάνει κατάχρηση του κοινόχρηστου πόρου, ώστε να
επιτρέπει και σε άλλες δραστηριότητες να εκτελεσθούν. Με βάση αυτόν τον στόχο,
κάποιος µπορεί να επιλέγει τη δραστηριότητα µε τη µικρότερη διάρκεια (fi – si),
κάποιος άλλος αυτή που ξεκινάει νωρίτερα (µικρότερος χρόνος έναρξης si), ενώ
κάποιος τρίτος τη δραστηριότητα που απελευθερώνει τον κοινόχρηστο πόρο νωρί-
τερα, δηλαδή έχει το µικρότερο χρόνο ολοκλήρωσης fi. Ένα άλλο κριτήριο θα µπο-
108 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
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
του αλγορίθµου είναι η επιλογή ενός συνόλου τεσσάρων αµοιβαία συµβατών δρα-
στηριοτήτων, οι οποίες µπορούν να δροµολογηθούν όπως φαίνεται στο Σχήµα 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
Από τις τέσσερις παραλλαγές άπληστων αλγορίθµων για το πρόβληµα της επιλογής
δραστηριοτήτων, είδαµε (∆ραστηριότητα 5.1) ότι οι τρεις δεν πετυχαίνουν πάντα στον
υπολογισµό µιας βέλτιστης λύσης. Γενικότερα, υπάρχουν πολλά παραδείγµατα άπλη-
στων αλγορίθµων που δεν εγγυώνται τον υπολογισµό µιας βέλτιστης λύσης. Έτσι,
όταν πιστεύουµε ότι ένας άπληστος αλγόριθµος καταφέρνει, για κάθε στιγµιότυπο
εισόδου, να υπολογίσει µια βέλτιστη λύση πρέπει να τεκµηριώνουµε αυτό το γεγο-
νός µε µία µαθηµατική απόδειξη, η οποία συχνά καλείται απόδειξη ορθότητας.
Στη συνέχεια, θα αποδείξουµε ότι ο αλγόριθµος GREEDY – SELECTION, ο οποίος σε
κάθε βήµα επιλέγει τη δραστηριότητα µε τον µικρότερο χρόνο ολοκλήρωσης, υπο-
λογίζει πάντα µία βέλτιστη λύση για το πρόβληµα επιλογής δραστηριοτήτων.
110 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
Η παραπάνω επαγωγική µορφή απόδειξης είναι τυπική για τις αποδείξεις ορθότητας
άπληστων αλγορίθµων. Αρχικά, αποδεικνύουµε ότι πάντα υπάρχει µία βέλτιστη λύση
η οποία περιέχει το τοπικά βέλτιστο στοιχείο που επιλέγει ο άπληστος αλγόριθµος
(ιδιότητα άπληστης επιλογής). Στη συνέχεια, δείχνουµε ότι, δεδοµένης της άπληστης
επιλογής, ο αλγόριθµος αποµένει να υπολογίσει τη βέλτιστη λύση ενός επιµέρους στιγ-
µιότυπου του ίδιου προβλήµατος (ιδιότητα βέλτιστων επιµέρους δοµών). Η απόδειξη
ολοκληρώνεται µε επαγωγική εφαρµογή της ιδιότητας της βέλτιστης επιλογής στα επι-
µέρους στιγµιότυπα που προκύπτουν από κάθε βήµα του άπληστου αλγορίθµου.
Μερικές φορές είναι ευκολότερο οι αποδείξεις ορθότητας να διατυπώνονται συγκρί-
νοντας τα στοιχεία µιας βέλτιστης λύσης µε τη λύση που υπολογίζει ο άπληστος
αλγόριθµος. Συγκεκριµένα, έστω µία βέλτιστη λύση 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
Ένα πρόβληµα έχει την ιδιότητα της άπληστης επιλογής (greedy choice property) όταν
µια ακολουθία επιλογών, οι οποίες είναι τοπικά βέλτιστες (άπληστες) ως προς κάποιο
κριτήριο, µπορεί να αποτελέσει µία βέλτιστη λύση.
Εδώ εντοπίζεται η βασική διαφορά του δυναµικού προγραµµατισµού από τη µέθο-
δο της απληστίας. Στο δυναµικό προγραµµατισµό, ο αλγόριθµος κάνει µια επιλογή
σε κάθε βήµα, αλλά η επιλογή βασίζεται στις τιµές των βέλτιστων λύσεων κάποιων
επιµέρους προβληµάτων. ∆ηλαδή, ένας αλγόριθµος δυναµικού προγραµµατισµού
πρώτα επιλύει όλα τα διαφορετικά επιµέρους προβλήµατα και, στη συνέχεια, κάνει
τις επιλογές του συγκρίνοντας αυτές τις λύσεις.
Αντίθετα, ένας άπληστος αλγόριθµος πρώτα διαλέγει αυτό που φαίνεται καλύτερο
µε βάση την τρέχουσα κατάσταση και κάποιο συγκεκριµένο κριτήριο και, στη συνέ-
χεια, επιλύει το επιµέρους πρόβληµα που προκύπτει από την επιλογή του. Μια επι-
λογή ενός άπληστου αλγορίθµου µπορεί να εξαρτάται από τις µέχρι τώρα επιλογές,
οι οποίες διαµορφώνουν την τρέχουσα κατάσταση, αλλά δεν µπορεί να εξαρτάται
από τις επιλογές ή τις λύσεις των επιµέρους προβληµάτων που θα προκύψουν στο
5 . 2 à ∞ ƒ∞ ∫ ∆ ∏ ƒ π ™ ∆ π ∫ ∞ ∆ ∏ ™ ª ∂ £ √ ¢ √ À ∆ ∏ ™ ∞ ¶ § ∏ ™ ∆ π ∞ ™ 113
Στο προηγούµενο κεφάλαιο είδαµε ότι η ιδιότητα των βέλτιστων επιµέρους δοµών
(optimal substructure property) ισχύει όταν η βέλτιστη λύση ενός στιγµιότυπου περιέ-
χει τις βέλτιστες λύσεις συγκεκριµένων επιµέρους στιγµιότυπων. Όπως και στην
περίπτωση του δυναµικού προγραµµατισµού, η ιδιότητα των βέλτιστων επιµέρους
δοµών είναι απαραίτητο συστατικό για την επιτυχία της άπληστης στρατηγικής, αφού
ο άπληστος αλγόριθµος εφαρµόζει τον εαυτό του για να λύσει τα επιµέρους στιγ-
µιότυπα που προκύπτουν σε κάθε βήµα από την τοπικά βέλτιστη επιλογή.
Για παράδειγµα, στην περίπτωση του Θεωρήµατος 5.1, αποδείξαµε ότι αν C* είναι
µία βέλτιστη λύση που περιέχει τη δραστηριότητα 1 µε το µικρότερο χρόνο ολο-
κλήρωσης f1, τότε το C* \ {1} είναι µία βέλτιστη λύση στο στιγµιότυπο A1 = {i Œ A:
si ≥ f1} που αποτελείται από όλες τις δραστηριότητες που είναι συµβατές µε την 1.
Επειδή τόσο ο δυναµικός προγραµµατισµός όσο και η µέθοδος της απληστίας εκµε-
ταλλεύονται την ιδιότητα των βέλτιστων επιµέρους δοµών για την επίλυση ενός προ-
βλήµατος, υπάρχουν περιπτώσεις που λανθασµένα µπορεί να θεωρήσουµε ότι είτε
χρειάζεται δυναµικός προγραµµατισµός για την επίλυση ενός προβλήµατος που λύνε-
ται και από έναν αποδοτικότερο άπληστο αλγόριθµο (βλέπε ∆ραστηριότητα 5.2),
είτε ένας άπληστος αλγόριθµος αρκεί για την επίλυση ενός προβλήµατος που απαι-
τεί την εφαρµογή δυναµικού προγραµµατισµού. Σε τέτοιες περιπτώσεις, η ιδιότητα
της άπληστης επιλογής διευκολύνει στην επιλογή µεταξύ δυναµικού προγραµµατι-
σµού και απληστίας.
114 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
 Â
n n
της συλλογής είναι p( A) = f i pi , ενώ το µέγεθός της είναι s( A) = f i si , και
i =1 i =1
πρέπει s(A) £ B.
Έστω ότι µία βέλτιστη λύση A0*-1 για την 0 – 1 παραλλαγή του προβλήµατος, και
έστω κάποιο αντικείµενο j Œ A0*-1 , 1 £ j £ n, που έχει συµπεριληφθεί στο σακίδιο
από αυτή τη βέλτιστη λύση. Αν αποµακρύνουµε το αντικείµενο j, το σύνολο
A0*-1 /{ j} θα είναι µία βέλτιστη λύση για το επιµέρους στιγµιότυπο που αποτελεί-
ται από σακίδιο µεγέθους B – sj και τα n – 1 αντικείµενα που αποµένουν µετά την
αποµάκρυνση του j.
*
Επίσης, έστω µία βέλτιστη λύση Af για το κλασµατικό πρόβληµα του σακιδίου, και
έστω fj το ποσοστό συµµετοχής ενός αντικειµένου j, 1 £ j £ n, στο σακίδιο που αντι-
*
στοιχεί στην Af . Αν αποµακρύνουµε τις fjsj µονάδες του αντικειµένου j, το
A*f /{ j} αποτελεί µία βέλτιστη λύση για το επιµέρους στιγµιότυπο που αποτελεί-
ται από σακίδιο µεγέθους B – fjsj, τα n – 1 αντικείµενα που αποµένουν µετά την απο-
µάκρυνση του j, και, στη θέση του j, ένα αντικείµενο µεγέθους (1 – fj)sj και αξίας
(1 – fj)pj.
Εποµένως, και οι δύο παραλλαγές του προβλήµατος του σακιδίου έχουν την ιδιότη-
τα των βέλτιστων επιµέρους δοµών, αφού κάθε βέλτιστη λύση περιέχει τις βέλτιστες
λύσεις συγκεκριµένων επιµέρους στιγµιότυπων. Από τις δύο παραλλαγές, το κλα-
σµατικό πρόβληµα του σακιδίου µπορεί να λυθεί από έναν απλό, άπληστο αλγόριθ-
µο, ο οποίος βασίζει τις επιλογές του στο λόγο αξίας προς µέγεθος (pi / si) κάθε αντι-
5 . 2 à ∞ ƒ∞ ∫ ∆ ∏ ƒ π ™ ∆ π ∫ ∞ ∆ ∏ ™ ª ∂ £ √ ¢ √ À ∆ ∏ ™ ∞ ¶ § ∏ ™ ∆ π ∞ ™ 115
¢Ú·ÛÙËÚÈfiÙËÙ· 5.3
Περιγράψτε και αναλύστε έναν άπληστο αλγόριθµο, ο οποίος δεδοµένου ενός συνό-
λου Χ = {x1, x2, …, xn} πραγµατικών αριθµών, υπολογίζει µια ελαχίστου πληθικού
αριθµού συλλογή κλειστών διαστηµάτων µοναδιαίου µήκους, των οποίων η ένωση
περιέχει όλα τα στοιχεία του Χ.
οποία, πολλαπλασιασµένη µε το µήκος της ακολουθίας L, δίνει τον αριθµό των δυα-
δικών ψηφίων που απαιτούνται για την κωδικοποίηση της ακολουθίας. Η δυαδική ακο-
λουθία που αντιστοιχεί στον χαρακτήρα c ονοµάζεται κωδικός (code word) του c.
Οι κώδικες προθεµάτων έχουν την ιδιότητα της απλής αποκωδικοποίησης, αφού όταν
διαβάσουµε τον κωδικό ενός χαρακτήρα c, καταλαβαίνουµε αµέσως ότι πρόκειται
για τον c, επειδή κανένας κωδικός δεν αποτελεί πρόθεµα κάποιου άλλου κωδικού.
Εποµένως, ο αλγόριθµος αποκωδικοποίησης διαβάζει τα δυαδικά ψηφία της κωδι-
κοποιηµένης ακολουθίας, µέχρι να σχηµατιστεί ένας κωδικός. Στη συνέχεια, τυπώ-
νει τον χαρακτήρα που αντιστοιχεί στον κωδικό, αφαιρεί τα ψηφία του κωδικού από
την ακολουθία και συνεχίζει µέχρι να σχηµατιστεί κάποιος άλλος κωδικός.
Έχει αποδειχθεί ότι, για κάθε ακολουθία χαρακτήρων, υπάρχει ένας βέλτιστος κώδι-
κας προθεµάτων. Εποµένως, χωρίς βλάβη της γενικότητας, σε αυτή την ενότητα θα
περιοριστούµε στην κατασκευή κωδίκων προθεµάτων.
Για παράδειγµα, ας θεωρήσουµε µία ακολουθία µήκους 100.000 χαρακτήρων που
αποτελείται από τους χαρακτήρες α, β, γ, δ, ε και ζ, µε συχνότητες εµφάνισης 0,45,
0,13, 0,12, 0,16, 0,09, και 0,05 αντίστοιχα. Στον παρακάτω πίνακα βλέπουµε δύο
κώδικες προθεµάτων, έναν σταθερού µήκους και έναν µεταβλητού µήκους.
¶›Ó·Î·˜ 5.1
Ένα παράδειγµα κωδίκων σταθερού και µεταβλητού µήκους.
α β γ δ ε ζ
Συχνότητα εµφάνισης 0,45 0,13 0,12 0,16 0,09 0,05
Κώδικας σταθερού µήκους 000 001 010 011 100 101
Κώδικας µεταβλητού µήκους 0 101 100 111 1101 1100
Όλοι οι κωδικοί του κώδικα σταθερού µήκους αποτελούνται από 3 δυαδικά ψηφία,
και χρειάζονται 300.000 δυαδικά ψηφία για την κωδικοποίηση όλης της ακολουθίας.
Αντίστοιχα, ο κώδικας µεταβλητού µήκους εξοικονοµεί περίπου το 25% των δυαδι-
κών ψηφίων, αφού χρησιµοποιεί µόνο 1.000 (45◊1 + 13◊3 + 12◊3 + 16◊3 + 9◊4 + 5◊4)
= 224.000 δυαδικά ψηφία. Στην πραγµατικότητα, αυτός ο κώδικας µεταβλητού
µήκους είναι ένας βέλτιστος κώδικας γι΄ αυτή την ακολουθία.
Ένας κώδικας προθεµάτων µπορεί να αναπαρασταθεί σαν ένα δυαδικό δέντρο, το
οποίο έχει ένα φύλλο για κάθε χαρακτήρα. Ο κωδικός κάθε χαρακτήρα δίνεται από
το µονοπάτι που οδηγεί από τη ρίζα στο αντίστοιχο φύλλο, όπου η επιλογή του αρι-
στερού κλάδου αντιστοιχεί στο 0, και η επιλογή του δεξιού κλάδου αντιστοιχεί στο
1. Στο Σχήµα 5.2 βλέπουµε τα δυαδικά δέντρα που αντιστοιχούν στους κώδικες του
Πίνακα 5.1.
118 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
1,00
0 1
0,86 0,14
0 1 0
1,00
0 1
α:0,45 0,55
0 1
0,25 0,30
0 1 0 1
™¯‹Ì· 5.2
Τα δυαδικά δέντρα γ:0,12 β:0,13 0,14 δ:0,16
που αναπαριστούν 0 1
τους κώδικες του
Πίνακα 5.1. ζ:0,05 ε:0,09
Ένας κώδικας σταθερού µήκους αναπαρίσταται από ένα δυαδικό δέντρο του οποί-
ου όλα τα φύλλα βρίσκονται στην ίδια απόσταση από τη ρίζα (ύψος). Ένας βέλτι-
στος κώδικας αναπαρίσταται από ένα πλήρες δυαδικό δέντρο, δηλαδή από ένα δυα-
δικό δέντρο του οποίου κάθε κόµβος είτε είναι φύλλο είτε έχει ακριβώς δύο απογό-
νους. Στο Σχήµα 5.2, το δέντρο που αντιστοιχεί στον κώδικα σταθερού µήκους δεν
είναι πλήρες, αφού κανένας κωδικός δεν έχει πρόθεµα 11. Αντίθετα, το δέντρο που
αντιστοιχεί στον βέλτιστο κώδικα µεταβλητού µήκους είναι πλήρες.
¢Ú·ÛÙËÚÈfiÙËÙ· 5.4
Αποδείξτε ότι ένα δυαδικό δέντρο που δεν είναι πλήρες, δεν µπορεί να αντιστοιχεί
σε ένα βέλτιστο κώδικα.
5.3 ™Àª¶π∂™∏ ¢∂¢√ª∂¡ø¡ – ∫ø¢π∫∞™ HUFFMAN 119
Έστω ένα πλήρες δυαδικό δέντρο Τ το οποίο αναπαριστά έναν κώδικα για ένα σύνο-
λο χαρακτήρων C. Για κάθε χαρακτήρα c Œ C, συµβολίζουµε µε f(c), 0 < f(c) < 1, τη
συχνότητα εµφάνισης του c στην ακολουθία χαρακτήρων και µε dT(c) την απόσταση
του φύλλου που αντιστοιχεί στο c από τη ρίζα του Τ, δηλαδή το µήκους του κωδικού
που αντιστοιχεί στο c. Στο πρόβληµα της κωδικοποίησης θέλουµε να υπολογίσουµε
ένα πλήρες δυαδικό δέντρο Τ το οποία περιέχει ακριβώς |C| φύλλα και ελαχιστοποιεί
την ποσότητα B(T ) = Â cŒC
f ( c )dT ( c ) . Το Β(Τ) ονοµάζεται και κόστος του δέντρου Τ.
Το 1952, ο David Huffman παρουσίασε έναν άπληστο αλγόριθµο για τον υπολογι-
σµό ενός βέλτιστου κώδικα προθεµάτων, ο οποίος ονοµάζεται κώδικας Huffman.
Ο αλγόριθµος του Huffman υπολογίζει το δέντρο Τ που αντιστοιχεί σε έναν βέλτι-
στο κώδικα προχωρώντας από τα φύλλα προς τη ρίζα. Ο αλγόριθµος ξεκινά από ένα
σύνολο C αποµονωµένων φύλλων, τα οποία ενώνει σε ένα πλήρες δυαδικό µε την
εισαγωγή ακριβώς |C| – 1 εσωτερικών κόµβων. Σε κάθε εσωτερικό κόµβο αντι-
στοιχούµε συχνότητα ίση µε το άθροισµα των συχνοτήτων όλων των χαρακτήρων /
φύλλων του υποδέντρου. Σε κάθε βήµα, τα δύο υποδέντρα µε τις µικρότερες συχνό-
τητες ενώνονται και αντικαθιστώνται από ένα υποδέντρο που δηµιουργείται µε την
προσθήκη ενός νέου εσωτερικού κόµβου. Στο νέο κόµβο αντιστοιχούµε συχνότητα
ίση µε το άθροισµα των συχνοτήτων των ριζών των δύο υποδέντρων. Ο αλγόριθµος
ολοκληρώνεται όταν αποµείνει µόνο ένα δέντρο που περιέχει όλους τους χαρακτή-
ρες του C σαν φύλλα.
Ο αλγόριθµος του Huffman µπορεί να υλοποιηθεί χρησιµοποιώντας µία ουρά προτε-
ραιότητας (priority queue) Q, το κορυφαίο στοιχείο της οποίας αντιστοιχεί πάντα στο
υποδέντρο µε τη µικρότερη συχνότητα. Για παράδειγµα, η δοµή heap υλοποιεί µια
ουρά προτεραιότητας n στοιχείων µε χρόνο O(log n) για εισαγωγή και διαγραφή ενός
στοιχείου, και χρόνο υπολογισµού του στοιχείου µε τη µικρότερη συχνότητα O(1).
Αφού ο αλγόριθµος Huffman εκτελεί |C| – 1 επαναλήψεις, κάθε µία από τις οποίες
απαιτεί χρόνο O(log |C|), ο χρόνος εκτέλεσης του αλγορίθµου είναι O(|C| log |C|).
120 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
(6) 1,00
0 1
α:0,45 0,55
0 1
0,25 0,30
™¯‹Ì· 5.3 0 1 0 1
Παράδειγµα
γ:0,12 β:0,13 0,14 δ:0,16
λειτουργίας του
0 1
αλγορίθµου
Huffman. ζ:0,05 ε:0,09
5.3 ™Àª¶π∂™∏ ¢∂¢√ª∂¡ø¡ – ∫ø¢π∫∞™ HUFFMAN 121
HUFFMAN(C)
Q ¨ CREATEPRIORITYQUEUE(C);
for i ¨ 1 to |C| – 1 do
z ¨ CREATENODE();
x ¨ left(z) ¨ MIN(Q); DELETEMIN(Q);
y ¨ right(z) ¨ MIN(Q); DELETEMIN(Q);
f(z) ¨ f(x) + f(y);
INSERT(Q, z);
return MIN(Q);
Το Σχήµα 5.3 απεικονίζει τη λειτουργία του αλγορίθµου Huffman για το στιγµιότυ-
πο του Πίνακα 5.1. Ο αριθµός στη ρίζα κάθε υποδέντρου είναι η συχνότητα του υπο-
δέντρου και είναι ίσος µε το άθροισµα των συχνοτήτων όλων των χαρακτήρων / φύλ-
λων του υποδέντρου. Στο τέλος του αλγορίθµου, η συχνότητα της ρίζας θα είναι 1,00,
αφού όλοι οι χαρακτήρες θα έχουν ενσωµατωθεί σε ένα και µόνο δέντρο.
Όπως για κάθε άπληστο αλγόριθµο, για να αποδείξουµε ότι ο αλγόριθµος Huffman
υπολογίζει ένα βέλτιστο κώδικα, θα δείξουµε ότι το πρόβληµα της κωδικοποίησης
έχει την ιδιότητα της άπληστης επιλογής (Λήµµα 5.1) και την ιδιότητα των βέλτι-
στων επιµέρους δοµών (Λήµµα 5.2).
Λήµµα 5.1: Έστω C ένα σύνολο χαρακτήρων και x, y οι δύο χαρακτήρες του C
µε τις µικρότερες συχνότητες εµφάνισης. Υπάρχει ένας βέλτιστος
κώδικας για το C, τέτοιος, ώστε οι κωδικοί για τα x και y έχουν το
ίδιο µήκος και διαφέρουν µόνο στο τελευταίο δυαδικό ψηφίο,
δηλαδή ο κόµβος – πατέρας των x και y στο δυαδικό δέντρο ανα-
παράστασης του κώδικα είναι κοινός.
Απόδειξη: Έστω Τ το δέντρο αναπαράστασης ενός οποιουδήποτε βέλτιστου
κώδικα για το C, και έστω b, c δύο φύλλα – αδέλφια στο Τ που βρί-
σκονται σε µέγιστη απόσταση από τη ρίζα. Χωρίς βλάβη της γενι-
κότητας, µπορούµε να υποθέσουµε ότι f(b) £ f(c) και f(x) £ f(y).
Επίσης, αφού τα x και y έχουν τις µικρότερες συχνότητες εµφάνι-
σης, µπορούµε να θεωρήσουµε ότι f(x) £ f(b) και f(y) £ f(c). Όπως
φαίνεται στο Σχήµα 5.3, η αµοιβαία ανταλλαγή θέσης των x και b
δηµιουργεί ένα νέο δέντρο Τ1 και, στη συνέχεια, η αµοιβαία ανταλ-
λαγή θέσης των y και c δηµιουργεί ένα νέο δέντρο Τ2. Η διαφορά
στο κόστος των δέντρων T και T1 είναι:
122 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
B(T ) - B(T1 ) = Â f ( c )d ( c ) - Â f ( c )d
cŒC
T
cŒC
T1 ( c )
Το Λήµµα 5.1 δείχνει ότι η διαδικασία συνενώσεων για τη δηµιουργία ενός βέλτι-
στου κώδικα µπορεί να ξεκινήσει µε την άπληστη επιλογή της ένωσης των δύο χαρα-
κτήρων µε τις µικρότερες συχνότητες εµφάνισης. Η επιλογή αυτή χαρακτηρίζεται
ως άπληστη γιατί το άθροισµα των συχνοτήτων των κόµβων που ενώνονται σε ένα
κοινό υποδέντρο µπορεί να θεωρηθεί σαν το κόστος της συνένωσης. Μάλιστα, µπο-
ρεί να αποδειχθεί ότι το συνολικό κόστος του δέντρου είναι ίσο µε το άθροισµα του
κόστους όλων των συνενώσεων.
¢Ú·ÛÙËÚÈfiÙËÙ· 5.5
Αποδείξτε ότι το συνολικό κόστος Β(Τ) ενός δέντρου Τ είναι ίσο µε το άθροισµα
του κόστους όλων των συνενώσεων για τη δηµιουργία του Τ, όπου το κόστος κάθε
συνένωσης είναι ίσο µε το άθροισµα των συχνοτήτων των κόµβων – ριζών των
υποδέντρων που ενώνονται.
5.3 ™Àª¶π∂™∏ ¢∂¢√ª∂¡ø¡ – ∫ø¢π∫∞™ HUFFMAN 123
Τα Λήµµατα 5.1 και 5.2 δείχνουν ότι ο αλγόριθµος Huffman, ο οποίος σε κάθε βήµα
συνενώνει τους κόµβους µε τις µικρότερες συχνότητες και, στη συνέχεια, εφαρµό-
ζει τον εαυτό του για την επίλυση του στιγµιότυπου που προκύπτει από αυτή την
άπληστη επιλογή, όντως υπολογίζει ένα βέλτιστο κώδικα προθεµάτων για το σύνο-
λο χαρακτήρων C.
124 KEºA§AIO 5: ∞¶§∏™∆√π ∞§°√ƒπ£ª√π
¢Ú·ÛÙËÚÈfiÙËÙ· 5.6
Έστω ότι έχουµε στη διάθεσή µας κέρµατα αξίας µίας, πέντε και είκοσι δραχµών,
και θέλουµε να δώσουµε ρέστα αξίας Χ δραχµών, χρησιµοποιώντας τον ελάχιστο
αριθµό κερµάτων. Περιγράψτε ένα άπληστο αλγόριθµο και αποδείξτε ότι αυτός
υπολογίζει µία βέλτιστη λύση. ∆ώστε ένα παράδειγµα συνόλου κερµάτων για τα
οποία ο άπληστος αλγόριθµος δεν εγγυάται τον υπολογισµό µιας βέλτιστης λύσης.
™‡ÓÔ„Ë
Σε αυτό το κεφάλαιο παρουσιάστηκε η µέθοδος της απληστίας για την επίλυση προ-
βληµάτων βελτιστοποίησης. Ένας άπληστος αλγόριθµος λειτουργεί σε βήµατα, ακο-
λουθώντας την επιλογή που φαίνεται καλύτερη σε κάθε βήµα. Όταν το πρόβληµα έχει
τις ιδιότητες της άπληστης επιλογής και των βέλτιστων επιµέρους δοµών, µπορούµε
να αποδείξουµε ότι η άπληστη στρατηγική των τοπικά βέλτιστων επιλογών, πράγµα-
τι, καταλήγει σε µία συνολικά βέλτιστη λύση.
Το πρώτο παράδειγµα άπληστου αλγορίθµου αφορούσε στην επίλυση ενός προβλή-
µατος επιλογής δραστηριοτήτων, οι οποίες έχουν συγκεκριµένους χρόνους έναρξης
και λήξης και ανταγωνίζονται για τη δέσµευση ενός κοινόχρηστου πόρου. Αποδείξα-
µε ότι ο άπληστος αλγόριθµος που κάθε φορά επιλέγει τη δραστηριότητα που ολο-
κληρώνεται πρώτη υπολογίζει ένα µέγιστου πληθικού αριθµού σύνολο αµοιβαία συµ-
βατών δραστηριοτήτων.
Στη συνέχεια, µελετήσαµε δύο παραλλαγές του προβλήµατος του σακιδίου, αµφότε-
ρες οι οποίες έχουν την ιδιότητα των βέλτιστων επιµέρους δοµών. Η 0 – 1 παραλλα-
γή δεν έχει την ιδιότητα της άπληστης επιλογής και απαιτεί την εφαρµογή δυναµικού
προγραµµατισµού για τον υπολογισµό µιας βέλτιστης λύσης, ενώ η κλασµατική παραλ-
λαγή επιλύεται βέλτιστα από έναν απλό, άπληστο αλγόριθµο που βασίζεται στο λόγο
αξίας προς µέγεθος κάθε αντικειµένου.
Ένα άλλο παράδειγµα εφαρµογής της µεθόδου της απληστίας είναι ο αλγόριθµος του
Huffman για τον υπολογισµό ενός βέλτιστου κώδικα µεταβλητού µήκους για ένα σύνο-
λο χαρακτήρων C.
B I B § I O ° PA º I A 125
µÈ‚ÏÈÔÁÚ·Ê›·
™ÎÔfi˜
∫ ∂
Σκοπός αυτού του κεφαλαίου είναι η εισαγωγή στους αλγόριθµους που επεξεργάζο-
νται γραφήµατα. Τους βασικούς ορισµούς ακολουθεί η παρουσίαση δύο εναλλακτι-
κών τρόπων αναπαράστασης ενός γραφήµατος ώστε να µπορεί να επεξεργαστεί από
6
º
¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·
• Να αναπαριστά ένα γράφηµα µε την λίστα γειτονικότητας και τον πίνακα γειτονι-
κότητας.
• Να εφαρµόζει την τεχνική του Ψαξίµατος Πρώτα σε Βάθος για την εξερεύνηση
ενός γραφήµατος.
• Να εφαρµόζει την τεχνική του Ψαξίµατος Πρώτα σε Πλάτος και να αναφέρει τις
ιδιότητές της.
• Να εφαρµόζει τις τεχνικές του Ψαξίµατος Πρώτα σε Βάθος και Ψαξίµατος Πρώτα
σε Πλάτος για την επίλυση απλών προβληµάτων.
ŒÓÓÔȘ ÎÏÂȉȿ
• γράφηµα τονικότητας
• κατευθυντικό και µη κατευθυντικό • ψάξιµο πρώτα σε βάθος
γράφηµα • ψάξιµο πρώτα σε πλάτος
• λίστα γειτονικότητας και πίνακας γει- • συνεκτικό γράφηµα
∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Ένα γράφηµα είναι ένα σύνολο κορυφών, κάποιες από τις οποίες ενώνονται µε ακµές
/ γραµµές. Αυτή η πολύ απλή µαθηµατική οντότητα επιτρέπει την κοµψή µοντελο-
ποίηση πολλών και σηµαντικών υπολογιστικών προβληµάτων. Επιπλέον, το γράφη-
128 K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡
µα έχει µελετηθεί εκτενώς σαν µαθηµατική οντότητα στα πλαίσια της Θεωρίας Γρα-
φηµάτων, τα αποτελέσµατα της οποίας µας οδηγούν συχνά στο σχεδιασµό κοµψών
και αποδοτικών αλγόριθµων για πολλά υπολογιστικά προβλήµατα που µοντελοποι-
ούνται µε τη βοήθεια γραφηµάτων.
Όµως, για να γίνει δυνατή η αποδοτική επεξεργασία ενός γραφήµατος από έναν αλγό-
ριθµο, πρέπει το γράφηµα να αναπαρασταθεί σε µία κατάλληλη δοµή δεδοµένων. Σε
αυτό το κεφάλαιο θα παρουσιάσουµε της µορφές αναπαράστασης ενός γραφήµατος
µε τη Λίστα Γειτονικότητας και τον Πίνακα Γειτονικότητας των κορυφών του. Αυτές
οι µορφές αναπαράστασης είναι οι πλέον συνηθισµένες και χρησιµοποιούνται από
την συντριπτική πλειοψηφία των γνωστών αλγόριθµων.
Από τους αλγόριθµους που επεξεργάζονται γραφήµατα, οι πλέον στοιχειώδεις είναι
οι αλγόριθµοι εξερεύνησης γραφηµάτων. Με τον όρο εξερεύνηση δηλώνεται η συστη-
µατική επίσκεψη των κορυφών του γραφήµατος ακολουθώντας τις ακµές που υπάρ-
χουν µεταξύ τους. Όπως θα δούµε, οι αλγόριθµοι εξερεύνησης γραφηµάτων µπορούν
να ανιχνεύσουν πολλές βασικές ιδιότητες ενός γραφήµατος και να εφαρµοστούν για
τη λύση πολλών προβληµάτων.
Για παράδειγµα, ένα δίκτυο υπολογιστών µπορεί να αναπαρασταθεί από ένα γράφηµα,
όπου οι κορυφές αναπαριστούν υπολογιστές και άλλες ενεργές συσκευές, και οι ακµές
τις δικτυακές συνδέσεις. Το θεµελιώδες πρόβληµα της αξιοπιστίας ενός δικτύου ανά-
γεται στον έλεγχο συνεκτικότητας ενός τέτοιου γραφήµατος όταν κάποιες ακµές τεθούν
εκτός λειτουργίας. Η συνεκτικότητα είναι µία θεµελιώδης ιδιότητα ενός γραφήµατος η
οποία µπορεί εύκολα να ανιχνευθεί µε την εφαρµογή ενός αλγόριθµου εξερεύνησης.
Επιπλέον, οι αλγόριθµοι εξερεύνησης παρέχουν χρήσιµη πληροφορία για τη δοµή
ενός γραφήµατος. Έτσι, πολλοί αλγόριθµοι γραφηµάτων ξεκινούν τη λειτουργία τους
µε την εφαρµογή ενός αλγόριθµου εξερεύνησης για να αποκτήσουν τέτοιου είδους
πληροφορία που είναι απαραίτητη για τα επόµενα στάδια της λειτουργίας τους.
Σε αυτό το κεφάλαιο, θα παρουσιαστούν οι αλγόριθµοι του Ψαξίµατος Πρώτα σε
Πλάτος (Breadth First Search) και του Ψαξίµατος Πρώτα σε Βάθος (Depth First
Search) για την εξερεύνηση ενός γραφήµατος, και θα µελετηθούν οι σηµαντικότερες
από τις ιδιότητές τους.
Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες:
6.1. Ορισµοί και Αναπαράσταση Γραφηµάτων
6.2. Ψάξιµο Πρώτα σε Πλάτος
6.3. Ψάξιµο Πρώτα σε Βάθος
6 . 1 √ ƒ π ™ ª √ π ∫ ∞ π ∞ ¡ ∞ ¶ ∞ ƒ∞ ™ ∆∞ ™ ∏ ° ƒ∞ º ∏ ª ∞∆ ø ¡ 129
1 3 5 1 3 5
2 4 6 2 4 6
(α) (β)
1 3 5
™¯‹Ì· 6.1
Παραδείγµατα
2 4 6
κατευθυντικών και
µη κατευθυντικών
(γ) γραφηµάτων.
Μία ακµή (v, w) ενός κατευθυντικού γραφήµατος λέµε ότι ξεκινάει από την κορυφή
v και καταλήγει στην κορυφή w. Μία ακµή {v, w} ενός κατευθυντικού γραφήµατος
λέµε ότι συντρέχει στις κορυφές v και w.
130 K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡
∆ύο κορυφές που συνδέονται από µία µη κατευθυνόµενη ακµή {v, w} λέµε ότι είναι
γειτονικές. Για δύο κορυφές που συνδέονται από µία κατευθυνόµενη ακµή (v, w),
λέµε ότι η κορυφή w είναι γειτονική της κορυφής v. Στα µη κατευθυντικά γραφήµα-
τα, η σχέση γειτονικότητας των κορυφών είναι συµµετρική, δηλαδή όταν η κορυφή
w είναι γειτονική της κορυφής v, τότε και η v είναι γειτονική της w. Προφανώς, αυτό
δεν ισχύει απαραίτητα στα κατευθυντικά γραφήµατα.
Στις ακµές ενός γραφήµατος G(V, E) µπορούµε να αντιστοιχίσουµε βάρη µέσω µίας
συνάρτησης w : E Æ ΙR. Σε αυτή την περίπτωση, το γράφηµα ονοµάζεται βεβαρη-
µένο γράφηµα (weighted graph) και, µερικές φορές, συµβολίζεται µε G(V, E, w).
Επίσης, σε µερικές περιπτώσεις τα βάρη ερµηνεύονται σαν µήκη των ακµών.
Ο βαθµός µίας κορυφής v ενός µη κατευθυντικού γραφήµατος είναι ο αριθµός των
ακµών που συντρέχουν στην v. Για παράδειγµα, στο Σχήµα 6.1.(β), η κορυφή 2 έχει
βαθµό 2, ενώ η κορυφή 5 έχει βαθµό 1. Στα κατευθυντικά γραφήµατα διακρίνουµε
τον αριθµό των ακµών που ξεκινούν από µία κορυφή v, ο οποίος ονοµάζεται βαθ-
µός εξόδου της v, και τον αριθµό των ακµών που καταλήγουν σε µία κορυφή v, ο
οποίος ονοµάζεται βαθµός εισόδου της v. Για παράδειγµα, στο Σχήµα 6.1.(α), ο βαθ-
µός εξόδου της κορυφής 3 είναι 3, ενώ ο βαθµός εισόδου της ίδιας κορυφής είναι 1.
¢Ú·ÛÙËÚÈfiÙËÙ· 6.1
Έστω G(V, E) ένα µη κατευθυντικό γράφηµα. Αποδείξτε ότι το άθροισµα των βαθ-
µών όλων των κορυφών είναι ίσο µε το διπλάσιο του αριθµού των ακµών. ∆ηλα-
δή, αν deg(v) ο βαθµός κάθε κορυφής v, αποδείξτε ότι Â v ŒV
deg( v ) = 2 | E | .
Ένα µονοπάτι (path) µήκους k από µία κορυφή v σε µία κορυφή v¢ ενός γραφήµατος
G(V, E) είναι µία ακολουθία <v0, v1, …, vk – 1, vk> κορυφών, όπου v = v0, v¢ = vk, και
(vi – 1, vi) Œ E, για κάθε i = 1, …, k. Το µονοπάτι περιέχει τις κορυφές v0, v1, …, vk, και
τις ακµές (v0, v1), (v1, v2), …, (vk – 1, vk). Αν στις ακµές του γραφήµατος G έχουν αντι-
στοιχηθεί µήκη, τότε το µήκος του µονοπατιού είναι ίσο µε το άθροισµα των µηκών
των ακµών που περιέχει. Αν υπάρχει ένα µονοπάτι από µία κορυφή v0 σε µία άλλη
κορυφή vk, λέµε ότι η vk είναι προσπελάσιµη (reachable) από τη v0. Ένα µονοπάτι p
είναι απλό (simple), αν όλες οι κορυφές που περιέχει το p είναι διαφορετικές µεταξύ
τους. Για παράδειγµα, στο Σχήµα 6.1.(α), το µονοπάτι <1, 3, 4, 6> είναι απλό, ενώ το
µονοπάτι <2, 1, 3, 2, 4> δεν είναι απλό, επειδή περιέχει δύο φορές την κορυφή 2.
Αν µία κορυφή v΄ είναι προσπελάσιµη από µία κορυφή v, τότε η απόσταση της v΄
6 . 1 √ ƒ π ™ ª √ π ∫ ∞ π ∞ ¡ ∞ ¶ ∞ ƒ∞ ™ ∆∞ ™ ∏ ° ƒ∞ º ∏ ª ∞∆ ø ¡ 131
του V. Για παράδειγµα, το γράφηµα του Σχήµατος 6.1.(α) αποτελείται από τρεις ισχυ-
ρά συνεκτικές συνιστώσες που ορίζονται από τα σύνολα κορυφών {1, 2, 4, 5}, {3},
και {6}. Οι ισχυρά συνεκτικές συνιστώσες ενός γραφήµατος είναι οι κλάσεις ισο-
δυναµίας στις οποίες διαιρείται το σύνολο των κορυφών από τη σχέση «οι κορυφές
u, v είναι αµοιβαία προσπελάσιµες».
™¯‹Ì· 6.2
1 3 5
Ένα παράδειγµα
άκυκλου,
συνεκτικού
γραφήµατος –
δέντρου. 2 4 6
¢Ú·ÛÙËÚÈfiÙËÙ· 6.2
Αποδείξτε ότι ένα γράφηµα G(V, E) είναι δέντρο αν και µόνο αν οποιεσδήποτε δύο
κορυφές του G ενώνονται µε ένα µοναδικό µονοπάτι.
1 2 3 /
1 2 3 4 5 6
1 3 5
2 1 3 / 1 0 1 1 0 0 0
3 1 2 4 5 / 2 1 0 1 0 0 0
3 1 1 0 1 1 0
4 3 6 / 4 0 0 1 0 0 1
5 3 / 5 0 0 1 0 0 0
2 4 6
6 0 0 0 1 0 0
6 4 /
Το Ψάξιµο Πρώτα σε Πλάτος (ΨΠΠ – Breadth First Search) είναι ένας από τους
απλούστερους αλγόριθµους για την εξέταση ενός γραφήµατος, ενώ η βασική του
ιδέα βρίσκει εφαρµογή και σε αλγόριθµους για άλλα προβλήµατα (π.χ., υπολογισµός
συντοµότερων µονοπατιών, ελάχιστου γενετικού δέντρου).
∆εδοµένου ενός γραφήµατος G(V, E) και µιας αρχικής κορυφής s Œ V, ο αλγόριθµος
του Ψαξίµατος Πρώτα σε Πλάτος διερευνά τις ακµές του G, προσπαθώντας να ανακα-
λύψει / επισκεφθεί όλες τις κορυφές που είναι προσπελάσιµες από την s. Ο αλγόριθµος
ΨΠΠ λειτουργεί τόσο σε κατευθυντικά όσο και σε µη κατευθυντικά γραφήµατα.
Ο αλγόριθµος ΨΠΠ εξερευνά τις κορυφές µε σειρά που καθορίζεται από τη λίστα
γειτονικότητας του G. Αρχικά, επισκέπτεται όλες τις γειτονικές κορυφές της s. Για
κάθε κορυφή v γειτονική της s (κάθε τέτοια κορυφή v βρίσκεται σε απόσταση 1 από
την s), ο αλγόριθµος ΨΠΠ επισκέπτεται όλες τις κορυφές που είναι γειτονικές της v
και δεν έχει επισκεφθεί / ανακαλύψει προηγουµένως (αυτές οι κορυφές βρίσκονται
σε απόσταση ακριβώς 2 από την s). Στη συνέχεια, για κάθε κορυφή v που βρίσκεται
σε απόσταση ακριβώς 2 από την s, το ΨΠΠ επισκέπτεται όλες τις κορυφές που είναι
γειτονικές της v και δεν έχει ανακαλύψει προηγουµένως. Γενικότερα, στην k – οστή
επανάληψη, ο αλγόριθµος ΨΠΠ ανακαλύπτει όλες τις κορυφές που βρίσκονται σε
απόσταση ακριβώς k από την s. Το όνοµα του ΨΠΠ προέρχεται ακριβώς από το γεγο-
νός ότι επισκέπτεται όλες τις κορυφές σε απόσταση k, πριν επισκεφθεί οποιαδήπο-
τε κορυφή σε απόσταση k + 1. ∆ηλαδή, το ΨΠΠ λειτουργεί επεκτείνοντας οµοιό-
µορφα και κατά πλάτος το νοητό όριο µεταξύ των κορυφών που έχει επισκεφθεί και
αυτών που δεν έχει επισκεφθεί (βλ. Σχήµα 6.5).
Από την περιγραφή της στρατηγικής του ΨΠΠ, µπορούµε να διακρίνουµε τρία είδη
κορυφών: Τις κορυφές που το ΨΠΠ δεν έχει ακόµη επισκεφθεί, τις κορυφές που το
ΨΠΠ έχει επισκεφθεί, αλλά πιθανόν υπάρχουν κάποιες γειτονικές κορυφές τους που
δεν έχουν ανακαλυφθεί από το ΨΠΠ, και τις κορυφές που, τόσο αυτές όσο και όλες
οι γειτονικές τους, έχουν ανακαλυφθεί από το ΨΠΠ.
Για να διευκολύνουµε την περιγραφή του αλγορίθµου, αντιστοιχούµε στις τρεις παρα-
πάνω κατηγορίες κορυφών τα χρώµατα λευκό, γκρίζο και µαύρο. Αρχικά, όλες οι
κορυφές είναι λευκές, αφού καµία δε έχει ακόµη ανακαλυφθεί από το ΨΠΠ. Την
πρώτη φορά που το ΨΠΠ επισκέπτεται µία λευκή κορυφή, αυτή βάφεται γκρίζα. Οι
γκρίζες κορυφές µπορεί να έχουν κάποιες γειτονικές λευκές κορυφές, δηλαδή γειτο-
νικές κορυφές που το ΨΠΠ δεν έχει επισκεφθεί ακόµη. Μία γκρίζα κορυφή βάφεται
µαύρη, όταν το ΨΠΠ επισκεφθεί όλες τις γειτονικές κορυφές της. Για να βαφτεί µαύρη
µία κορυφή v, πρέπει πρώτα να έχουν βαφτεί γκρίζες ή µαύρες όλες οι γειτονικές της.
136 K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡
Για να εξασφαλίζεται η κατά πλάτος διεύρυνση του συνόλου των κορυφών που το
ΨΠΠ έχει επισκεφθεί, η σειρά µε την οποία οι γκρίζες κορυφές βάφονται µαύρες
είναι ίδια µε τη σειρά που οι λευκές κορυφές βάφονται γκρίζες. Γι’ αυτό ο αλγόριθ-
µος διατηρεί µία FIFO ουρά Q, στο τέλος της οποίας τοποθετείται κάθε κορυφή που
µόλις άλλαξε χρώµα από λευκό σε γκρίζο. Η επόµενη κορυφή που θα αλλάξει χρώµα
από γκρίζο σε µαύρο είναι πάντα η πρώτη κορυφή της ουράς Q.
Επιπλέον, το ΨΠΠ διατηρεί έναν πίνακα p, ο οποίος έχει µία εγγραφή για κάθε κορυ-
φή v Œ V, και το στοιχείο p[v] έχει την τιµή της κορυφής από την οποία το ΨΠΠ επι-
σκέφθηκε την v. ∆ηλαδή, αν p[v] = u, το ΨΠΠ χρησιµοποίησε την ακµή (u, v) για
να επισκεφθεί την v.
Στη συνέχεια, παρατίθεται ο ψευδοκώδικας του ΨΠΠ. Στον παρακάτω ψευδοκώδι-
κα, η εντολή «u ¨ head[Q];» δηλώνει στη µεταβλητή u εκχωρείται η τιµή του πρώ-
του στοιχείου της ουράς Q, ενώ ταυτόχρονα αυτό το στοιχείο αφαιρείται από την
ουρά, ενώ η εντολή «tail[Q] ¨ v;» δηλώνει ότι στην ουρά Q προστίθεται ένα ακόµη
στοιχείο που έχει την τιµή v.
涶(G(V, E), s)
for all v Œ V – {s} do
color[v] ¨ §∂À∫√; p[v] ¨ NIL;
while Q π ∆ do
u ¨ head[Q]; Q ¨ Q – {u};
for all v Œ A[u] do
if color[v] = §∂À∫√ then
color[v] ¨ °∫ƒπ∑√; tail[Q] ¨ v; p[v] ¨ u;
color[u] ¨ ª∞Àƒ√;
Κάθε κορυφή αλλάζει µία φορά χρώµα από λευκό σε γκρίζο, και µία φορά χρώµα
από γκρίζο σε µαύρο. Στην πρώτη αλλαγή χρώµατος, η κορυφή προστίθεται στο
τέλος της ουράς Q, ενώ στη δεύτερη αλλαγή χρώµατος η κορυφή αφαιρείται από την
αρχή της Q. Αφού η Q είναι µία απλή FIFO ουρά, οι παραπάνω λειτουργίες εκτε-
λούνται σε χρόνο Θ(|V|). Επίσης, ο αλγόριθµος εξετάζει τη λίστα των γειτόνων κάθε
κορυφής, όταν αυτή αλλάζει χρώµα από γκρίζο σε µαύρο. Το άθροισµα των γειτό-
νων όλων των κορυφών είναι Θ(|Ε|). Εποµένως, ο χρόνος εκτέλεσης του ΨΠΠ είναι
Ο(|V| + |E|) ή διαφορετικά το ΨΠΠ χρειάζεται χρόνο γραµµικό στο µέγεθος της
λίστας γειτονικότητας ενός γραφήµατος G(V, E).
6 . 2 æ ∞ • π ª √ ¶ ƒ ø ∆∞ ™ ∂ ¶ § ∞∆ √ ™ 137
s s
1 3 5 7 1 3 5 7
2 4 6 8 2 4 6 8
Q 4 1
s s
1 3 5 7 1 3 5 7
2 4 6 8 2 4 6 8
Q 1 5 6 Q 5 6 2
s s
1 3 5 7 1 3 5 7
2 4 6 8 2 4 6 8
Q 6 2 7 Q 2 7 8
™¯‹Ì· 6.5
s s
1 3 5 7 1 3 5 7 Παράδειγµα εφαρ-
µογής Ψαξίµατος
Πρώτα σε Πλάτος.
2 4 6 8 2 4 6 8 Οι διακεκοµµένες
ακµές έχουν χρησι-
Q 7 8 Q 8
µοποιηθεί για την
s s ανακάλυψη νέων
1 3 5 7 1 3 5 7 κορυφών, και συµ-
µετέχουν στο δέντρο
του ΨΠΠ, που απει-
2 4 6 8 2 4 6 8 κονίζεται τελευταίο
Ένα γράφηµα G(V, E) ονοµάζεται διµερές (bipartite), όταν οι κορυφές του µπο-
ρούν να διαµεριστούν σε δύο σύνολα V1 και V2, τέτοια, ώστε κάθε ακµή του Ε να
έχει το ένα άκρο της στο σύνολο V1 και το άλλο άκρο της στο V2. Περιγράψτε έναν
αποδοτικό αλγόριθµο που αποφασίζει αν ένα γράφηµα είναι διµερές ή όχι.
138 K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡
µοποιούµε τους πίνακες d[1, …, |V|] και f[1, …, |V|], στους οποίους αποθηκεύουµε
τις χρονικές στιγµές στις οποίες κάθε κορυφή αλλάζει χρώµα. Οι χρονικές στιγµές
είναι ακέραιοι αριθµοί µεταξύ 1 και 2|V| και δηλώνουν την ακολουθία των γεγονό-
των αλλαγής χρώµατος των κορυφών. Για κάθε κορυφή v, το d[v] δηλώνει τη χρο-
νική στιγµή στην οποία η v έγινε γκρίζα (διαφορετικά, το χρόνο της πρώτης επίσκε-
ψης του ΨΠΒ στη v), ενώ το f[v] δηλώνει τη στιγµή στην οποία η v έγινε µαύρη (δια-
φορετικά, το χρόνο που το ΨΠΒ εγκατέλειψε τη v). Επειδή κάθε κορυφή v πρέπει
να γίνει γκρίζα πριν γίνει µαύρη, είναι d[v] < f[v].
Στη συνέχεια, παραθέτουµε µία αναδροµική υλοποίηση του ΨΠΒ, ενώ στο Σχήµα
6.6, φαίνεται ένα παράδειγµα λειτουργίας του.
time ¨ 0; {Global ÌÂÙ·‚ÏËÙ‹ ÁÈ· ÙȘ ¯ÚÔÓÈΤ˜ ÛÙÈÁ̤˜ }
涵(G(V, E))
for all v Œ V do
color[v] ¨ §∂À∫√; p[v] ¨ NIL;
for all v Œ V do
if color[v] = §∂À∫√ then 涵 – ∂¶π™∫∂æ∏(v);
涵 – ∂¶π™∫∂æ∏(v)
time ¨ time + 1; color[v] ¨ °∫ƒπ∑√; d[v] ¨ time;
for all u Œ A[v] do
if color[u] = §∂À∫√ then
p[u] ¨ v; 涵 – ∂¶π™∫∂æ∏(u);
time ¨ time + 1; color[v] ¨ ª∞Àƒ√; f[v] ¨ time;
Όσον αφορά στο χρόνο εκτέλεσης του ΨΠΒ, η εξερεύνηση του γραφήµατος πραγ-
µατοποιείται από την διαδικασία ΨΠΒ – ΕΠΙΣΚΕΨΗ, η οποία καλείται ακριβώς µία
φορά για κάθε κορυφή v, αφού καλείται µόνο όταν η v είναι λευκή και, αµέσως µετά
την κλήση, βάφει την κορυφή v γκρίζα. Για κάθε κορυφή v, η ΨΠΒ – ΕΠΙΣΚΕΨΗ ελέγ-
χει όλους τους γείτονες της v, για κορυφές που δεν έχει επισκεφθεί. Εποµένως, ο
συνολικός χρόνος εκτέλεσης της διαδικασίας ΨΠΒ είναι γραµµικός στο µέγεθος της
λίστας γειτονικότητας του γραφήµατος, δηλαδή Ο(|V| + |E|).
140 K E º A § A I O 6 : ∞ § ° √ ƒ π £ ª √ π ∂ • ∂ ƒ ∂ À ¡ ∏ ™ ∏ ™ ° ƒ∞ º ∏ ª ∞∆ ø ¡
1/ 1/ 2/ 1/ 2/
3/
1/ 2/ 1/ 2/ 1/ 2/
Π Π
4/ 3/ 4/5 3/ 4/5 3/
1/ 2/ 1/ 2/7 1/ 2/7
M
Π Π Π
™¯‹Ì· 6.6
Παράδειγµα εφαρµογής Ψαξίµατος Πρώτα σε Βάθος. Στις κορυφές σηµειώνονται οι χρονικές στιγµές αλλαγής
χρώµατος. Οι ακµές που έχουν εξετασθεί απεικονίζονται διακεκοµµένες, ενώ οι ακµές που σηµειώνονται µε τα
γράµµατα Μ, Π, ∆ δεν συµµετέχουν στο δάσος του ΨΠΒ, το οποίο απεικονίζεται τελευταίο.
6 . 3 æ ∞ • π ª √ ¶ ƒ ø ∆∞ ™ ∂ µ ∞ £ √ ™ 141
¢Ú·ÛÙËÚÈfiÙËÙ· 6.3
Μια κλίκα (clique) είναι ένα µη κατευθυντικό γράφηµα G(V, E), κάθε ζευγάρι
κορυφών του οποίου συνδέεται µε µία ακµή. ∆ηλαδή, για κάθε u, v Œ V, {u. v} Œ
E. Αποδείξτε ότι, σε κάθε περίπτωση, το δέντρο του ΨΠΒ για µία κλίκα G(V, E)
είναι ένα απλό µονοπάτι που διέρχεται από όλες τις κορυφές του G. ∆ώστε ένα
παράδειγµα γραφήµατος, που αν και δεν είναι κλίκα, το δέντρο του ΨΠΒ για αυτό
το γράφηµα είναι, σε κάθε περίπτωση, ένα απλό µονοπάτι.
Αποδείξτε ότι ένα µη κατευθυντικό γράφηµα είναι άκυκλο αν και µόνο αν το ΨΠΒ
δεν παράγει πίσω ακµές. ∆ώστε έναν αλγόριθµο που αποφασίζει αν ένα µη κατευ-
θυντικό γράφηµα είναι άκυκλο.
¢Ú·ÛÙËÚÈfiÙËÙ· 6.4
Αποδείξτε ότι το ΨΠΒ στα µη κατευθυντικά γραφήµατα, εκτός από τις ακµές των
δέντρων, παράγει µόνο πίσω ακµές.
¢Ú·ÛÙËÚÈfiÙËÙ· 6.5
Μια άλλη ενδιαφέρουσα ιδιότητα του ΨΠΒ προκύπτει από την παρατήρηση των
χρονικών στιγµών d[v] και f[v] που οι κορυφές v Œ V αλλάζουν χρώµα. Θα αποδεί-
ξουµε ότι για κάθε ζευγάρι κορυφών u, v, τα διαστήµατα [d[u], f[u]] και [d[v], f[v]]
είτε είναι ξένα µεταξύ τους, είτε το ένα περιέχεται στο άλλο (Σχήµα 6.7).
6 . 3 æ ∞ • π ª √ ¶ ƒ ø ∆∞ ™ ∂ µ ∞ £ √ ™ 143
∆είξτε ότι το ΨΠΒ µπορεί να χρησιµοποιηθεί για τον υπολογισµό των συνεκτικών
συνιστωσών ενός µη κατευθυντικού γραφήµατος 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˜
∫ ∂
¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·
Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση:
• Να ορίζει το πρόβληµα απόφασης που αντιστοιχεί σε ένα πρόβληµα βελτιστοποίησης.
• Να περιγράφει µια µηχανή Turing που αποφασίζει ένα απλό πρόβληµα.
• Να αποδεικνύει ότι ένα πρόβληµα ανήκει σε µία κλάση πολυπλοκότητας.
• Να περιγράφει απλές αναγωγές µεταξύ υπολογιστικών προβληµάτων.
ŒÓÓÔȘ ÎÏÂȉȿ
• πρόβληµα απόφασης • ντετερµινιστική χρονική πολυπλοκό-
• ευεπίλυτα και δυσεπίλυτα προβλήµα-
τητα και κλάση P
τα – αξίωµα Cook – Karp
• ντετερµινιστική µηχανή Turing • αναγωγή και πληρότητα
∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Η θεωρία υπολογιστικής πολυπλοκότητας (computational complexity theory) είναι
η περιοχή της θεωρητικής επιστήµης των υπολογιστών που εξετάζει τους λόγους για
τους οποίους µερικά προβλήµατα είναι δύσκολο ή και αδύνατον να λυθούν από έναν
υπολογιστή. Η υπολογιστική πολυπλοκότητα (ή απλά πολυπλοκότητα), που, ουσια-
στικά, δεν υπήρχε σαν επιστηµονική περιοχή πριν εικοσιπέντε χρόνια, γνώρισε
ραγδαία ανάπτυξη, και σήµερα αποτελεί µία από τις σηµαντικότερες περιοχές της
146 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
Από την οπτική γωνία της θεωρίας αλγορίθµων, τα υπολογιστικά προβλήµατα απο-
τελούν ένα µαθηµατικό φορµαλισµό που περιγράφει µια κατηγορία πραγµατικών
προβληµάτων, τα οποία πρέπει να λυθούν αποτελεσµατικά από κάποιον αλγόριθµο.
Η µαθηµατική περιγραφή του προβλήµατος, συνήθως, βρίσκεται σε απόλυτη αντι-
στοιχία µε το πραγµατικό πρόβληµα. Η περιγραφή των αλγόριθµων σε ψευδοκώδι-
κα επιτρέπει την εύκολη υλοποίησή τους σε διάφορες γλώσσες προγραµµατισµού,
ώστε να χρησιµοποιηθούν για την επίλυση πραγµατικών στιγµιότυπων του προβλή-
µατος. Το γεγονός ότι οι αλγόριθµοι σχεδιάζονται για να χρησιµοποιηθούν στην
πράξη, καθιστά αναγκαίο τον ακριβή υπολογισµό της τάξης µεγέθους των συναρ-
τήσεων, οι οποίες προσδιορίζουν την ποσότητα των υπολογιστικών πόρων που απαι-
τεί κάθε αλγόριθµος. Επιπλέον, η πλειοψηφία των προβληµάτων που εξετάζονται
από τη θεωρία αλγορίθµων είναι προβλήµατα βελτιστοποίησης.
Από την οπτική γωνία της θεωρίας πολυπλοκότητας, τα υπολογιστικά προβλήµατα
είναι µαθηµατικές οντότητες που, καθ’ αυτές, χρήζουν µελέτης. Τα προβλήµατα περι-
γράφονται µαθηµατικά σαν τυπικές γλώσσες (formal languages), ενώ οι αλγόριθµοι
σαν υπολογιστικές µηχανές ειδικού σκοπού. Ο προσδιορισµός της ποσότητας των
υπολογιστικών πόρων που απαιτείται για τη λύση ενός προβλήµατος δεν χρειάζεται
να είναι ακριβής, αφού εκείνο που ενδιαφέρει είναι η κατηγορία των συναρτήσεων
και όχι η ακριβής τάξη µεγέθους.
Για τη θεωρία πολυπλοκότητας, ένα πρόβληµα Π είναι µία δυαδική σχέση που περι-
λαµβάνει όλα τα διαφορετικά ζεύγη των στιγµιότυπων του Π και των λύσεών τους.
Για παράδειγµα, ας θεωρήσουµε το πρόβληµα του Συντοµότερου Μονοπατιού µετα-
ξύ δύο κορυφών. Ένα στιγµιότυπο για αυτό το πρόβληµα αποτελείται από ένα γρά-
φηµα G(V, E), και δύο κορυφές s, t Œ V. Κάθε τριάδα που αποτελείται από ένα γρά-
φηµα και δύο κορυφές του γραφήµατος µπορεί να θεωρηθεί σαν ένα έγκυρο στιγ-
µιότυπο του προβλήµατος του Συντοµότερου Μονοπατιού. Κάθε ακολουθία κορυ-
φών που αποτελεί ένα συντοµότερο µονοπάτι µεταξύ των κορυφών s και t αποτελεί
µία λύση του προβλήµατος. Επίσης, λύση µπορεί να θεωρηθεί µια κενή ακολουθία
κορυφών, όταν αυτή δηλώνει ότι η t δεν είναι προσπελάσιµη από την s. Επειδή το
συντοµότερο µονοπάτι µεταξύ s και t δεν είναι µοναδικό, ένα στιγµιότυπο του προ-
βλήµατος µπορεί να έχει περισσότερες από µία λύσεις.
Το πρόβληµα του Συντοµότερου Μονοπατιού µεταξύ δύο κορυφών µπορεί να περι-
γραφεί και σαν πρόβληµα βελτιστοποίησης (optimization problem). ∆εδοµένης µιας
τριάδας < G(V, E), s, t >, ζητείται η συντοµότερη ακολουθία κορυφών που σχηµα-
148 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
τίζουν ένα µονοπάτι από την s στην t. Σε αυτή την περίπτωση, αποδεκτή λύση
(feasible solution) είναι κάθε µονοπάτι από την s στην t. Βέλτιστη λύση (optimal
solution) είναι κάθε µονοπάτι από την s στην t µε ελάχιστο µήκος.
Ένας διαφορετικός τρόπος να περιγραφεί το πρόβληµα του Συντοµότερου Μονο-
πατιού είναι, δεδοµένου ενός φυσικού αριθµού k ≥ 0, να εξετάσουµε αν υπάρχει
µονοπάτι από την s στην t µε µήκος το πολύ k. Σε αυτή τη µορφή, ένα στιγµιότυπο
του προβλήµατος καθορίζεται από µία διατεταγµένη τετράδα, η οποία αποτελείται
από ένα γράφηµα G(V, E), δύο κορυφές s, t Œ V και έναν φυσικό αριθµό k ≥ 0. Οι
δυνατές λύσεις του προβλήµατος είναι µόνο δύο: ΝΑΙ, που στο εξής θα συµβολίζε-
ται µε 1 και ΟΧΙ, που στο εξής θα συµβολίζεται µε 0. Κάθε πρόβληµα που διατυπώ-
νεται σε αυτή τη µορφή και έχει σύνολο λύσεων S = {0, 1} ονοµάζεται πρόβληµα
απόφασης (decision problem).
Ορισµός 7.1: Ένα πρόβληµα Π είναι µία δυαδική σχέση που ορίζεται στο καρτε-
σιανό γινόµενο του συνόλου Ι των στιγµιότυπων και του συνόλου S
των λύσεων, Π Õ I ¥ S. Ένα ζεύγος (i, s) Œ Π όταν το i είναι ένα έγκυ-
ρο στιγµιότυπο του Π και το s µία λύση του i. Ένα πρόβληµα ονο-
µάζεται πρόβληµα απόφασης όταν έχει δύο µόνο λύσεις, S = {0, 1}.
Από τα προβλήµατα που µπορούν να λυθούν από έναν υπολογιστή, κάποια λύνονται
µε αποδοτικό τρόπο και θεωρούνται ευεπίλυτα (tractable) και, κάποια άλλα, δεν
λύνονται µε αποδοτικό τρόπο και θεωρούνται δυσεπίλυτα (intractable). Η διάκριση
γίνεται ανάλογα µε την ποσότητα των υπολογιστικών πόρων που απαιτούνται για
την επίλυση ενός προβλήµατος. Όταν υπάρχει ένας αποδοτικός αλγόριθµος (δηλα-
δή ένας αλγόριθµος που απαιτεί εύλογη ποσότητα υπολογιστικών πόρων) για κάποιο
πρόβληµα, τότε αυτό εντάσσεται στην κατηγορία των ευεπίλυτων προβληµάτων.
Όταν για κάποιο πρόβληµα δεν είναι γνωστός κανένας αποδοτικός αλγόριθµος, δεν
είναι προφανές αν αυτό πρέπει να ενταχθεί στα δυσεπίλυτα προβλήµατα. Ο λόγος είναι
ότι µπορεί να υπάρχει αποδοτικός αλγόριθµος για αυτό πρόβληµα, αλλά να µην έχει
ανακαλυφθεί ακόµα. Για παράδειγµα, ο πρώτος αλγόριθµος πολυωνυµικού χρόνου για
το πρόβληµα του γραµµικού προγραµµατισµού ανακαλύφθηκε µόλις στο τέλος της
δεκαετίας του 1970. Ένα πρόβληµα είναι δυσεπίλυτο όταν αποδεδειγµένα δεν µπορεί
να υπάρξει αποδοτικός αλγόριθµος για αυτό. Υπάρχει όµως και µία µεγάλη κατηγο-
ρία σηµαντικών προβληµάτων για τα οποία υπάρχουν ισχυρές ενδείξεις, αλλά όχι
150 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
ώντας την έξοδο του ενός σαν είσοδο του άλλου, το αποτέλεσµα θα είναι ένας αλγό-
ριθµος πολυωνυµικού χρόνου.
¢Ú·ÛÙËÚÈfiÙËÙ· 7.1
Παρά την αδύναµη και, µάλλον, άχαρη εικόνα τους, οι µηχανές Turing µπορούν να
προσοµοιώσουν οποιοδήποτε αλγόριθµο χωρίς σηµαντική υποβάθµιση της απόδο-
σής του. Οι µηχανές Turing θα αποτελέσουν το βασικό υπολογιστικό µοντέλο για
την παρουσίαση της θεωρίας πολυπλοκότητας.
Αρχικά, θα θεωρήσουµε ντετερµινιστικές µηχανές Turing µε πολλαπλές ταινίες
(Multitape Deterministic Turing Machines). Μία Ντετερµινιστική Μηχανή Turing
(DTM) µε πολλαπλές ταινίες έχει k (k ≥ 1) ταινίες από τις οποίες µπορεί να διαβά-
σει και να γράψει συγκεκριµένα σύµβολα. Κάθε ταινία (tape) εκτείνεται απεριόρι-
στα στη µία µόνο κατεύθυνση (π.χ. προς τα δεξιά), και αποτελείται από κελιά (cells)
τα οποία αριθµούνται από τα αριστερά προς τα δεξιά χρησιµοποιώντας τους φυσι-
κούς αριθµούς. Ένα κελί είτε είναι κενό (blank), είτε περιέχει κάποιο στοιχείο ενός
πεπερασµένου αλφάβητου Σ, το οποίο ονοµάζεται αλφάβητο εισόδου ή απλά αλφά-
βητο. Κάθε ταινία έχει µία κεφαλή (tape head) η οποία µπορεί να κινείται κατά µήκος
της ταινίας και να διαβάζει ή να γράφει στο κελί πάνω από το οποίο βρίσκεται. Οι
ενέργειες των κεφαλών καθορίζονται από ένα πεπερασµένο σύνολο εντολών, το
οποίο ονοµάζεται συνάρτηση µετάβασης (transition function).
Κάθε χρονική στιγµή, η µηχανή Turing βρίσκεται σε µία κατάσταση (state). Το σύνο-
λο των επιτρεπτών καταστάσεων είναι πεπερασµένο και, συνήθως, συµβολίζεται µε
Q. ∆εδοµένης µιας κατάστασης από το σύνολο Q και των περιεχόµενων των κελιών
στα οποία βρίσκονται οι κεφαλές, η συνάρτηση µετάβασης προσδιορίζει την επό-
µενη κατάσταση, το σύµβολο που θα γράψει κάθε κεφαλή στο κελί που βρίσκεται
και την κίνηση κάθε κεφαλής. Όσον αφορά στις κινήσεις µιας κεφαλής, αυτή µπο-
ρεί να µετακινηθεί ένα κελί δεξιά (συµβολίζεται µε R), ή ένα κελί αριστερά (συµ-
βολίζεται µε L) ή να µείνει στάσιµη (συµβολίζεται µε S). Ο υπολογισµός µιας µηχα-
νής Turing ξεκινάει από µία ειδική αρχική κατάσταση (initial state) και τερµατίζεται
όταν η µηχανή φτάσει σε κάποιες ειδικές τελικές καταστάσεις (final state).
152 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
¢Ú·ÛÙËÚÈfiÙËÙ· 7.2
Μία µηχανή 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 γράφεται σαν:
βολοσειρά u¢i είναι άπειρη, αλλά αποτελείται από µία πεπερασµένη συµβολοσειρά
του Σ* ακολουθούµενη από έναν άπειρο αριθµό κενών συµβόλων. Άρα, το u¢i είναι
ουσιαστικά, µία πεπερασµένη συµβολοσειρά.
Η αρχική διαµόρφωση (start configuration) της Μ µε είσοδο x είναι (q0, (x, ∆), …, (∆,
∆)). Μία διαµόρφωση αποδοχής (accepting configuration) έχει σαν κατάσταση ΝΑΙ,
και µία διαµόρφωση απόρριψης (rejecting configuration) έχει σαν κατάσταση ΟΧΙ.
∆εδοµένης µιας διαµόρφωσης µε τρέχουσα κατάσταση q που δεν είναι τελική, η
συνάρτηση µετάβασης δ ορίζει µία νέα διαµόρφωση που αντιστοιχεί στο επόµενο βήµα
της Μ. Η έννοια της µετάβασης από µία διαµόρφωση σε µία άλλη µπορεί να οριστεί
τυπικά χρησιµοποιώντας τη δυαδική σχέση Æ, η οποία ορίζεται σε ζεύγη διαµορφώ-
σεων και καλείται σχέση παραγωγής (yield). Συγκεκριµένα, για κάθε q Œ Q – F,
όταν d ( q,( a1 , a2 ,..., ak )) = ( p,( b1 , b2 ,..., bk ),( D1 , D2 ,..., Dk )) και για κάθε ταινία i, 1 £
i £ k, ισχύει µία από τις παρακάτω συνθήκες:
• Αν Di = L, το vi προκύπτει από το ui µε αφαίρεση του τελευταίου συµβόλου, και
v¢i=bi◊u¢i.
• Αν Di = R, το vi προκύπτει από το ui µε αντικατάσταση του τελευταίου συµβόλου
από το bi και συµπλήρωση µε το πρώτο σύµβολο του u¢i, και το v¢i προκύπτει από
το u¢i µε αφαίρεση του πρώτου συµβόλου.
• Αν Di = S, το vi προκύπτει από το ui µε αντικατάσταση του τελευταίου συµβόλου
από το bi, και v¢i = u¢i.
Η σχέση Æ είναι µία µερική συνάρτηση (partial function) από το σύνολο των δια-
µορφώσεων στο σύνολο των διαµορφώσεων. Με βάση τον παραπάνω φορµαλισµό,
λέµε ότι η DTM Μ αποδέχεται (απορρίπτει) µία συµβολοσειρά x Œ Σ* όταν υπάρχει
µία ακολουθία διαµορφώσεων C1, C2, …, Cn τέτοια, ώστε το C1 είναι η αρχική δια-
µόρφωση της Μ µε είσοδο x, για κάθε i, 1 £ i < n, η διαµόρφωση Ci παράγει τη δια-
µόρφωση Ci + 1 (Ci Æ Ci + 1), και το Cn είναι µία διαµόρφωση αποδοχής (απόρριψης).
Η ακολουθία C1, C2, …, Cn ονοµάζεται υπολογισµός αποδοχής (απόρριψης).
Επίσης, αν f είναι µία µερική συνάρτηση από το Σ* στο Σ*, λέµε ότι µία DTM M υπο-
λογίζει (computes) την f όταν, αν f(x) = y, τότε Μ(x) = y, και αν το f(x) δεν ορίζεται,
τότε η M(x) δεν τερµατίζει.
7.2 ¡∆∂∆∂ƒªπ¡π™∆π∫∂™ ª∏Ã∞¡∂™ TURING 155
λοσειρά x, που αποτελεί την είσοδο της Μ. Η x διαχωρίζεται από την Μ µε «;». Τα
σύµβολα της συµβολοσειράς x, επίσης, αναπαρίστανται στο δυαδικό σύστηµα και
διαχωρίζονται µε «;» . Εποµένως, το αλφάβητο της U περιλαµβάνει, εκτός από το
κενό σύµβολο, τα δυαδικά ψηφία 0 και 1 και τα σύµβολα «(», «)» και «;».
Υποθέτουµε ότι η U έχει δύο ταινίες, από τις οποίες η πρώτη περιέχει την κωδικο-
ποίηση της Μ και της συµβολοσειράς x και η δεύτερη χρησιµοποιείται για την απο-
θήκευση της τρέχουσας διαµόρφωσης της Μ. Κάθε διαµόρφωση της Μ κωδικοποι-
είται σαν ( q;(u1; u1¢);(u2 ; u2¢ );...;(uk ; uk¢ )) , όπου η κατάσταση q και όλα τα σύµβολα,
εκτός από τα διαχωριστικά, αναπαριστώνται στο δυαδικό σύστηµα. Στην αρχή της
προσοµοίωσης, η δεύτερη ταινία της U περιέχει την αρχική διαµόρφωση της Μ.
Για την προσοµοίωση ενός βήµατος της Μ, η U διαβάζει την τρέχουσα διαµόρφω-
ση της Μ από τη δεύτερη ταινία και ανατρέχει στην κωδικοποίηση της δ (που είναι
αποθηκευµένη στην πρώτη ταινία) για να εντοπίσει τον κανόνα µετάβασης που εφαρ-
µόζεται στην τρέχουσα διαµόρφωση. Στη συνέχεια, η U εκτελεί τον κανόνα µετά-
βασης, ενηµερώνοντας κατάλληλα την κωδικοποίηση της τρέχουσας διαµόρφωσης
της Μ στη δεύτερη ταινία. Από την περιγραφή της λειτουργίας της U, όταν η Μ τερ-
µατίζει µε είσοδο x, η U τερµατίζει στην ίδια κατάσταση. Επίσης, όταν η Μ δεν τερ-
µατίζει µε είσοδο x, ούτε η U τερµατίζει.
Στην αρχή του υπολογισµού της, η U ελέγχει αν τα περιεχόµενα της πρώτης της ται-
νίας (ταινίας εισόδου) βρίσκονται στην προκαθορισµένη µορφή και αντιστοιχούν
στην έγκυρη κωδικοποίηση µιας DTM Μ και µιας συµβολοσειράς x που αποτελεί
τη συµβολοσειρά εισόδου για την Μ. Αν η είσοδος της U δεν ικανοποιεί τις παρα-
πάνω απαιτήσεις, η U δεν τερµατίζει µπαίνοντας σε έναν αέναο βρόγχο (π.χ. µετα-
κινώντας τις κεφαλές της συνεχώς προς τα δεξιά).
Από την κατασκευή της, η καθολική DTM U µπορεί να προσοµοιώσει κάθε άλλη
DTM Μ για κάθε δυνατή είσοδο x της Μ. Αυτή είναι µια πολύ σηµαντική ιδιότητα
του υπολογιστικού µοντέλου των Ντετερµινιστικών Μηχανών Turing, η οποία απο-
δεικνύει ότι όντως πρόκειται για ένα προγραµµατιζόµενο υπολογιστικό µοντέλο γενι-
κού σκοπού. Με απλά λόγια, η U δέχεται σαν «πρόγραµµα» τη µηχανή Μ και η είσο-
δος του «προγράµµατος» είναι η συµβολοσειρά x.
Η δυνατότητα µιας κατάλληλα ορισµένης DTM να προσοµοιώνει τη λειτουργία
άλλων DTM είναι θεµελιώδης και χρησιµοποιείται στην απόδειξη πολλών σηµαντι-
κών αποτελεσµάτων της Θεωρίας Υπολογιστικής Πολυπλοκότητας, µεταξύ των
οποίων είναι ότι το Πρόβληµα του Τερµατισµού (Halting Problem) και αρκετά συνα-
7.2 ¡∆∂∆∂ƒªπ¡π™∆π∫∂™ ª∏Ã∞¡∂™ TURING 157
Μια γλώσσα L είναι DTM – αποδεκτή (DTM – acceptable) αν υπάρχει µία DTM Μ που
αποδέχεται όλες τις συµβολοσειρές που ανήκουν στην L, και µόνο αυτές. ∆ηλαδή, για
κάθε x œ L, είτε η Μ θα απορρίπτει το x, είτε η Μ δεν θα τερµατίζει µε είσοδο x.
Μία γλώσσα L ενός αλφάβητου Σ είναι DTM – αποφασίσιµη (DTM – decidable) αν
υπάρχει µία DTM M που τερµατίζει για κάθε x Œ Σ* και αποδέχεται όλες τις συµ-
βολοσειρές x Œ L, και απορρίπτει όλες τις συµβολοσειρές x œ L. ∆ηλαδή, αν Μ είναι
µία DTM που αποφασίζει τη γλώσσα L Õ Σ*, για κάθε x Œ Σ*, Μ(x) = ΝΑΙ, αν x Œ L,
και M(x) = ΟΧΙ, αν x œ L.
Ένα πολύ γνωστό παράδειγµα γλώσσας που δεν είναι DTM – αποφασίσιµη είναι αυτή
που αντιστοιχεί στο πρόβληµα του τερµατισµού µιας µηχανής Turing. Συγκεκριµέ-
να, δεδοµένης µιας DTM M και µιας εισόδου x για την Μ, δεν υπάρχει DTM που να
αποφασίζει αν η M τερµατίζει µε είσοδο x. Από την άλλη πλευρά, η παραπάνω γλώσ-
σα είναι DTM – αποδεκτή και, συνεπώς, το σύνολο των DTM – αποφασίσιµων γλωσ-
σών είναι γνήσιο υποσύνολο του συνόλου των DTM – αποδεκτών γλωσσών.
Το αξίωµα των Church – Turing πρεσβεύει ότι κάθε γλώσσα / συνάρτηση που µπο-
ρεί να αποφασιστεί / υπολογιστεί από έναν αλγόριθµο σε ένα οποιοδήποτε υπολο-
γιστικό µοντέλο µπορεί να υπολογιστεί και από µια Ντετερµινιστική Μηχανή Turing.
Το αξίωµα έχει αποδειχθεί για όλα τα υπολογιστικά µοντέλα που έχουν κατά και-
ρούς προταθεί (π.χ. λ – definability του Church, µ – αναδροµικές συναρτήσεις του
Godel, γενικές αναδροµικές συναρτήσεις των Herbrand – Godel, κανονικά συστή-
µατα του Post, αλγόριθµοι του Markov), ενώ κάθε συστηµατική προσπάθεια για να
αυξηθεί η κλάση των γλωσσών / συναρτήσεων που µπορούν να υπολογιστούν / απο-
φασιστούν από τις Ντετερµινιστικές Μηχανές Turing δεν είχε επιτυχία. Το αξίωµα
των Church – Turing τεκµηριώνει την επιλογή των Ντετερµινιστικών Μηχανών
Turing σαν βασικό υπολογιστικό µοντέλο για τη θεωρία πολυπλοκότητας.
158 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
(2) Αν µία γλώσσα L είναι DTM – αποφασίσιµη, και το συµπλήρωµά της L είναι
γλώσσα DTM – αποφασίσιµη.
(3) Μια γλώσσα L είναι DTM – αποφασίσιµη αν και µόνο αν τόσο η L όσο και το
¢Ú·ÛÙËÚÈfiÙËÙ· 7.3
Έστω L µία γλώσσα που γίνεται αποδεκτή από µία DTM Μ µε χρονική πολυπλο-
κότητα t(n), όπου η t(n) είναι µία συνάρτηση περιορισµού. Αποδείξτε ότι η L είναι
και DTM – αποφασίσιµη σε χρόνο Ο(t(n)).
Ένα σηµαντικό ερώτηµα σχετικά µε τις κλάσεις DTIME[t(n)] είναι αν η αύξηση της
τάξης µεγέθους της συνάρτησης t(n) επηρεάζει το µέγεθος της κλάσης. Το ακόλου-
θο θεώρηµα, που είναι γνωστό και σαν Θεώρηµα της Ιεραρχίας των Κλάσεων Χρο-
νικής Πολυπλοκότητας (Time Hierarchy Theorem), δείχνει ότι µια αύξηση της τάξης
µεγέθους της t(n) κατά ω(log t(n)) έχει σαν αποτέλεσµα την προσθήκη µιας, τουλά-
χιστον, γλώσσας στην κλάση DTIME[t(n)].
160 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
Θεώρηµα 7.1: Έστω t1(n) και t2(n) δύο συναρτήσεις περιορισµού. Αν t2(n) =
ω(t1(n) log t1(n)), η κλάση DTIME[t1(n)] είναι γνήσιο υποσύνολο
της κλάσης DTIME[t2(n)].
Απόδειξη: Θα αποδείξουµε το θεώρηµα ορίζοντας µία γλώσσα L του Σ = {0, 1}
η οποία µπορεί να αποφασιστεί από µία DTM t2(n) – χρόνου, αλλά
όχι και από µία DTM t1(n) – χρόνου. Συγκεκριµένα, η L αποτελείται
από όλα τα x Œ Σ*, |x| = n, που έχουν τη µορφή 1*0 <Τ>, όπου <Τ>
είναι η δυαδική κωδικοποίηση µιας DTM Τ µε δύο ταινίες που απορ-
ρίπτει το x σε t2(n) βήµατα. Η DTM Μ, της οποίας η λειτουργία περι-
γράφεται στη συνέχεια, αποφασίζει την L σε χρόνο t2(n).
(1) Η Μ χρησιµοποιεί ένα ρολόι ώστε να σταµατά µετά από το πολύ t2(n) βήµατα.
Αυτό είναι εφικτό, αφού υποθέσαµε ότι η t2(n) είναι συνάρτηση περιορισµού.
(2) Παράλληλα µε το ρολόι, η Μ:
(a) Ελέγχει αν το x έχει τη µορφή 1*0<Τ>, όπου <Τ> είναι η δυαδική κωδι-
κοποίηση µιας DTM Τ µε δύο ταινίες. Αν το x δεν είναι της µορφής 1*0<Τ>,
η Μ επιστρέφει ΟΧΙ. ∆ιαφορετικά, αποµονώνει το <Τ> και το αποθηκεύει σε
µία από τις ταινίες εργασίας.
(b) Προσοµοιώνει τη λειτουργία της Τ µε είσοδο x. Αν η προσοµοίωση µπο-
ρεί να ολοκληρωθεί σε t2(n) βήµατα και T(x) = ΟΧΙ, η Μ επιστρέφει ΝΑΙ. ∆ια-
φορετικά, η Μ επιστρέφει ΟΧΙ.
Από κατασκευή, η Μ πάντα ολοκληρώνει τον υπολογισµό της µετά από το πολύ
t2(n) βήµατα. Άρα, L = L(M) Œ DTIME[t2(n)]. Η απόδειξη ολοκληρώνεται απο-
δεικνύοντας ότι L œ DTIME[t1(n)].
Με σκοπό να καταλήξουµε σε άτοπο υποθέτουµε ότι L Œ DTIME[t1(n)]. Μπορεί
να αποδειχθεί ότι για κάθε DTM µε πολλαπλές ταινίες και χρόνο εκτέλεσης t(n),
υπάρχει µία DTM µε 2 ταινίες και χρόνο εκτέλεσης Ο(t(n) log t(n)) που προσο-
µοιώνει την πρώτη. Εποµένως, έστω µία DTM Τ¢ µε δύο ταινίες, η οποία αποφα-
σίζει τη L σε χρόνο c2 t1(n) log t1(n), για κάποια σταθερά c2 > 0.
Το στάδιο (2.a) της M που, επίσης, αποφασίζει την L χρειάζεται χρόνο n + c1, όπου
c1 είναι ο αριθµός των βηµάτων για την αναγνώριση και αποµόνωση του <Τ¢>. Το
στάδιο (2.b) της Μ χρειάζεται χρόνο c3t1(n) logt1(n), για κάποια σταθερά c3 > 0,
για να ολοκληρώσει την προσοµοίωση της Τ¢ µε είσοδο x. Αλλά αφού t2(n) =
ω(t1(n) log t1(n)), είναι t2(n) ≥ n + c1 + c3t1(n) log t1(n), για αρκούντως µεγάλες
τιµές του n.
7 . 3 Ã ƒ √ ¡ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞ ∫ ∞ π ∏ ∫ § ∞ ™ ∏ P 161
Άρα, για κάθε είσοδο x µε αρκούντως µεγάλο πρόθεµα 1*0, η Μ µπορεί να ολο-
κληρώσει την προσοµοίωση της Τ¢(x) πριν συµπληρωθούν t2(n) βήµατα, δηλαδή
πριν το ρολόι αναγκάσει την Μ να τερµατίσει. Όµως, για κάθε τέτοιο x, ισχύουν
οι παρακάτω ισοδυναµίες:
x Œ L ¤ Τ¢(x) = ΝΑΙ ¤ M(x) = ΟΧΙ ¤ x œ L
Εποµένως, υποθέτοντας ότι L Œ DTIME[t1(n)] καταλήξαµε σε άτοµο. Άρα, L œ
DTIME[t1(n)], και DTIME[t1(n)] Ã DTIME[t2(n)].
Ένα ενδιαφέρον πόρισµα του Θεωρήµατος 7.1 είναι η ιεραρχία των κλάσεων
DTIME[nk], για k = 1, 2, 3, …. Συγκεκριµένα, ισχύει ότι:
DTIME[n] Ã DTIME[n2] Ã DTIME[n3] Ã L
P = U k ≥0 DTIME[n k ] , και
EXP = U k ≥0 DTIME 2 n[ ]k
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
ÿx
3
x1 x3
ÿx ÿx
1 2
™¯‹Ì· 7.1
Ένα παράδειγµα
γραφήµατος
x2 Gφ(V, Ε).
και ρ(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), ο παραπάνω
αλγόριθµος αποφασίζει αν η φ είναι ικανοποιήσιµη σε πολυωνυµικό χρόνο.
Αποδείξτε ότι το P είναι κλειστό ως προς την ένωση, την τοµή και το συµπλήρω-
µα, δηλαδή ότι αν δύο γλώσσες L1, L2 Œ P, τότε και L1 » L2, L1 « L2, L1 Œ P.
7 . 4 ∞ ¡ ∞ ° ø ° ∏ ∫ ∞ π ¶ § ∏ ƒ √ ∆ ∏ ∆∞ 165
Aλγόριθµος για Π1
R(x)
x R Aλγόριθµος για Π2 NAI/OXI
™¯‹Ì· 7.2
Μια αναγωγή R
του προβλήµατος Π1
στο πρόβληµα Π2.
166 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
¢Ú·ÛÙËÚÈfiÙËÙ· 7.4
Αποδείξτε ότι η πολυωνυµική αναγωγή είναι µεταβατική, δηλαδή ότι, για κάποια
προβλήµατα Π1, Π2, Π3, αν Π1 µ Π2 και Π2 µ Π3, τότε Π1 µ Π3.
¢Ú·ÛÙËÚÈfiÙËÙ· 7.5
Αποδείξτε ότι η κλάση P είναι κλειστή ως προς την πολυωνυµική αναγωγή, δηλα-
δή αν κάποιο πρόβληµα Π2 Œ P και κάποιο πρόβληµα Π1 ανάγεται πολυωνυµικά
στο Π2, τότε και Π2 Œ P.
Από τον ορισµό, δεν είναι καθόλου προφανές ότι υπάρχουν πλήρη προβλήµατα για
κάθε κλάση. Παρόλα αυτά, µπορεί να αποδειχθεί ότι αρκετά γνωστά προβλήµατα
είναι πλήρη για την κλάση P, ενώ στο επόµενο κεφάλαιο θα αποδείξουµε ότι µερι-
κά οικεία προβλήµατα είναι πλήρη για µια άλλη πολύ σηµαντική κλάση, το NP.
Τα πλήρη προβλήµατα αποτελούν µια κεντρική έννοια και ένα πολύ σηµαντικό µεθο-
δολογικό εργαλείο για τη θεωρία πολυπλοκότητας. Η πολυπλοκότητα ενός υπολο-
γιστικού προβλήµατος θεωρείται ότι έχει καθοριστεί όταν αυτό αποδειχθεί πλήρες
για κάποια κλάση. Από την άλλη πλευρά, τα πλήρη προβλήµατα συνοψίζουν την
υπολογιστική δυσκολία όλων των προβληµάτων κάθε κλάσης και αποτελούν το σύν-
δεσµο των κλάσεων πολυπλοκότητας µε τη θεωρία αλγορίθµων και τις εφαρµογές
της Επιστήµης των Υπολογιστών.
Για παράδειγµα, η ύπαρξη σηµαντικών πρακτικών προβληµάτων που είναι πλήρη
για κάποια κλάση προσδίδει στην κλάση πρακτική αξία που, συνήθως, δεν είναι
ξεκάθαρη από τον ορισµό της. Αντίστροφα, αν µια κλάση δεν έχει σηµαντικά ή,
έστω, γνωστά πρακτικά πλήρη προβλήµατα, αυτόµατα η κλάση θεωρείται θεωρητι-
κό κατασκεύασµα χωρίς ουσιαστικό περιεχόµενο.
Παρόλα αυτά, η έννοια της πληρότητας, συνήθως, χρησιµοποιείται για την απόδει-
ξη αρνητικών αποτελεσµάτων της εξής µορφής: Αν ένα πρόβληµα Π είναι πλήρες
για µία κλάση C, τότε θεωρείται απίθανο το Π να ανήκει σε κάποια πιο αδύναµη
κλάση C¢ Õ C, δηλαδή σε κάποια κλάση που περιλαµβάνει ευκολότερα προβλήµα-
τα. Ο λόγος είναι ότι αν η C¢ είναι κλειστή ως προς την αναγωγή και το Π ανήκει
στη C¢, τότε η C πρέπει να ταυτίζεται µε την πιο αδύναµη κλάση C¢, δηλαδή πρέπει
η C να καταπίπτει (collapse) στην C¢.
168 K E º A § A I O 7 : ∂ π ™ ∞ ° ø ° ∏ ™ ∆ ∏ ¡ À ¶ √ § √ ° π ™ ∆ π ∫ ∏ ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
¢Ú·ÛÙËÚÈfiÙËÙ· 7.6
Αν δύο κλάσεις C και C¢ είναι κλειστές ως προς την αναγωγή, και υπάρχει ένα πρό-
βληµα Π που είναι πλήρες τόσο για τη C όσο και για τη C¢, τότε C = C¢.
™‡ÓÔ„Ë
Σε αυτό το κεφάλαιο ορίστηκαν µερικές κεντρικές έννοιες της θεωρίας υπολογιστι-
κής πολυπλοκότητας. Στη θεωρία πολυπλοκότητας, τα ίδια τα υπολογιστικά προβλή-
µατα αποτελούν αντικείµενο µελέτης. Κάθε υπολογιστικό πρόβληµα µπορεί να µετα-
τραπεί σε πρόβληµα απόφασης, και µέσω κατάλληλης κωδικοποίησης, να αντιστοι-
χηθεί σε µία τυπική γλώσσα.
Μεταξύ άλλων, η υπολογιστική πολυπλοκότητα διαχωρίζει τα προβλήµατα σε ευεπί-
λυτα και δυσεπίλυτα. Ο διαχωρισµός αυτός γίνεται µε βάση την αποδοτικότητα των
αλγορίθµων που λύνουν ένα πρόβληµα. Το αξίωµα των Cook – Karp ταυτίζει τα ευε-
πίλυτα προβλήµατα µε αυτά που λύνονται από αλγόριθµους πολυωνυµικού χρόνου.
Το βασικό υπολογιστικό µοντέλο για τη θεωρία πολυπλοκότητας είναι οι Ντετερµινιστι-
κές Μηχανές Turing (DTM) µε πολλαπλές ταινίες, οι οποίες αποτελούν το θεωρητικό
ισοδύναµο των υπολογιστών που εκτελούν µόνο ένα προκαθορισµένο πρόγραµµα.
Ένα βασικό κριτήριο πολυπλοκότητας είναι αυτό του υπολογιστικού χρόνου που απαι-
τείται για την επίλυση ενός προβλήµατος. Η κλάση DTIME[t(n)] περιλαµβάνει όλα
τα προβλήµατα που λύνονται από µια DTM σε χρόνο Ο(t(n)). Το Θεώρηµα της Ιεραρ-
χίας των Κλάσεων Χρονικής Πολυπλοκότητας αποδεικνύει ότι κάθε υπερ – λογαριθ-
µική αύξηση της συνάρτηση t(n) επιτρέπει την προσθήκη και νέων προβληµάτων στην
αρχική κλάση. Το P είναι η κλάση των προβληµάτων που λύνονται σε πολυωνυµικό
χρόνο, και το EXP είναι η κλάση των προβληµάτων που λύνονται σε εκθετικό χρόνο.
Η πολυωνυµική αναγωγή επιτρέπει την µερική διάταξη των προβληµάτων µε κριτή-
ριο την υπολογιστική τους δυσκολία. Όταν ένα πρόβληµα Π1 ανάγεται πολυωνυµικά
σε ένα πρόβληµα Π2, το Π2, είναι τουλάχιστον τόσο δύσκολο όσο το Π1. Ένα πρό-
βληµα Π λέγεται πλήρες για κάποια κλάση πολυπλοκότητας C, όταν ανήκει στην
κλάση, και κάθε άλλο πρόβληµα που ανήκει στην C ανάγεται στο Π. ∆ηλαδή, το Π
είναι ένα από τα δυσκολότερα προβλήµατα της C.
B I B § I O ° PA º I A 169
µÈ‚ÏÈÔÁÚ·Ê›·
™ÎÔfi˜
∫ ∂
8
º
Σε αυτό το κεφάλαιο, αφού περιγράψουµε την ιδέα του µη ντετερµινισµού και ορί-
σουµε το υπολογιστικό µοντέλο των Μη Ντετερµινιστικών Μηχανών Turing, θα ορί-
σουµε την κλάση NP και θα µελετήσουµε τις σηµαντικές εφαρµογές της στο χώρο της
συνδυαστικής βελτιστοποίησης.
∞ § ∞ π √
¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·
Μετά τη µελέτη αυτού του κεφαλαίου ο αναγνώστης θα είναι σε θέση:
• Να ορίζει µια Μη Ντετερµινιστική Μηχανή Turing.
• Να ορίζει την κλάση NP µε δύο διαφορετικούς, ισοδύναµους τρόπους.
• Να αποδεικνύει ότι ένα πρόβληµα ανήκει στο NP.
• Να περιγράφει τη σχέση των κλάσεων P και NP και τις αλγοριθµικές συνέπειες
της NP – Πληρότητας.
ŒÓÓÔȘ ÎÏÂȉȿ
• Μη Ντετερµινισµός και Μη Ντετερµι- Turing.
νιστική Μηχανή Turing • Κλάσεις NTIME[◊] και NP
• Αποφασίσιµες και αποδεκτές γλώσσες • NP – Πληρότητα και σχέση κλάσεων
από Μη Ντετερµινιστικές Μηχανές P και NP
∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ
Ό,τι έχει παρουσιαστεί µέχρι αυτό το σηµείο του βιβλίου βασίζεται στα ρεαλιστικά
υπολογιστικά µοντέλα της Μηχανής Άµεσης Προσπέλασης Μνήµης (RAM) και της
Ντετερµινιστικής Μηχανής Turing (DTM). Σε αντίθεση µε τα προηγούµενα, το υλικό
αυτού του κεφαλαίου βασίζεται στο µη ρεαλιστικό υπολογιστικό µοντέλο των Μη Ντε-
τερµινιστικών Μηχανών Turing (Non – Deterministic Turing Machines – NDTM).
Αντί του µονοσήµαντα ορισµένου (ντετερµινιστικού) τρόπου µε τον οποίο εξελίσσε-
ται ο υπολογισµός σε µία DTM, δεδοµένης µιας συµβολοσειράς εισόδου, ο υπολογι-
σµός µίας NDTM πολυωνυµικού χρόνου µπορεί να εξελιχθεί µε έναν εκθετικό αριθ-
µό διαφορετικών (αλλά όχι ανεξάρτητων) τρόπων. Η NDTM αποδέχεται µία γλώσ-
172 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
σα αν ένας τουλάχιστον από αυτούς τους διαφορετικούς τρόπους εξέλιξης του υπο-
λογισµού καταλήγει σε αποδοχή.
Χονδρικά, µία NDTM πολυωνυµικού χρόνου είναι σαν να αποτελείται από έναν εκθε-
τικά µεγάλο αριθµό διαφορετικών (αλλά συσχετιζόµενων) DTM. Για κάθε είσοδο, η
NDTM διαλέγει από αυτές τις διαφορετικές DTM και επικαλείται αυτήν που έχει το
«πλέον επιθυµητό» αποτέλεσµα. ∆ιαφορετικά, η NDTM προσοµοιώνει όλες τις δια-
φορετικές DTM που την αποτελούν στο χρόνο που χρειάζεται για να ολοκληρωθεί ο
υπολογισµός της πιο αργής από αυτές, και επιστρέφει το «καλύτερο αποτέλεσµα».
Θα δούµε ότι κάθε NDTM µπορεί να προσοµοιωθεί από µία DTM µε εκθετική επι-
βάρυνση στο χρόνο εκτέλεσης. Αν αυτή η προσοµοίωση µπορεί να εκτελεστεί µε
πολυωνυµική µόνο επιβάρυνση ή όχι, αποτελεί, ίσως, το πιο γνωστό και σηµαντικό
ανοικτό ερώτηµα στη Θεωρητική Επιστήµη των Υπολογιστών. Μια από τις πιο γνω-
στές διατυπώσεις αυτού του ερωτήµατος αφορά στην ισότητα των κλάσεων πολυ-
πλοκότητας P και NP.
Από την παραπάνω αδρή περιγραφή γίνεται φανερό γιατί το µοντέλο των Μη Ντε-
τερµινιστικών Μηχανών Turing δεν αποτελεί ένα ρεαλιστικό υπολογιστικό µοντέλο.
Άλλωστε, ο µη ντετερµινισµός δεν έχει στόχο να αποτελέσει ένα µαθηµατικό µοντέ-
λο περιγραφής µιας συγκεκριµένης, πρακτικής ή ιδεατής, µορφής υπολογισµού. Ο
λόγος που ο µη ντετερµινισµός αποτελεί αντικείµενο διεξοδικής µελέτης στη Θεωρία
Πολυπλοκότητας είναι οι εφαρµογές του σε άλλες περιοχές της Επιστήµης των Υπο-
λογιστών, όπως η Μαθηµατική Λογική, η Τεχνητή Νοηµοσύνη και η Συνδυαστική
Βελτιστοποίηση. Η κλάση NP, µε τα πολλά και σηµαντικά πλήρη και δύσκολα προ-
βλήµατα, αποτελεί µια από τις βασικές εφαρµογές του µη ντετερµινισµού στη περιο-
χή της Συνδυαστικής Βελτιστοποίησης (Combinatorial Optimization).
Το κεφάλαιο αυτό περιέχει τις παρακάτω ενότητες:
8.1. Μη Ντετερµινιστικές Μηχανές Turing
8.2. Η Κλάση NP
8.3. NP–Πληρότητα
8.1 ª∏ ¡∆∂∆∂ƒªπ¡π™∆π∫∂™ ª∏Ã∞¡∂™ TURING 173
Η αιτία που η ιδέα του µη ντετερµινισµού έχει σαν αποτέλεσµα ένα ελάχιστα ρεαλι-
στικό, αλλά πολύ ισχυρό υπολογιστικό µοντέλο έγκειται στη µικρή εξάρτηση του υπο-
λογισµού και της εξόδου µίας NDTM από τη συµβολοσειρά εισόδου. Σε αντίθεση µε
τα ντετερµινιστικά υπολογιστικά µοντέλα, όπου κάθε είσοδος αντιστοιχεί µονοσή-
µαντα σε µία ακολουθία υπολογισµού και διαµόρφωση εξόδου, κάθε είσοδος µιας
NDTM επιτρέπει την επιλογή ανάµεσα σε πολλές διαφορετικές ακολουθίες υπολογι-
σµών (computation paths) και διαµορφώσεις εξόδου. Από όλες τις διαφορετικές, επι-
τρεπτές διαµορφώσεις εξόδου, η NDTM επιλέγει κάθε φορά την «πλέον επιθυµητή».
Συγκεκριµένα, λέµε ότι µία NDTM Ν αποδέχεται µία συµβολοσειρά εισόδου x Œ Σ*,
όταν µία τουλάχιστον από τις επιτρεπτές ακολουθίες υπολογισµών της Ν(x) είναι υπο-
λογισµός αποδοχής (accepting computation), δηλαδή καταλήγει σε κατάσταση τερ-
µατισµού ΝΑΙ. Αντίστροφα, για να απορριφθεί µια συµβολοσειρά εισόδου πρέπει όλες
οι επιτρεπτές ακολουθίες υπολογισµών να είναι είτε υπολογισµοί απόρριψης (rejecting
174 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
q0
Ύψος∆έντρου=
™¯‹Ì· 8.1
O Xρόνος Yπολογισµού
Παράδειγµα δέντρου
υπολογισµών µιας
NDTM. Η χρονική O O
πολυπλοκότητα της
µηχανής δίνεται από
το ύψος του δέντρου. N O N O
λεί µια σωστή απόδειξη για αυτό. Αντίστροφα, ένα θεώρηµα δεν ισχύει αν υπάρχει
ένα και µόνο παράδειγµα που το διαψεύδει. Αυτή η ασυµµετρία στον τρόπο µε τον
οποία µια 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: Έστω µία γλώσσα L που αποφασίζεται από µια NDTM Ν σε χρόνο
t(n). Η ίδια γλώσσα µπορεί να αποφασιστεί από µία DTM Μ µε 3
ταινίες σε χρόνο Ο(ct(n)), όπου c > 1 είναι µια σταθερά που εξαρ-
τάται από την Ν.
176 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
∆εδοµένου του ορίου f(n) στο µήκος κάθε ακολουθίας υπολογισµών της Ν, ο χρό-
νος που χρειάζεται η Μ για να ολοκληρώσει την προσοµοίωση είναι ανάλογος του
συνολικού αριθµού των διαφορετικών ακολουθιών για τις οποίες η Μ προσοµοι-
ώνει την Ν. ∆ηλαδή, η χρονική πολυπλοκότητα της Μ είναι
Ê
 ˆ
( )
f ( n)
O d t = O d f ( n ) +1 .
Ë t =1 ¯
Μια σηµαντική συνέπεια του Θεωρήµατος 8.1 είναι ότι το σύνολο των γλωσσών που
γίνονται αποδεκτές / αποφασίζονται από Μη Ντετερµινιστικές Μηχανές Turing ταυ-
τίζεται µε το σύνολο των γλωσσών που γίνονται αποδεκτές / αποφασίζονται από τις
Ντετερµινιστικές Μηχανές Turing. ∆ηλαδή η επαύξηση µε ένα τόσο ισχυρό χαρα-
κτηριστικό όπως ο µη ντετερµινισµός δεν προσθέτει τίποτα στο σύνολο των γλωσ-
σών που αναγνωρίζονται από τις Ντετερµινιστικές Μηχανές Turing. Από αυτή την
άποψη, το Θεώρηµα 8.1 µπορεί να θεωρηθεί σαν ένα ακόµη τεκµήριο υπέρ της θέσης
των Church – Turing.
¢Ú·ÛÙËÚÈfiÙËÙ· 8.1
8.2 ∏ ÎÏ¿ÛË NP
¢Ú·ÛÙËÚÈfiÙËÙ· 8.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}.
Το Θεώρηµα 8.2 αποτελεί τον καλύτερο ίσως τρόπο να κατανοήσουµε την κλάση NP.
Σύµφωνα µε το Θεώρηµα 8.2, κάθε γλώσσα / πρόβληµα στο NP έχει µια αξιοσηµεί-
ωτη ιδιότητα: Για κάθε είσοδο x που ανήκει στη γλώσσα, υπάρχει τουλάχιστον ένα
«πιστοποιητικό» y πολυωνυµικού µήκους, το οποίο µπορεί να εύκολα να ελεγχθεί από
µία DTM πολυωνυµικού χρόνου, επιβεβαιώνοντας το γεγονός ότι το x είναι µέλος της
γλώσσας. Αντίθετα, κανένα τέτοιο «πιστοποιητικό» y δεν υπάρχει για τα x που δεν ανή-
κουν στη γλώσσα. Αν και δεν ξέρουµε πως να υπολογίζουµε ένα τέτοιο «πιστοποιητι-
κό» σε πολυωνυµικό (ντετερµινιστικό) χρόνο, ξέρουµε ότι κάθε είσοδος x ανήκει στη
γλώσσα αν και µόνο αν υπάρχει ένα τέτοιο «πιστοποιητικό» y για το γεγονός αυτό.
Για παράδειγµα, το «πιστοποιητικό» ότι µια λογική πρόταση φ είναι ικανοποιήσιµη
(δηλαδή ανήκει στη γλώσσα που αποτελείται από τις ικανοποιήσιµες λογικές προ-
τάσεις σε συζευκτική κανονική µορφή) είναι µία ανάθεση τιµών στις λογικές µετα-
βλητές που ικανοποιεί τη φ. Μια τέτοια ανάθεση τιµών έχει µήκος ίσο µε τον αριθ-
µό των µεταβλητών της φ και, όταν είναι διαθέσιµη, είναι εύκολο να επιβεβαιωθεί
ότι ικανοποιεί τη φ. Το «πιστοποιητικό» ότι ένα στιγµιότυπο του Προβλήµατος του
Περιοδεύοντος Πωλητή ανήκει στη γλώσσα που αποτελείται από όλα τα στιγµιότυ-
πα που έχουν λύσεις / περιοδείες µε µήκος το πολύ Β, είναι µία περιοδεία µε µήκος
που δεν ξεπερνά το Β. Μια περιοδεία δεν είναι παρά µια αναδιάταξη των σηµείων
του προβλήµατος, και το µήκος της µπορεί εύκολα να υπολογισθεί και να συγκριθεί
µε το Β σε γραµµικό χρόνο.
Αποδείξτε ότι το 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 – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
Αντίστροφα, αν υπάρχει κάποιο πρόβληµα στο NP που δεν ανήκει στο P, δηλα-
δή P π NP, τότε κανένα NP – πλήρες πρόβληµα δεν µπορεί να λύνεται σε πολυω-
νυµικό χρόνο, γιατί µε βάση τον συλλογισµό της προηγούµενης παραγράφου, θα
καταλήγαµε σε άτοπο.
NP-Πλήρη
NP Προβλήµατα ™¯‹Ì· 8.2
Η σχέση
των κλάσεων P, NP,
και του συνόλου
των προβληµάτων
P
που είναι πλήρη για
το NP, εφόσον
P π NP.
182 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
Έστω δύο γλώσσες 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.
Έχοντας επιχειρηµατολογήσει για τις πολλές και σηµαντικές εφαρµογές της θεωρίας
της NP – πληρότητας, αποµένει να αποδείξουµε ότι όντως υπάρχουν προβλήµατα
τα οποία είναι πλήρη για την κλάση NP.
Ικανοποιησιµότητα Λογικών Προτάσεων σε Συζευκτική Κανονική Μορφή
Το πρώτο πρακτικό πρόβληµα που αποδείχτηκε πλήρες για το NP είναι αυτό της Ικα-
νοποιησιµότητας Λογικών Προτάσεων σε Συζευκτική Κανονική Μορφή (ΣΚΜ), ή
απλά πρόβληµα της Ικανοποιησιµότητας. Στην Ικανοποιησιµότητα (Satisfiability),
δεδοµένης µιας λογικής πρότασης φ σε ΣΚΜ, διερευνούµε αν η φ είναι ικανοποιή-
σιµη, δηλαδή αν υπάρχει µια ανάθεση τιµών στις λογικές µεταβλητές της φ που κάνει
την φ αληθή. Η Ικανοποιησιµότητα αποδείχτηκε NP – πλήρης από τον S. Cook το
1971 και ανεξάρτητα από τον L. Levin, γι¢ αυτό και το Θεώρηµα 8.4 είναι γνωστό
σαν Θεώρηµα των Cook – Levin.
Ï( 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
Η µεθοδολογία της απόδειξης του Θεωρήµατος 8.5 χρησιµοποιείται πολύ συχνά στις
αποδείξεις NP – πληρότητας. Συγκεκριµένα, για να ανάγουµε ένα πρόβληµα σε ένα
άλλο αρχικά διερευνούµε πιθανές συσχετίσεις / µετασχηµατισµούς µεταξύ µικρών,
επιµέρους στιγµιότυπων των δύο προβληµάτων (π.χ. µετασχηµατισµός ενός όρου σε
µια οµάδα όρων). Ένας µετασχηµατισµός µεταξύ µικρών, επιµέρους στιγµιότυπων,
που διατηρεί τις επιθυµητές ιδιότητες (π.χ. την ιδιότητα της ικανοποιησιµότητας),
συνήθως, µπορεί να εφαρµοστεί τµηµατικά σε µεγαλύτερα στιγµιότυπα, καταλήγο-
ντας σε µια απόδειξη NP – πληρότητας.
186 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
¢Ú·ÛÙËÚÈfiÙËÙ· 8.3
Αποδείξτε ότι το πρόβληµα του Μέγιστου Συνόλου Ανεξαρτησίας είναι στο P όταν
όλες οι κορυφές του γραφήµατος εισόδου έχουν βαθµό 2.
Έχοντας σαν σηµείο εκκίνησης το πρόβληµα του Μέγιστου Συνόλου Ανεξαρτη-
σίας, µπορούµε να αποδείξουµε ότι και µερικά ακόµη γραφοθεωρητικά προβλή-
µατα είναι NP – πλήρη.
¢Ú·ÛÙËÚÈfiÙËÙ· 8.4
™‡ÓÔ„Ë
Σε αυτό το κεφάλαιο παρουσιάστηκε το µη ντετερµινιστικό υπολογιστικό µοντέλο,
ορίστηκε η κλάση NP των προβληµάτων που αποφασίζονται από NDTM πολυωνυ-
µικού χρόνου και παρουσιάστηκε η θεωρία της NP – πληρότητας.
Αν και µη ρεαλιστικό υπολογιστικό µοντέλο, ο µη ντετερµινισµός αποτελεί κεντρική
έννοια στη Θεωρία Υπολογιστικής Πολυπλοκότητας εξαιτίας των πολλών και σηµα-
ντικών εφαρµογών του. Η επόµενη διαµόρφωση µιας Μη Ντετερµινιστικής Μηχανής
Turing καθορίζεται από τη σχέση µετάβασης ∆ και µπορεί να είναι µία από ένα σύνο-
λο διαµορφώσεων.
Η κλάση NP περιλαµβάνει όλες τις γλώσσες / προβλήµατα που αποφασίζονται από
κάποια NDTM πολυωνυµικού χρόνου. Ισοδύναµα, η κλάση NP περιλαµβάνει όλες
τις γλώσσες L των οποίων κάθε συµβολοσειρά – µέλος x έχει ένα «πιστοποιητικό»
πολυωνυµικού µήκους, που µπορεί να χρησιµοποιηθεί από µία DTM πολυωνυµικού
χρόνου για να επιβεβαιώσει ότι το x ανήκει στην L.
Τα NP – πλήρη προβλήµατα είναι τα δυσκολότερα υπολογιστικά προβλήµατα της κλά-
σεως NP. Τα NP – πλήρη προβλήµατα διαδραµατίζουν ένα κεντρικό ρόλο στη διε-
ρεύνηση των κλάσεων P και NP, αφού αν ένα NP – πλήρες πρόβληµα λύνεται σε
πολυωνυµικό χρόνο, οι κλάσεις P και NP ταυτίζονται. Μερικά από τα πιο σηµαντι-
κά NP – πλήρη προβλήµατα είναι η Ικανοποιησιµότητα, η 3 – Ικανοποιησιµότητα
και το Μέγιστο Σύνολο Ανεξαρτησίας.
190 K E º A § A I O 8 : ª ∏ ¡ ∆ ∂ ∆ ∂ ƒ ª π ¡ π ™ ª √ ™ ∫ ∞ π N P – ¶ § ∏ ƒ √ ∆ ∏ ∆∞
µÈ‚ÏÈÔÁÚ·Ê›·
1.1
procedure selection_sort(A[1...n])
(1) for i ¨ 1 to n–1 do
(2) minj ¨ i; minx ¨ A[i];
(3) for j ¨ i + 1 to n do
(4) if A[j] < minx then
(5) minj ¨ j; minx ¨ A[j];
(6) A[minj] ¨ A[i]; A[i] ¨ minx;
Το βήµα 1 εκτελείται πάντα n φορές, και τα βήµατα 2 και 6 εκτελούνται πάντα (n –
1) φορές. Στην επανάληψη i, το βήµα 3 εκτελείται (n – i + 1) φορές, και το βήµα 4
εκτελείται (n – i) φορές. Όσον αφορά στο βήµα 5, η εκτέλεσή του εξαρτάται από τη
διάταξη των στοιχείων του πίνακα εισόδου. Έτσι, αν τα στοιχεία του πίνακα εισό-
δου είναι διατεταγµένα σε αύξουσα σειρά, το βήµα 5 δεν εκτελείται καµία φορά στη
διάρκεια του αλγορίθµου. Αντίθετα, αν τα στοιχεία του πίνακα εισόδου είναι διατε-
ταγµένα σε γνήσια φθίνουσα σειρά, το βήµα 5 εκτελείται (n – i) φορές, σε κάθε επα-
νάληψη i. Εποµένως, η καλύτερη περίπτωση για τον αλγόριθµο selection sort συµ-
βαίνει όταν ο πίνακας εισόδου είναι διατεταγµένος σε αύξουσα σειρά, και η χειρό-
τερη περίπτωση συµβαίνει όταν ο πίνακας εισόδου είναι διατεταγµένος σε γνήσια
φθίνουσα σειρά.
Για να έχουµε µια ασυµπτωτική εκτίµηση του χρόνου εκτέλεσης του αλγορίθµου,
αρκεί να υπολογίσουµε τον αριθµό των εκτελέσεων του βήµατος 3, ο οποίος δίνε-
n -1 n
n(n + 1)
ται από το άθροισµα Â
i =1
(n - i + 1) = Âi =
i =2
2
- 1 . Παρατηρείστε ότι το βήµα
3 εκτελείται τον ίδιο αριθµό φορών τόσο στην καλύτερη όσο και στη χειρότερη περί-
πτωση. Συνεπώς, ανεξάρτητα από το στιγµιότυπο, ο χρόνος εκτέλεσης του αλγο-
ρίθµου selection sort είναι τετραγωνικός στο µέγεθος της εισόδου.
1.2
Καταρχήν, ας θυµηθούµε τον ψευδοκώδικα του αλγορίθµου γραµµικής αναζήτησης:
procedure linear_search(A[1,...,n], x)
(1) i ¨ 1;
(2) while i <= n do
192 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
Έστω ότι ο αριθµός x έχει την ίδια πιθανότητα να βρίσκεται σε κάθε θέση του Α. Για
να αποκτήσουµε µια εκτίµηση του µέσου χρόνου εκτέλεσης του αλγορίθµου ως προς
αυτή την κατανοµή εισόδου, θα εξετάσουµε τον αριθµό των εκτελέσεων του βήµατος
2. Ο αριθµός x έχει πιθανότητα να βρίσκεται σε καθεµία από τις θέσεις y = 1, …, n µε
πιθανότητα 1/n, και όταν ο x βρίσκεται στη θέση y, το βήµα 2 εκτελείται y φορές. Επο-
µένως, ο µέσος αριθµός εκτελέσεων του βήµατος 2 δίνεται από το άθροισµα
n
n(n + 1) n + 1
Ân =
y
= . Υποθέτοντας ότι το x έχει την ίδια πιθανότητα να βρίσκεται
y =1
2n 2
σε κάθε θέση του Α, βλέπουµε ότι, όπως και στη χειρότερη περίπτωση, ο µέσος χρόνος
εκτέλεσης του αλγορίθµου γραµµικής αναζήτησης είναι γραµµικός στο µέγεθος του Α.
Στην περίπτωση που ο ζητούµενος αριθµός x δεν περιέχεται στον πίνακα Α, το βήµα
2 εκτελείται πάντα (n + 1) φορές, ενώ τα βήµατα 3 και 5 εκτελούνται n φορές. Ο
χρόνος εκτέλεσης του αλγορίθµου είναι γραµµικός στο µέγεθος της εισόδου, και
µάλιστα, αυτή η περίπτωση είναι ακόµα χειρότερη από την περίπτωση που ο x βρί-
σκεται στην τελευταία θέση του πίνακα Α.
2.1
Υπενθυµίζεται ότι ο χρόνος εκτέλεσης τόσο της καλύτερης όσο και της χειρότερης
περίπτωσης της selection sort είναι Θ(n2). Εποµένως, µόνο η πρόταση 5 είναι λαν-
θασµένη, αφού δεν υπάρχουν στιγµιότυπα που ο αλγόριθµος να χρειάζεται χρόνο
τουλάχιστον n3.
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 193
Σωστό Λάθος
1. Ο χρόνος εκτέλεσης της selection sort είναι Θ(n2). ✓
❏ ❏
2. Ο χρόνος εκτέλεσης της selection sort είναι Ο(n2). ✓
❏ ❏
3. Ο χρόνος εκτέλεσης της selection sort είναι Ω(n). ✓
❏ ❏
4. Ο χρόνος εκτέλεσης της selection sort είναι Ο(n3). ✓
❏ ❏
5. Ο χρόνος εκτέλεσης χειρότερης περίπτωσης
της selection sort είναι Ω(n3). ❏ ✓
❏
6. Ο χρόνος εκτέλεσης καλύτερης περίπτωσης
της selection sort είναι Θ(n2). ✓
❏ ❏
7. Ο χρόνος εκτέλεσης χειρότερης περίπτωσης
της selection sort είναι Θ(n2). ✓
❏ ❏
Ο χρόνος εκτέλεσης χειρότερης και µέσης περίπτωσης του linear search είναι Θ(n).
Στην καλύτερη περίπτωση, ο χρόνος εκτέλεσης του linear search είναι Θ(1). Επο-
µένως, οι µόνο οι προτάσεις 8 και 11 είναι λανθασµένες.
8. Ο χρόνος εκτέλεσης της linear search είναι Θ(n). ❏ ✓
❏
9. Ο χρόνος εκτέλεσης χειρότερης περίπτωσης
της linear search είναι Θ(n). ✓
❏ ❏
10.Ο χρόνος εκτέλεσης µέσης περίπτωσης
της linear search είναι Θ(n). ✓
❏ ❏
11.Ο χρόνος εκτέλεσης καλύτερης περίπτωσης
της linear search είναι Ω(n). ❏ ✓
❏
12.Ο χρόνος εκτέλεσης χειρότερης περίπτωσης
της linear search είναι Ω(n). ✓
❏ ❏
13.Ο χρόνος εκτέλεσης καλύτερης περίπτωσης
της linear search είναι Ο(n). ✓
❏ ❏
14.Ο χρόνος εκτέλεσης καλύτερης περίπτωσης
της linear search είναι Ο(1). ✓
❏ ❏
15.Ο χρόνος εκτέλεσης χειρότερης περίπτωσης
της linear search είναι Ω(1). ✓
❏ ❏
194 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
2.2
(A). log log n, log n, log 2 n, n , n log n, 2 n , 22 n , n!, n n , 2 n! .
(B).
f(n) g(n) Ο ο Ω ω Θ
(α) 2n + k 2n + 2k – nk ΝΑΙ ΟΧΙ ΝΑΙ ΟΧΙ ΝΑΙ
3
(β) (logn)3 log(nlog( n ) ) ΟΧΙ ΟΧΙ ΝΑΙ ΝΑΙ ΟΧΙ
(γ) kn (3k)n/3 ΟΧΙ ΟΧΙ ΝΑΙ ΝΑΙ ΟΧΙ
(δ) (kn)1– ε n1– ε ΝΑΙ ΟΧΙ ΝΑΙ ΟΧΙ ΝΑΙ
(ε) n3 – 10n 8log n ΝΑΙ ΟΧΙ ΝΑΙ ΟΧΙ ΝΑΙ
2.3
Â
n
Το άθροισµα C(n) δεν µπορεί να είναι µεγαλύτερο από το άθροισµα n3 £ n4 .
i =1
Â
n
Επίσης, ισχύει ότι C (n ) ≥ n 3 / 8 ≥ n 4 / 16 .
i = n/2
Εποµένως, C(n) = Θ(n4), και πιθανολογούµε ότι το C(n) θα είναι ίσο µε κάποιο
πολυώνυµο τετάρτου βαθµού An4 + Bn3 + Cn2 + Dn + E. Για να προσδιορίσουµε
τους συντελεστές του πολυωνύµου, υπολογίζουµε τις τιµές του αθροίσµατος για
µικρές τιµές του n. Με αυτό τον τρόπο καταλήγουµε στο ακόλουθο σύστηµα πέντε
εξισώσεων µε πέντε αγνώστους.
n = 1: A + B + C + D + E = 1
n = 2: 16A + 8B + 4C + 2D + E = 9
n = 3: 81A + 27B + 9C + 3D + E = 36
n = 4: 256A + 64B + 16C + 4D + E = 100
n = 5: 625A + 125B + 25C + 5D + E = 225
Το παραπάνω σύστηµα έχει µοναδική λύση την A = 1/4, B = 1/2, C = 1/4, D = E =
0. Εποµένως, καταλήγουµε στο συµπέρασµα ότι
n 4 + 2n 3 + n2 n2 (n + 1)2
Â
n
C (n ) = i3 = = ,
i =1 4 4
το οποίο και θα επιβεβαιώσουµε µε µαθηµατική επαγωγή. Λόγω της µεθόδου µε την
οποία υπολογίσαµε τους συντελεστές του πολυωνύµου, η παραπάνω ισότητα ισχύ-
ει για n = 1, 2, 3, 4 και 5. Υποθέτουµε ότι ισχύει για n, και θα αποδείξουµε ότι ισχύ-
ει για n + 1. Πράγµατι,
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 195
n +1 n
Âi
i =1
3
= (n + 1) + 3
Âi
i =1
3
n2 (n + 1)2
= (n + 1) 3 +
4
(n + 1) ( 4n + 4 + n2 ) (n + 1)2 (n + 2 )2
2
= =
4 4
όπου στην πρώτη ισότητα βγάλαµε την περίπτωση i = n + 1 εκτός αθροίσµατος, στη
δεύτερη ισότητα εφαρµόσαµε την επαγωγική υπόθεση και, στη συνέχεια, κάναµε τις
πράξεις.
2.4
Για να αποδείξουµε την ανισότητα θα χρησιµοποιήσουµε µαθηµατική επαγωγή.
Παρατηρούµε ότι, για c ≥ 1, η ανισότητα ισχύει πάντα για n = 0. ∆εχόµαστε ότι ισχύ-
ει για n και θα αποδείξουµε ότι ισχύει για n + 1.
n +1 n
Â3 = 3
i =0
i n +1
+ Â3
i =0
i
n +1
£3 + c3 n
Ê cˆ
£ 3 n +1 Á1 + ˜
Ë 3¯
Παρατηρούµε ότι η ποσότητα 3 n +1 ÊÁ1 + c ˆ˜ είναι το πολύ ίση µε c3n + 1, για κάθε c ≥ 3/2.
Ë 3¯
Η τιµή 3/2 είναι η ελάχιστη τιµή της σταθεράς c για την οποία ισχύει η ανισότητα.
Με απόλυτα παρόµοιο τρόπο, µπορούµε να αποδείξουµε ότι, για κάθε α > 1 και για
Â
a n
κάθε σταθερά c ≥ , ισχύει ai £ ca n .
a -1 i =0
2.5
Αναπτύσσοντας την αναδροµική εξίσωση, έχουµε
T (n ) = 1 + T (n / 2 )
= 1 + 1 + T (n / 4 )
M
= 11
+41+
2L4+
31 + T (n / 2 ) .
i
i φορές
196 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
2.6
Η πρώτη εξίσωση µπορεί να λυθεί µε τη µέθοδο της επανάληψης. Έχουµε:
T (n ) = 3 + T (n - 1)
= 3 + 3 + T (n - 2 )
M
= 31+4
32
4 +L
44+33 + T (n - i ) .
i φορές
n
T (n ) = log 3 + 1 = log 3 n - 1 + 1 = log 3 n .
3
Εποµένως, Τ(n) = Θ(log n).
Αναπτύσσοντας την πέµπτη αναδροµική εξίσωση, έχουµε:
T (n ) = n + T (n / 2 )
= n + n / 2 + T (n / 4 )
M
= n + n / 2 + L + n / 2i -1 + T (n / 2i ) .
Θέτοντας i = log n η ανάπτυξη της αναδροµής σταµατά. Θεωρώντας σαν αρχική συν-
θήκη Τ(1) = 1, έχουµε:
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 197
log n log n
T (n ) = Â n / 2 = nÂ1 / 2 £ 2n .
i =0
i
i =0
i
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 ) = n2 + T (n - 1)
= n2 + (n - 1)2 + T (n - 2 )
M
n
= Âii =2
2
+ T (1) = Q (n 3 ) .
198 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
3n 3n
™¯‹Ì· 2.6 +
...
Το δέντρο
3n(9/10)3
της αναδροµής για
...
την εξίσωση
T(n) = T(n/5) +
T(7n/10) + 3n.
Για να λύσουµε την πέµπτη αναδροµική εξίσωση σχεδιάζουµε το δέντρο της ανα-
δροµής (Σχήµα 2.6). Αφού 1/5 + 7/10 = 9/10, η συνεισφορά κάθε επιπέδου είναι ίση
µε τα 9/10 της συνεισφοράς του προηγούµενου επιπέδου (στο νέο επίπεδο, η συνει-
σφορά των αριστερών κλάδων είναι ίση µε το 1/5 της συνεισφοράς του προηγούµε-
νου επιπέδου, ενώ η συνεισφορά των δεξιών κλάδων είναι ίση µε τα 7/10 της συνει-
σφοράς του προηγούµενου επιπέδου). Επίσης, το ύψος του δέντρου είναι µεταξύ
log5n και log10/7n, δηλαδή, Θ(log n). Συνεπώς, έχουµε:
Q (log n ) i
• i
Ê 9ˆ Ê 9ˆ
T (n ) = Â
i =0
Ë 10 ¯ Â
3nÁ ˜ £ 3n Á ˜ = 30n ,
i =0
Ë 10 ¯
όπου το τελευταίο άθροισµα είναι άθροισµα άπειρων όρων γνήσια φθίνουσας γεω-
µετρικής προόδου. Επιπλέον, αξίζει να σηµειωθεί ότι στην παραπάνω εκτίµηση για
το T(n), το ύψος του δέντρου της αναδροµής ουσιαστικά δεν παίζει ρόλο. Άρα, Τ(n)
= Θ(n).
Για να λύσουµε την έκτη αναδροµική εξίσωση σχεδιάζουµε το δέντρο της αναδρο-
µής (Σχήµα 2.7). Παρατηρούµε ότι η συνεισφορά κάθε επιπέδου είναι n (αφού 5/9
+ 4/9 = 1), ενώ το ύψος του δέντρου δεν µπορεί να είναι µικρότερο από log9/4n και
µεγαλύτερο από log9/5n. Εποµένως, T(n) = Θ(n log n).
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 199
n n
+
5n/9 4n/9 n
Θ(log n)
+
™¯‹Ì· 2.7
25n/81 20n/81 20n/81 16n/81 n
Το δέντρο
της αναδροµής για
+ την εξίσωση
...
T(n) = T(5n/9) +
...
T(4n/9) + n.
3.1
Ο χρόνος εκτέλεσης του παραπάνω αλγορίθµου διάταξης, ο οποίος εκτελείται σε
δύο φάσεις, έχει δύο συνιστώσες: Τον χρόνο εκτέλεσης µέσης περίπτωσης για την
παραλλαγή της πιθανοτικής έκδοσης της quicksort, η οποία εκτελείται σε πίνακες
µε τουλάχιστον k στοιχεία, και το χρόνο εκτέλεσης της insertion sort.
Αφού η quicksort σταµατά να εκτελείται όταν ο πίνακας εισόδου έχει k ή λιγότερα
στοιχεία, από τα log n επίπεδα της αναδροµής αφαιρούνται τα τελευταία log k. Επο-
µένως, ο αναµενόµενος αριθµός επιπέδων της αναδροµής για την παραλλαγή της
quicksort είναι log n – log k = log(n/k). Αφού κάθε επίπεδο συνεισφέρει Ο(n) χρόνο,
ο µέσος χρόνος εκτέλεσης της συγκεκριµένης παραλλαγής της quicksort είναι Ο(n
log(n/k)). Ένας άλλος τρόπος απόδειξης του ίδιου αποτελέσµατος είναι να δείξουµε
ότι η αναδροµική εξίσωση
1 Ê ˆ
n -1 n - k -1
S (n ) = Q (n ) + Á
n -1 Ë i=k Â
S (i ) +
i =1
ÂS (n - i )˜
¯
3.2
Από τον ορισµό, το κάτω φράγµα Ω(n log n) δεν ισχύει για αυτό το πρόβληµα, επει-
δή µόνο ορισµένες από τις n! αναδιατάξεις των στοιχείων µπορούν να συµβούν.
Συγκεκριµένα, για κάθε οµάδα µπορούν να συµβούν k! αναδιατάξεις και, αφού υπάρ-
χουν n/k οµάδες, το σύνολο των πιθανών αναδιατάξεων είναι (k!)n/k.
Επειδή το δέντρο των συγκρίσεων είναι δυαδικό, το ύψος του h δεν µπορεί να είναι
µικρότερο από το λογάριθµο µε βάση 2 του αριθµού των πιθανών αναδιατάξεων.
Εποµένως,
( )
h ≥ log ( k!) n / k =
n
k
k log k = n log k
.
Η ποσότητα n log k αποτελεί ένα κάτω φράγµα στον αριθµό των συγκρίσεων που
χρειάζεται κάθε ντετερµινιστικός αλγόριθµος, ο οποίος είναι βασισµένος σε συγκρί-
σεις στοιχείων, για να λύσει το παραπάνω πρόβληµα.
3.3
Έστω ότι τα ενδιάµεσα στοιχεία A[n/2] και B[n/2] είναι διαφορετικά µεταξύ τους
και, έστω A[n/2] < B[n/2]. Τότε, το ενδιάµεσο στοιχείο του A » B πρέπει να βρί-
σκεται µεταξύ των A[n/2] και B[n/2], αφού όλα τα στοιχεία Α[1, …, n/2] είναι µικρό-
τερα από το ενδιάµεσο και όλα τα στοιχεία Β[n/2, …, n] είναι µεγαλύτερα από το
ενδιάµεσο. Συγκεκριµένα, το ενδιάµεσο στοιχείο του A » B θα είναι το ενδιάµεσο
στοιχείο του πίνακα A[n/2, …, n] » B[1, …, n/2]. Οµοίως, αν A[n/2] > B[n/2], το
ενδιάµεσο στοιχείο του A » B θα είναι το ενδιάµεσο στοιχείο του Α[1, …, n/2] »
B[n/2, …, n]. Ο αλγόριθµος συνεχίζει µε την ίδια µέθοδο, καλώντας αναδροµικά τον
εαυτό του. Στη συνέχεια, δίνεται ο ψευδοκώδικας.
median_of_union(A[p1,...,r1], B[p2,...,r2])
if r1 – p1 £ 1 then
ÀÔÏfiÁÈÛÂ Î·È Â¤ÛÙÚ„ ÙÔ ÂӉȿÌÂÛÔ ÛÙÔȯ›Ô
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 201
3.4
Âw £ 2,
1
Εξ’ ορισµού, το βεβαρηµένο ενδιάµεσο στοιχείο xk έχει την ιδιότητα i
xi < xk
υποδεικνύουν ότι το πολύ n/2 στοιχεία είναι µικρότερα και το πολύ n/2 στοιχεία είναι
µεγαλύτερα από το xk. Εποµένως, το xk είναι και το ενδιάµεσο στοιχείο της ακολου-
θίας x1, …, xn .
Αφού διατάξουµε τα στοιχεία x1, …, xn σε αύξουσα σειρά, βαδίζοντας από το µικρό-
τερο προς το µεγαλύτερο, υπολογίζουµε το άθροισµα των βαρών των στοιχείων που
έχουµε επισκεφθεί µέχρι στιγµής. Το βεβαρυµένο ενδιάµεσο στοιχείο xk είναι το πρώτο
για το οποίο το παραπάνω άθροισµα φθάσει ή ξεπεράσει το 1/2. Ο αλγόριθµος αυτός
χρειάζεται Θ(n log n) χρόνο για τη διάταξη των στοιχείων x1, …, xn σε αύξουσα σειρά
και γραµµικό χρόνο για την εύρεση του xk στη διατεταγµένη ακολουθία.
Θεωρούµε τον ακόλουθο αλγόριθµο:
1. Υπολόγισε το ενδιάµεσο στοιχείο xm της ακολουθίας x1, …, xn χρησιµοποιώντας
τη διαδικασία quickselect.
2. Καλώντας τη διαδικασία partition, διαίρεσε την ακολουθία x1, …, xn σε δύο επι-
µέρους ακολουθίες. Οργάνωσε τη διαίρεση γύρω από το ενδιάµεσο στοιχείο xm.
3. Υπολόγισε τα αθροίσµατα WL = Âw
xi < x m
i και WR = Âw.
xi > x m
i
3.5
 Â
n -1 n -1
Έστω A( x ) = ai x i και B( x ) = bi x i πολυώνυµα βαθµού (n – 1), και
i =0 i =0
Τα πολυώνυµα A(x) και Β(x) µπορούν να γραφούν σαν A(x) =A1(x) + xn/2 A2(x), όπου
 Â
n / 2 -1 n / 2 -1
A1 ( x ) = ai x i και A2 ( x ) = an / 2 + i x i ,
i =0 i =0
 Â
n / 2 -1 n / 2 -1
και B(x) =B1(x) + xn/2 B2(x), όπου B1 ( x ) = bi x i και B2 ( x ) = bn / 2 + i x i ,
i =0 i =0
C ( x ) = ( 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
3.6
Αφού τα πολυώνυµα A(x) και B(x) είναι βαθµού 1, το γινόµενό τους C(x) θα είναι
βαθµού 2, εποµένως, προσδιορίζεται µοναδικά από, τουλάχιστον, 3 τιµές. Επειδή ο
αλγόριθµος FFT εφαρµόζεται για δυνάµεις του 2, θα υπολογίσουµε τις τιµές των
πολυωνύµων σε 4 σηµεία (n = 4). Τα διανύσµατα συντελεστών είναι Α = [3, – 1, 0,
0] και Β = [2, 3, 0, 0]. Οι µιγαδικές ρίζες της µονάδας για n = 4 είναι {1, i, – 1, – i},
µε κύρια ρίζα το i.
Για το πολυώνυµο Α, ο FFT καλείται µε παράµετρο [3, – 1, 0, 0], θέτει Α[0] = [3, 0],
Α[1] = [ – 1, 0], ω4 = i και κάνει τις αναδροµικές κλήσεις FFT([3, 0]) και FFT([ – 1, 0]).
Η πρώτη αναδροµική κλήση θέτει ω2 = – 1 και καλεί αναδροµικά FFT([3]) και
FFT([0]). Από αυτές τις κλήσεις επιστρέφονται τα Υ[0] = 3 και Υ[1] = 0, οπότε ο
αλγόριθµος υπολογίζει τα y0 = 3 + 1 ¥ 0 = 3 και y1 = 3 + 1 ¥ 0 = 3. Εποµένως, η
κλήση FFT([3, 0]) επιστρέφει το [3, 3]. Οµοίως, η δεύτερη κλήση υπολογίζει τα y0
= – 1 + 1 ¥ 0 = – 1 και y1 = – 1 + 1 ¥ 0 = – 1, και επιστρέφει [ – 1, – 1].
Επιστρέφουµε στη βασική κλήση του αλγορίθµου, FFT([3, – 1, 0, 0]). Για k = 0, ο
αλγόριθµος υπολογίζει y0 = 3 + 1 ¥ (– 1) = 2 και y2 = 3 + (– 1) ¥ (– 1) = 4. Για k = 1,
ο αλγόριθµος υπολογίζει y1 = 3 + i ¥ (– 1) = 3 – i και y3 = 3 + (– i) ¥ (– 1) = 3 + i. Επο-
µένως, ο αλγόριθµος επιστρέφει το ΥΑ = [2, 3 – i, 4, 3 + i]. Με παρόµοιο τρόπο, η
κλήση FFT([2, 3, 0, 0] για το πολυώνυµο B επιστρέφει το ΥΒ = [5, 2 + 3i, – 1, 2 – 3i].
Οι τιµές του γινοµένου C(x) στις µιγαδικές ρίζες της µονάδας είναι YC = [10, 9 + 7i,
– 4, 9 – 7i]. Ο αντίστροφος FFT καλεί FFT([10, – 4]) και FFT([9 + 7i, 9 – 7i]). Η
πρώτη κλήση επιστρέφει C[0] = [6, 14] και η δεύτερη κλήση επιστρέφει C[1] = [18,
14i]. Για k = 0, η βασική κλήση του αλγορίθµου υπολογίζει c0 = 6 + 18 / 1 = 24 και
c2 = 6 + 18 / (– 1) = – 12. Για k = 1, ο αλγόριθµος υπολογίζει c1 = 14 + 14i / i = 28
και c3 = 14 + 14i / (– i) = 0. ∆ιαιρώντας το αποτέλεσµα µε το n = 4, παίρνουµε το
διάνυσµα των συντελεστών του γινοµένου C = [6, 7, – 3, 0], το οποίο αντιστοιχεί
στο πολυώνυµο C(x) = 6 + 7x – 3x2.
4.1
Για να είναι δυνατή η ανακατασκευή µιας βέλτιστης λύσης πρέπει, κάθε φορά που
ο αλγόριθµος MATRIX – CHAIN – MULT υπολογίζει µία τιµή m[i, j], να αποθηκεύουµε
την τιµή του k για την οποία µπορεί να επιτευχθεί αυτή η τιµή. Με αυτό τον τρόπο,
αφού υπολογισθεί η τιµή m[1, n], µπορούµε να ανακαλέσουµε τις βέλτιστες επιµέ-
ρους λύσεις οι οποίες συνθέτουν µια βέλτιστη λύση.
Για την αποθήκευση των τιµών του k θα χρησιµοποιήσουµε έναν άλλο πίνακα s[1..n,
204 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
1...m]. Η τρέχουσα τιµή s[i, j] δηλώνει την τρέχουσα τιµή του k για την οποία επιτυγ-
χάνεται η τρέχουσα τιµή m[i, j]. Εποµένως, κάθε φορά που µία τιµή εκχωρείται στη
θέση m[i, j], θα πρέπει να εκχωρείται και η αντίστοιχη τιµή του k στη θέση s[i, j].
Αυτή η τροποποίηση µπορεί να γίνει αντικαθιστώντας τις δύο τελευταίες γραµµές
του ψευδοκώδικα για τη διαδικασία MATRIX – CHAIN – MULT µε τις ακόλουθες γραµ-
µές ψευδοκώδικα:
if q < m[i, j] then
m[i, j] ¨ q; s[i, j] ¨ k;
return (m[1, n], s);
Παρατηρείστε ότι αυτές οι αλλαγές δεν µεταβάλουν τις ασυµπτωτικές συµπεριφορές
του χρόνου εκτέλεσης και του αριθµού των θέσεων µνήµης που απαιτεί ο αλγόριθµος.
Η παρακάτω διαδικασία επιστρέφει το γινόµενο C δύο πινάκων Α και Β διαστάσε-
ων d1 ¥ d2 και d2 ¥ d3, αντίστοιχα. Αυτή η διαδικασία υλοποιεί τον αλγόριθµο πολ-
λαπλασιασµού πινάκων που βασίζεται στον ορισµό και χρησιµοποιεί ακριβώς d1 d2
d3 πολλαπλασιασµούς στοιχείων των πινάκων.
MATRIX – MULTIPLY(A, B, d1, d2, d3)
for i ¨ 1 to d1 do
for j ¨ 1 to d3 do
C[i, j] ¨ 0;
for k ¨ 1 to d2 do
C[i, j] ¨ C[i, j] + A[i, k]*B[k, j];
return C;
Τέλος, η παρακάτω αναδροµική διαδικασία χρησιµοποιεί το γεγονός ότι, ο βέλτιστος
αριθµός πολλαπλασιασµών στοιχείων για τον υπολογισµό του γινοµένου Αi..j, 1 £ i
< j £ n, είναι m[i, j] και επιτυγχάνεται όταν το γινόµενο Ai..j υπολογισθεί µε διαίρε-
ση στη θέση s[i, j], δηλαδή Ai..j = Ai..s[i, j] As[i, j] + 1..j .
MATRIX – CHAIN – PRODUCT(Ai,...,Aj, s)
if j > i then
X ¨ MATRIX – CHAIN – PRODUCT(Ai,...,As[i,j], s);
Y ¨ MATRIX – CHAIN – PRODUCT(As[i,j] + 1,...,Aj, s);
return matrix – multiply(X, Y, di – 1, ds[i, j], dj);
else return Ai;
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 205
4.2
Όπως και για τις δύο ακολουθίες, το πρόβληµα της µεγαλύτερης κοινής υπακολουθίας
τριών ακολουθιών Χ, Υ και Ζ έχει την ιδιότητα των βέλτιστων επιµέρους δοµών. Έστω
c[i, j, k] το µήκος της µεγαλύτερης κοινής υπακολουθίας των προθεµάτων Xi, Yj και Zk.
Η αναδροµική εξίσωση που περιγράφει τα στοιχεία του πίνακα c[1..n, 1..m, 1..p] απο-
τελεί επέκταση της αναδροµικής εξίσωσης για την περίπτωση των δύο ακολουθιών.
Ï0 αν i = 0, ή j = 0, ή k = 0.
Ô
c[ i, j , k ] = Ìc[ i - 1, j - 1, k - 1] + 1 αν i , j , k > 0 κ αι xi = y j = zk
Ômax{c[ i, j , k - 1], c[ i, j - 1, k ], c[ i - 1, j , k ]} αν i , j , k > 0 κ αι όχι x = y = z
Ó i j k
else
tx = LOOKUP – 3LCS(Xi – 1, Yj, Zk);
ty = LOOKUP – 3LCS(Xi, Yj – 1, Zk);
tz = LOOKUP – 3LCS(Xi, Yj, Zk – 1);
c[i, j, k] = max{tx, ty, tz};
return c[i, j, k];
206 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
Παρατηρείστε ότι κάθε στοιχείο του πίνακα c[1..n, 1..m, 1..p] υπολογίζεται ακριβώς
µία φορά σε Θ(1) χρόνο. Επειδή ο πίνακας c έχει nmp στοιχεία, ο χρόνος που απαι-
τείται για τον υπολογισµό του c[n, m, p] είναι Θ(nmp).
4.3
Έστω ότι µε Χi / Yj συµβολίζουµε το πρόθεµα µήκους i / j της συµβολοσειράς Χ / Υ.
Επίσης, έστω c[i, j] το ελάχιστο κόστος για τη µετατροπή της Xi στην Yj. Η Xi µπο-
ρεί να µετατραπεί στην Υj µε έναν από τους ακόλουθους τρόπους:
Μεταβολή της Χi – 1 στην Υj και διαγραφή του χαρακτήρα Χ[i] (κόστος c[i – 1, j] + d).
Μεταβολή της Xi στην Υj – 1 και προσθήκη του χαρακτήρα Υ[j] (κόστος c[i, j – 1] + b).
Μεταβολή της Xi – 1 στην Yj – 1 και αντικατάσταση του X[i] από τον Υ[j], αν αυτό είναι
απαραίτητο (κόστος c[i – 1, j – 1] + α ¥ b, όπου Α = 0 αν X[i] = Y[j] και 1 διαφορετικά).
Βλέπουµε ότι το πρόβληµα της µεταβολής µιας συµβολοσειράς Χ σε µία άλλη Υ έχει
την ιδιότητα των βέλτιστων επιµέρους δοµών. Με βάση τις παραπάνω παρατηρή-
σεις, µπορούµε να διατυπώσουµε την αναδροµική εξίσωση που περιγράφει τα στοι-
χεία του πίνακα c[1..n, 1..m].
Ïid αν j = 0.
Ô
Ô jb αν i = 0.
c[ i, j ] = Ì
Ômin{c[ i - 1, j - 1], c[ i - 1, j ] + d , c[ i, j - 1] + b} αν i, j > 0 κ αι X [i ] = Y [ j ].
ÔÓmin{c[ i - 1, j - 1] + h, c[ i - 1, j ] + d , c[ i, j - 1] + b} αν i, j > 0 κ αι X [i ] π Y [ j ].
5.1
Το πρόβληµα αυτό είναι πιο γνωστό σαν πρόβληµα χρωµατισµού διαστηµάτων
(interval coloring problem), όπου οι δραστηριότητες αντιστοιχούν σε χρονικά δια-
στήµατα, και κάθε χρώµα σε διαφορετική µονάδα κοινόχρηστου πόρου. Το ζητού-
µενο είναι ο χρωµατισµός των διαστηµάτων µε τον ελάχιστο αριθµό χρωµάτων, ώστε
κάθε ζευγάρι επικαλυπτόµενων διαστηµάτων να έχει διαφορετικά χρώµατα.
Έστω d ο µέγιστος αριθµός διαστηµάτων /δραστηριοτήτων που επικαλύπτονται
κάποια χρονική στιγµή. Προφανώς, χρειαζόµαστε τουλάχιστον d χρώµατα. Ο παρα-
κάτω άπληστος αλγόριθµος αναθέτει στο διάστηµα i, 1 £ i £ n, το µικρότερο χρώµα
που είναι διαθέσιµο τη χρονική στιγµή si. Παρατηρούµε ότι, σε κάθε χρονική στιγ-
µή k, ο αλγόριθµος χρησιµοποιεί ακριβώς τόσα χρώµατα όσες και οι δραστηριότη-
τες που επικαλύπτονται τη στιγµή k. Εποµένως, ο αλγόριθµος χρησιµοποιεί ακριβώς
d χρώµατα, που είναι και ο ελάχιστος αριθµός χρωµάτων.
GREEDY – INTERVAL – COLORING(A = [(s1, f1),...,(sn, fn)])
F ¨ max{fi: 1 £ i £ n}; c ¨ 1;
for k ¨ 0 to F do
for all j Œ {i : 1 £ i £ n and fi = k} do
c ¨ c – 1;
208 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
5.2
∆ιατάσσουµε τα στοιχεία του x σε αύξουσα σειρά, x1 £ x2 £ … £ xn. Αν z είναι το
µικρότερο διαθέσιµο στοιχείο του Χ, προσθέτουµε στη συλλογή το διάστηµα [z, z +
1], διαγράφουµε από το x όλα τα στοιχεία που περιέχονται στο [z, z + 1] και συνεχί-
ζουµε µε το επόµενο διαθέσιµο στοιχείο του Χ.
Αν τα στοιχεία του Χ είναι διατεταγµένα σε αύξουσα σειρά, ο παραπάνω άπληστος
αλγόριθµος υπολογίζει µία συλλογή διαστηµάτων σε χρόνο Θ(n). Εποµένως, ο χρό-
νος εκτέλεσης του παραπάνω αλγορίθµου καθορίζεται από το χρόνο για τη διάταξη
των στοιχείων του Χ, ο οποίος είναι Ο(n log n).
Έστω Α µία βέλτιστη συλλογή διαστηµάτων, η οποία δεν περιέχει το διάστηµα Ι =
[x1, x1 + 1]. Προφανώς, η Α θα περιέχει κάποιο άλλο διάστηµα J το οποίο καλύπτει
το στοιχείο x1. Αφού δεν υπάρχει κανένα στοιχείο µικρότερο του x1, το διάστηµα J
µπορεί να αντικατασταθεί από το Ι και η Α να παραµείνει βέλτιστη λύση. Εποµένως,
πάντα υπάρχει µία βέλτιστη λύση της οποίας το πρώτο διάστηµα συµπίπτει µε την
πρώτη επιλογή του άπληστου αλγόριθµου (ιδιότητα άπληστης επιλογής).
Έστω Χ΄ = Χ / {σηµεία του Χ που καλύπτονται από διάστηµα Ι = [x1, x1 + 1]}. Θα
δείξουµε ότι το σύνολο Α΄ = Α / {Ι} είναι µία βέλτιστη συλλογή διαστηµάτων για το
Χ΄ (ιδιότητα βέλτιστων επιµέρους δοµών). Αν υπήρχε ένα µικρότερο σύνολο Β¢, το
οποίο κάλυπτε όλα τα σηµεία του Χ΄, τότε το Β¢ » {I} θα ήταν µία συλλογή δια-
στηµάτων που καλύπτει όλα τα στοιχεία του Χ, και έχει µικρότερο πληθικό αριθµό
από το Α. Το γεγονός αυτό αντίκειται στην υπόθεση ότι το Α είναι µία βέλτιστη λύση.
Εποµένως, το Α΄ πράγµατι είναι µία βέλτιστη λύση για το στιγµιότυπο Χ΄.
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 209
Εφαρµόζοντας επαγωγικά (ως προς τον αριθµό των βηµάτων του άπληστου αλγο-
ρίθµου) τις ιδιότητες της βέλτιστης επιλογής και των βέλτιστων επιµέρους δοµών,
καταλήγουµε στην απόδειξη ορθότητας του αλγορίθµου, δηλαδή στο συµπέρασµα
ότι η άπληστη στρατηγική υπολογίζει µία βέλτιστη λύση.
5.3
Ο άπληστος αλγόριθµος χρησιµοποιεί όσο περισσότερα εικοσάρικα µπορεί, στη
συνέχεια, όσα περισσότερα τάλιρα µπορεί και, τέλος, συµπληρώνει το υπόλοιπο
ποσόν µε κέρµατα αξίας µία δραχµής.
Αν g2 ο αριθµός εικοσάρικων, g1 ο αριθµός των τάλιρων και g0 ο αριθµός των δραχ-
µών που χρησιµοποιεί ο άπληστος αλγόριθµος, θα ισχύουν οι ακόλουθες σχέσεις:
0 £ Χ – 20 g2 < 20, δηλαδή g 2 = Î X 20û .
Αν Χ¢ = Χ – 20 g2, 0 £ Χ¢ – 5g1 < 5, δηλαδή g1 = Î X ¢ 5û .
Αν Χ≤ = Χ¢ – 5 g1, X≤ – g0 = 0, δηλαδή g0 = Χ≤.
Επίσης, για κάθε βέλτιστη λύση ισχύουν οι ανισότητες:
– 5g1 + g0 < 20, γιατί διαφορετικά θα αντικαθιστούσαµε µερικά τάλιρα και δραχµές
(π.χ. τέσσερα τάλιρα, ή τρία τάλιρα και πέντε δραχµές) µε ένα εικοσάρικο, παίρνο-
ντας µία λύση µε µικρότερο αριθµό κερµάτων.
– g0 < 5, γιατί διαφορετικά θα αντικαθιστούσαµε πέντε δραχµές µε ένα τάλιρο, δίνο-
ντας έτσι τέσσερα κέρµατα λιγότερα.
Προφανώς, καµία βέλτιστη λύση δεν µπορεί να περιέχει περισσότερα από g2 εικο-
σάρικα. Ας υποθέσουµε ότι, για κάποιο Χ, µία βέλτιστη λύση περιέχει o2 < g2 εικο-
σάρικα. Αυτό σηµαίνει ότι Χ – 20 ο2 > 20 και, άρα, η βέλτιστη λύση θα περιέχει ένα
σύνολο από τάλιρα και δραχµές µε αξία ακριβώς 20. Αυτά τα κέρµατα µπορούν να
αντικατασταθούν από ένα εικοσάρικο, δίνοντας µία λύση µε µικρότερο αριθµό κερ-
µάτων. Άρα, κάθε βέλτιστη λύση περιέχει ακριβώς g2 εικοσάρικα. Οµοίως, αποδει-
κνύεται ότι κάθε βέλτιστη λύση, η οποία περιέχει g2 εικοσάρικα, επίσης περιέχει
ακριβώς g1 τάλιρα. Τέλος, κάθε βέλτιστη λύση που περιέχει g2 εικοσάρικα και g1
τάλιρα, δεν µπορεί παρά να περιέχει ακριβώς g0 δραχµές. ∆ηλαδή, όταν τα κέρµα-
τα που έχουµε στη διάθεσή µας έχουν αξίες 20, 5 και 1, ο άπληστος αλγόριθµος υπο-
λογίζει µία βέλτιστη λύση.
Ας υποθέσουµε ότι έχουµε στη διάθεσή µας κέρµατα αξίας 1, 13 και 29 δραχµών,
και θέλουµε να δώσουµε ρέστα αξίας 39 δραχµών. Ο άπληστος αλγόριθµος θα έδινε
ένα κέρµα 29 δραχµών και δέκα κέρµατα µία δραχµής, σύνολο 11 κέρµατα. Η βέλ-
210 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
6.1
Στην περίπτωση που το G αναπαρίσταται µε λίστα γειτονικότητας, ένας αποδοτικός
αλγόριθµος είναι ο ακόλουθος: Για κάθε κορυφή u, πρόσθεσε στη λίστα των γειτό-
νων της u τις λίστες των γειτόνων όλων των κορυφών v που είναι γειτονικές της u,
(v, u) Œ E. Ο αλγόριθµος αυτός µπορεί να υλοποιηθεί σε χρόνο Ο(|V||E|).
Στην περίπτωση που το G αναπαρίσταται µε πίνακα γειτονικότητας, ένα στοιχείο
A[v, u] του πίνακα είναι µονάδα όταν υπάρχει µονοπάτι µήκους 1 (δηλαδή ακµή)
από τη v στη u. Στο τετράγωνο του πίνακα γειτονικότητας του G, το στοιχείο A2[v,
u] δηλώνει τον αριθµό των µονοπατιών µήκους 2 από τη v στη u. Για αυτό το λόγο,
υπάρχουν περιπτώσεις που A2[v, v] > 0, αφού το στοιχείο Α2[v, v] δηλώνει τον αριθ-
µό των κύκλων µήκους ακριβώς 2 που περιέχουν τη v. Εποµένως, ο πίνακας γειτο-
νικότητας του G2 µπορεί να υπολογιστεί από τον πίνακα (Α2 + Α), θέτοντας όλα τα
στοιχεία της διαγωνίου του στην τιµή 0 και όλα τα υπόλοιπα στοιχεία του, που είναι
µεγαλύτερα της µονάδας, στην τιµή 1. Χρησιµοποιώντας τον αλγόριθµο του Strassen
για τον υπολογισµό του A2, ο υπολογισµός του πίνακα γειτονικότητας του G2 µπο-
ρεί να γίνει σε χρόνο O(|V|log 7).
6.2
Ένα γράφηµα G(V, E) είναι διµερές αν και µόνο αν µόνο αν οι κορυφές µπορούν να
χρωµατιστούν µε δύο χρώµατα (έστω πράσινο και κόκκινο), µε τρόπο ώστε να µην
υπάρχει ακµή µεταξύ κορυφών του ίδιου χρώµατος (επίσης, βλ. Άσκηση Αυτοαξιο-
λόγησης 5.4). Προφανώς, οι χρωµατικές κλάσεις αντιστοιχούν στα σύνολα V1 και
V2 του ορισµού. Υποθέτουµε ότι το γράφηµα G(V, E) είναι µη κατευθυντικό. Ο παρα-
κάτω αλγόριθµος µπορεί εύκολα να γενικευθεί για κατευθυντικά γραφήµατα.
Ο αλγόριθµος συνίσταται στη εκτέλεση ενός Ψαξίµατος Πρώτα σε Πλάτος από µία
οποιαδήποτε κορυφή s Œ V. Μετά το τέλος του ΨΠΠ, οι κορυφές που βρίσκονται σε
µονή απόσταση από την s (δηλαδή έχουν ανακαλυφθεί στην επανάληψη k, όπου k
µονός αριθµός) χρωµατίζονται πράσινες, και οι υπόλοιπες κορυφές χρωµατίζονται
κόκκινες. Ενόσω υπάρχουν κορυφές που δεν έχουν προσπελαστεί / χρωµατιστεί, σβή-
νουµε από το γράφηµα τις χρωµατισµένες κορυφές, διαλέγουµε µία νέα αρχική κορυ-
φή s¢ και επαναλαµβάνουµε την παραπάνω διαδικασία στο γράφηµα που ορίζεται
από τις µη χρωµατισµένες κορυφές. Όταν όλες οι κορυφές χρωµατιστούν, ελέγχου-
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 211
6.3
Έστω ένα κατευθυντικό γράφηµα G(V, E) και µία πίσω ακµή (u, v). Συνεπώς, υπάρ-
χει ένα µονοπάτι από την κορυφή v στη u που χρησιµοποιεί ακµές του δέντρου, το
οποίο συµπληρώνεται σε κύκλο από την ακµή (u, v).
Αντίστροφα, αν το γράφηµα G(V, E) περιέχει έναν κύκλο c. Έστω v η πρώτη κορυ-
φή του c που ανακαλύπτεται από το ΨΠΒ και, έστω (u, v) η ακµή του κύκλου c που
καταλήγει στη v. Η κορυφή u θα πρέπει να ενταχθεί στο υποδέντρο του ΨΠΒ µε ρίζα
τη v, γιατί υπάρχει µονοπάτι από τη v στην u, το οποίο αποτελεί µέρος του κύκλου
c, και όταν η v ανακαλύπτεται, όλες οι κορυφές του c είναι λευκές. Εποµένως, η (u,
v) θα γίνει µία πίσω ακµή.
6.4
Αρχικά, θα αποδείξουµε ότι δύο κορυφές u, v Œ V ανήκουν στην ίδια συνεκτική συνι-
στώσα C του G αν και µόνο αν βρίσκονται στο ίδιο δέντρο του ΨΠΒ(G).
Έστω ότι οι u και v ανήκουν στην ίδια συνεκτική συνιστώσα C. Τότε, οποιοδήποτε
µονοπάτι από τη u στη v διέρχεται µόνο από κορυφές της C, επειδή κάθε κορυφή,
που βρίσκεται σε κάποιο µονοπάτι από τη u στη v, είναι προσπελάσιµη τόσο από τη
u, όσο και από τη v. Έστω r Œ C η πρώτη κορυφή της C που ανακαλύπτεται από το
ΨΠΒ(G). Αφού όλες οι υπόλοιπες κορυφές της C είναι προσπελάσιµες από την r και
έχουν λευκό χρώµα κατά τη χρονική στιγµή d[r], κάθε κορυφή της C πρέπει να ανα-
καλυφθεί από το ΨΠΒ πριν τη χρονική στιγµή f[r]. ∆ηλαδή, οι κορυφές u, v Œ C
ανήκουν στο δέντρο του ΨΠΒ(G) µε ρίζα την r.
Αντίστροφα, κάθε δύο κορυφές u, v που ανήκουν στο ίδιο δέντρο του ΨΠΒ(G), είναι
προσπελάσιµες η µία από την άλλη. Εποµένως, ανήκουν και στην ίδια συνεκτική
συνιστώσα του G.
Αφού η ένταξη στο ίδιο δέντρο του ΨΠΒ είναι ικανή και αναγκαία συνθήκη για να
ανήκουν δύο κορυφές στην ίδια συνεκτική συνιστώσα, το ΨΠΒ δεν µπορεί να εντά-
ξει κορυφές από διαφορετικές συνεκτικές συνιστώσες στο ίδιο δέντρο. Συνεπώς, το
ΨΠΒ δεν µπορεί να παράγει ούτε λιγότερα, αλλά ούτε και περισσότερα δέντρα από
τις συνεκτικές συνιστώσες.
Για τον υπολογισµό της συνεκτικής συνιστώσας στην οποία εντάσσεται κάθε κορυ-
φή, διατηρούµε µία µεταβλητή c σφαιρικής εµβέλειας που αρχικοποιείται στο 0. Ο
212 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
7.1
(1) Έστω µια γλώσσα L που αποφασίζεται από µία DTM Μ = (Q, Σ, δ, q0) µε µία
ταινία. Μπορούµε να ορίσουµε µια DTM Μ¢ που αποδέχεται την L, τροποποιώ-
ντας τη συνάρτηση µετάβασης δ, ώστε για κάθε ζευγάρι (q, σ), q Œ Q – F, σ Œ
Σ, που κάνει την Μ να µεταβεί στην κατάσταση ΟΧΙ, η Μ¢ να παραµένει στην
κατάσταση q (π.χ. δ¢(q, σ) = (q, σ, S)).
(2) Αν εναλλάξουµε αµοιβαία τις καταστάσεις ΝΑΙ και ΟΧΙ µιας DTM Μ που απο-
φασίζει την L, κατασκευάζουµε µία DTM Μ¢ που αποφασίζει το συµπλήρωµα
L της L.
(3) Οι προτάσεις (1) και (2) αποδεικνύουν τη µία κατεύθυνση. Αντίστροφα, έστω
δύο DTM Μ και Μ¢ που αποδέχονται την L και την L , αντίστοιχα. Κάθε x Œ Σ*,
ανήκει είτε στην L είτε στην L . Εποµένως, για κάθε είσοδο x, µία από τις Μ και
Μ¢ θα τερµατίζει στην κατάσταση ΝΑΙ. Για κάθε είσοδο x, µπορούµε να εκτε-
λούµε τις Μ και Μ¢ παράλληλα (δηλαδή, κάθε βήµα της Μ ακολουθείται από ένα
βήµα της Μ¢), µε το x να γίνεται αποδεκτό όταν Μ(x) = ΝΑΙ, και να απορρίπτε-
ται όταν Μ¢(x) = ΝΑΙ.
7.2
Θα κατασκευάσουµε µία DTM M¢ που αποφασίζει την L σε χρόνο Ο(t(n)). Με είσο-
δο x, η Μ¢ προσοµοιώνει την DTM Mt που αντιστοιχεί στη συνάρτηση περιορισµού
t(n), γράφοντας το αποτέλεσµα της Μt σε χωριστή ταινία εργασίας. Στη συνέχεια, η
Μ¢ προσοµοιώνει τη λειτουργία της Μ µε είσοδο x για t(|x|) βήµατα. Για να µετρή-
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 213
σει τον αριθµό των βηµάτων, η Μ¢ σβήνει ένα σύµβολο 1 από την ταινία που γρά-
φτηκε η έξοδος της Μt µετά από κάθε βήµα της Μ. Η Μ¢ αποδέχεται το x αν Μ(x) =
ΝΑΙ πριν τελειώσουν τα σύµβολα 1 από την ταινία εξόδου της Μt. Αν το µήκος του
υπολογισµού της Μ ξεπεράσει τα t(|x|) βήµατα, χωρίς η Μ να αποδεχτεί το x, η Μ¢
τερµατίζει απορρίπτοντας το x. Η συµβολοσειρά x Œ L αν και µόνο αν Μ(x) = ΝΑΙ
µετά από το πολύ t(n) βήµατα. Εποµένως, η Μ¢ αποδέχεται κάθε x Œ L και απορρί-
πτει κάθε x œ L. Επίσης, η παραπάνω προσοµοίωση µπορεί να πραγµατοποιηθεί σε
χρόνο Ο(t(|x|).
7.3
Είναι φανερό ότι αν t1(n) είναι ένα οποιοδήποτε πολυώνυµο και t2(n) = 2n, ισχύει
t2(n) = ω(t1(n) log t1(n)). Εποµένως, εφαρµόζοντας το Θεώρηµα 7.1, συµπεραίνου-
µε ότι η κλάση P είναι γνήσιο υποσύνολο της κλάσης DTIME[2n] και, άρα, της
κλάσης EXP.
7.4
Το πρόβληµα του Πολλαπλασιασµού Ακολουθίας Πινάκων λύνεται σε χρόνο Ο(n3),
όπου n ο αριθµός των πινάκων, µε την υπόθεση ότι το διάνυσµα των διαστάσεων
αναπαρίσταται σε χώρο Ο(n), και οι αριθµητικές πράξεις µεταξύ των στοιχείων του
διανύσµατος διαστάσεων εκτελούνται σε σταθερό χρόνο. Άρα, ανήκει στην κλάση
DTIME[n3] και, φυσικά, στην κλάση P.
Το πρόβληµα της Μεγαλύτερης Κοινής Υποακολουθίας λύνεται σε χρόνο O(n2),
όπου n το µήκος της µεγαλύτερης από τις δύο ακολουθίες Χ και Υ, από έναν αλγό-
ριθµο δυναµικού προγραµµατισµού. Εποµένως, ανήκει στην κλάση DTIME[n2] και,
φυσικά, στην κλάση P.
7.5
Έστω δύο γλώσσες L1, L2 Œ P και Μ1, Μ2 δύο DTM πολυωνυµικού χρόνου που απο-
φασίζουν αυτές τις γλώσσες. Η ένωση των L1 και L2 είναι L1 » L2 = {x Œ Σ*: x Œ L1
ή x Œ L2}. Για κάθε είσοδο x, εκτελούµε τις M1(x) και Μ2(x), και απορρίπτουµε το x
αν και µόνο αν M1(x) = ΟΧΙ και M2(x) = ΟΧΙ. Αντίστοιχα, L1 « L2 = {x Œ Σ*: x Œ L1
και x Œ L2}. Για κάθε x Œ Σ*, εκτελούµε τις Μ1(x) και M2(x), και αποδεχόµαστε το x
αν και µόνο αν M1(x) = ΝΑΙ και M2(x) = ΝΑΙ. Όσον αφορά στο συµπλήρωµα της L1,
για κάθε x Œ Σ*, εκτελούµε την M1(x) και αποδεχόµαστε το x, αν και µόνο αν Μ1(x)
= ΟΧΙ. Αφού η Μ1 και η Μ2 λειτουργούν σε πολυωνυµικό χρόνο, το ίδιο συµβαίνει
και µε όλους τους παραπάνω συνδυασµούς τους.
214 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
7.6
Έστω ένα στιγµιότυπο του προβλήµατος του διµερούς γραφήµατος, δηλαδή ένα γρά-
φηµα G(V, E). Θα περιγράψουµε έναν αλγόριθµο πολυωνυµικού χρόνου, ο οποίος
υπολογίζει µία λογική πρόταση φG, η οποία βρίσκεται σε ΣΚΜ µε 2 άτοµα ανά όρο
και είναι ικανοποιήσιµη, αν και µόνο αν το γράφηµα G είναι διµερές.
Έστω V = {1, 2, …, n}. Σε κάθε κορυφή i Œ V του G αντιστοιχούµε µία λογική µετα-
βλητή xi, και για κάθε ακµή (i, j) Œ E, προσθέτουµε στη φG τους όρους (ÿxi Ú xj) Ÿ
(xi Ú ÿxj), που αντιστοιχούν στη λογική πρόταση (xi ≈ xj). ∆ηλαδή, για να είναι η φG
ικανοποιήσιµη πρέπει, για κάθε δύο κορυφές που συνδέονται µε ακµή, ακριβώς µία
από τις δύο αντίστοιχες λογικές µεταβλητές µπορεί να έχει την τιµή TRUE. Ένα παρά-
δειγµα της παραπάνω κατασκευής φαίνεται στο Σχήµα 7.3.
4 (ÿx1Úx4)Ÿ(x1Úÿx4)Ÿ
(ÿx2Úx4)Ÿ(x2Úÿx4)Ÿ
2
™¯‹Ì· 7.3 (ÿx3Úx4)Ÿ(x3Úÿx4)Ÿ
Παράδειγµα
5 (ÿx2Úx5)Ÿ(x2Úÿx5)
κατασκευής
της λογικής
πρότασης φG. 3
Έστω ότι το G(V, E) είναι διµερές, και V1, V2 τα δύο σύνολα στα οποία διαχωρίζο-
νται οι κορυφές του. Η ανάθεση xi ¨ TRUE, αν i Œ V1 και xj ¨ FALSE, αν j Œ V2, ικα-
νοποιεί την η φG, αφού δεν υπάρχει ακµή (i, j), µε i Œ V1 και j Œ V1 ή i Œ V2 και j Œ
V2. Αντίστροφα, αν η φG είναι ικανοποιήσιµη, έστω Α : {x1, x2, …, xn} a {0, 1} µια
ανάθεση τιµών στις λογικές µεταβλητές που ικανοποιεί την φG. Θέτουµε V1 = {i Œ
V: A(xi) = TRUE } και V2 = {j Œ V : A(xj) = FALSE }. Από την κατασκευή της λογικής
πρότασης, αφού η ανάθεση Α ικανοποιεί την φG, δεν µπορεί να υπάρχουν ακµές µετα-
ξύ των κορυφών του V1 ή του V2. Εποµένως, το G(V, E) είναι διµερές.
8.1
Έστω δύο γλώσσες L1, L2 Œ NP. Εξ¢ ορισµού, υπάρχουν NDTM Ν1, Ν2 πολυωνυµι-
κού χρόνου που αποφασίζουν τις L1 και L2, αντίστοιχα. Είναι L1 » L2 = {x Œ Σ* : x
Œ L1 ή x Œ L2 }. Για να αποφασίσουµε αν κάποιο x ανήκει ή όχι στη L1 » L2, αρχι-
κά εκτελούµε τη N1(x) και αποδεχόµαστε το x αν η Ν1 το αποδέχεται. Αν όλοι οι κλά-
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ A ™ ∫ ∏ ™ ∂ ø ¡ AÀ ∆ √ ∞ • π √ § √ ° ∏ ™ ∏ ™ 215
δοι υπολογισµού της Ν1(x) καταλήγουν σε απόρριψη, εκτελούµε τη N2(x) και απο-
δεχόµαστε το x µόνο αν η N2 το αποδέχεται. Αν και όλοι οι κλάδοι της Ν2 καταλή-
γουν σε απόρριψη, απορρίπτουµε το x.
Αντίστοιχα, για τη L1 « L2 = { x Œ Σ* : x Œ L1 και x Œ L2 }, εκτελούµε τη N1(x), και
από κάθε υπολογισµό αποδοχής της Ν1, εκτελούµε τη Ν2(x). Αποδεχόµαστε το x µόνο
αν τόσο η N1 όσο και η N2 αποδέχονται το x.
Όσον αφορά στην πολυωνυµική αναγωγή, αφού υπάρχει µετασχηµατισµός R, τέτοι-
ος, ώστε ένα x Œ L1 αν και µόνο αν R(x) Œ L2, µπορούµε για κάθε x, να υπολογίσουµε
σε πολυωνυµικό ντετερµινιστικό χρόνο το R(x) και, στη συνέχεια, να αποφασίσου-
µε σε πολυωνυµικό µη ντετερµινιστικό χρόνο (γιατί L2 Œ NP) αν R(x) Œ L2, εποµέ-
νως, αν x Œ L1. Η διαδικασία χρειάζεται πολυωνυµικό µη ντετερµινιστικό χρόνο και,
συνεπώς, L1 Œ NP.
8.2
Η πρόταση (1) αποτελεί ανοικτό πρόβληµα γιατί είναι αληθής αν υποθέσουµε ότι P
= NP, αφού τότε κάθε γλώσσα στο NP θα ανήκει και στο P, αλλά είναι ψευδής αν
υποθέσουµε ότι P π NP (π.χ. το πρόβληµα της Προσπελασιµότητας ανήκει στο P,
ανάγεται πολυωνυµικά σε κάθε NP – πλήρες πρόβληµα, αλλά κανένα NP – πλήρες
πρόβληµα δεν ανήκει στο P, εφόσον P π NP).
Η πρόταση (2) είναι αληθής, γιατί εκφράζει την κλειστότητα του P ως προς την
πολυωνυµική αναγωγή (∆ραστηριότητα 7.9).
Η πρόταση (3) είναι αληθής και αποδεικνύεται µε απαγωγή σε άτοπο. Έστω ότι η L1
είναι NP – πλήρης. Τότε, επειδή η πολυωνυµική αναγωγή είναι µεταβατική (∆ρα-
στηριότητα 7.8) και L1 µ L2, θα έπρεπε και η L2 να είναι NP – πλήρης, το οποίο έχου-
µε υποθέσει ότι δεν ισχύει.
Η πρόταση (4) είναι αληθής, γιατί αφού L2 Œ NP (υποθέτουµε ότι η L2 είναι NP πλή-
ρης) η L1 είναι NP – πλήρης, πρέπει η L2 να ανάγεται πολυωνυµικά στην L1, όπως
συµβαίνει και µε κάθε άλλη γλώσσα στο NP.
8.3
Κάθε γράφηµα εισόδου, του οποίου όλες οι κορυφές έχουν βαθµό 2, αποτελείται από
έναν ή περισσότερους, ξένους µεταξύ τους απλούς κύκλους. Χωρίς βλάβη της γενι-
κότητας µπορούµε να θεωρήσουµε ότι το γράφηµα εισόδου G(V, E) είναι συνεκτι-
κό, δηλαδή αποτελείται από έναν απλό κύκλο, διαφορετικά µπορούµε να αντιµετω-
πίσουµε κάθε κύκλο ξεχωριστά.
216 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
Ένας απλός αλγόριθµος γραµµικού χρόνου είναι, ξεκινώντας από µια οποιαδήποτε
κορυφή, να εξετάσουµε όλες τις κορυφές µε τη σειρά που εµφανίζονται στον κύκλο.
Κάθε κορυφή περιλαµβάνεται στο σύνολο ανεξαρτησίας αν καµία από τις γειτονι-
κές της δεν έχει ήδη περιληφθεί. Με αυτό τον τρόπο υπολογίζουµε ένα σύνολο ανε-
Το πρόβληµα της Μέγιστης Κλίκας στο γράφηµα G(V, E) είναι ίδιο µε το πρόβλη-
µα του Μέγιστου Συνόλου Ανεξαρτησίας στο συµπληρωµατικό γράφηµα G (V , E ) .
Το συµπληρωµατικό γράφηµα G (V , E ) ενός γραφήµατος G(V, E) έχει το ίδιο σύνο-
λο κορυφών V, ενώ δύο κορυφές συνδέονται µε ακµή αν και µόνο αν δεν συνδέο-
νται µε ακµή στο G, δηλαδή E = {(u, v ) ŒV ¥ V :(u, v ) œ E } .
Εποµένως, ένα σύνολο κορυφών V¢ στο γράφηµα G είναι κλίκα αν και µόνο αν το
V¢ είναι σύνολο ανεξαρτησίας στο συµπληρωµατικό γράφηµα G . Συνεπώς, το γρά-
φηµα G έχει µία κλίκα µεγέθους τουλάχιστον Κ, αν και µόνο αν το γράφηµα G έχει
ένα σύνολο ανεξαρτησίας µεγέθους, τουλάχιστον Κ. Άρα, το πρόβληµα της Μέγι-
στης Κλίκας είναι NP – πλήρες.
∞·ÓÙ‹ÛÂȘ ¢Ú·ÛÙËÚÈÔًوÓ
1.1
procedure russe_II(A, B)
X ¨ A; Y ¨ B; product ¨ 0;
while X >= 1 do
if X ÂÚÈÙÙfi˜ then product ¨ Y;
X ¨ X div 2;
Y ¨ Y + Y;
return product;
Η νέα κωδικοποίηση εκτελείται ταχύτερα, γιατί σε µία επανάληψη πραγµατοποιεί
τόσο τους αναγκαίους υποδιπλασιασµούς του πολλαπλασιαστή και διπλασιασµούς
του πολλαπλασιαστέου, όσο και τις προσθέσεις. Επίσης, η νέα κωδικοποίηση χρη-
σιµοποιεί µόλις 3 θέσεις µνήµης (µεταβλητές X, Y, product).
1.2
procedure linear_search(A[1,...,n], x)
i ¨ 1;
while i <= n do
if A[i] = x then return i;
i ¨ i + 1;
return 0;
1.3
Για να βρούµε την απάντηση υπολογίζουµε τις τιµές των δύο συναρτήσεων για δια-
φορετικές τιµές του n. Στην αρχή, διπλασιάζουµε την τιµή του n για να εντοπίσουµε
γρήγορα τα όρια ενός διαστήµατος µέσα στο οποίο η ποσότητα (100n2 – 2n) γίνεται
από θετική αρνητική. Στη συνέχεια, εντοπίζουµε την αναζήτηση σε αυτό το διάστηµα.
n 2n 100n2
2 4 400
4 16 1600
8 256 6400
218 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
16 65536 25600
12 4096 14400
14 16384 19600
15 32768 22500
1.4
524613Æ254613 t2 = 2
254613Æ245613 t3 = 2
245613Æ245613 t4 = 1
245613Æ125463 t5 = 5
124563Æ123456 t6 = 4
1 23456Æ123456 t2 = 1
123456Æ123456 t3 = 1
123456Æ123456 t4 = 1
123456Æ123456 t5 = 1
123456Æ123456 t6 = 1
6 54321Æ564321 t2 = 2
564321Æ456321 t3 = 3
456321Æ345621 t4 = 4
345621Æ234561 t5 = 5
134561Æ123456 t6 = 6
1.5
Insertion Sort Αλγόριθµος B
103 0,02 sec 0,5 sec
104 2 sec 7 sec
105 3 min, 20 sec 1 min, 23 sec
106 5 h, 33 min, 20 sec 16 min, 37 sec
107 555 h, 33 min, 20 sec 3 h, 13 min, 47 sec
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 219
2.1
Έστω ότι f(n) = O(g(n)) και f(n) = Ω(g(n)). Από τους ορισµούς των συµβολισµών Ο
και Ω, υπάρχουν σταθερές co και no, και cω και nω, τέτοιες ώστε:
0 £ f(n) £ co g(n), για όλα τα n ≥ no, και 0 £ cω g(n) £ f(n), για όλα τα n ≥ nω.
Θέτοντας nΘ = max(no, nω), έχουµε ότι 0 £ co g(n) £ f(n) £ cω g(n), για όλα τα n ≥ nΘ
και, εποµένως, f(n) = Θ(g(n)).
Αντίστροφα, αν f(n) = Θ(g(n)), τότε από τον ορισµό του συµβολισµού Θ, υπάρχουν
σταθερές c1, c2, και n0, τέτοιες ώστε 0 £ c1 g(n) £ f(n) £ c2 g(n), για όλα τα n ≥ n0.
Εποµένως, για όλα τα n ≥ n0, είναι 0 £ f(n) £ c2 g(n), οπότε f(n) = O(g(n)), και 0 £ c1
g(n) £ f(n), οπότε f(n) = Ω(g(n)).
2.2
1 2 3 4
2.3
 Â
n n
Ο ισχυρισµός (n - i + 1) = i προφανώς ισχύει για n = 1. Για να δείξουµε
i =1 i =1
ότι ισχύει για κάθε τιµή του n, υποθέτουµε ότι ισχύει για ένα συγκεκριµένο n, και
θα αποδείξουµε ότι ισχύει για n + 1. Πράγµατι,
n +1 n n n n +1
 (n - i + 1) = 1 +  [(n + 1) - i + 1] =1 + n +  (n - i + 1) = n + 1 +  i =  i ,
i =1 i =1 i =1 i =1 i =1
220 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
όπου στην πρώτη ισότητα βγάλαµε εκτός αθροίσµατος την περίπτωση i = n + 1, στη δεύ-
τερη ισότητα βγάλαµε εκτός αθροίσµατος µία µονάδα για καθένα από τους n όρους [(n
+ 1) – i + 1] (οι οποίοι έγιναν n – i + 1), στην τρίτη ισότητα εφαρµόσαµε την επαγωγική
υπόθεση και στην τέταρτη ισότητα βάλαµε στο άθροισµα την περίπτωση i = n + 1.
2.4
Ο ισχυρισµός ισχύει για n = 1. Υποθέτουµε ότι ισχύει για n, και θα δείξουµε ότι ισχύ-
ει για n + 1. Πράγµατι,
n +1 n
Âi
i =1
2
= (n + 1) +
2
Âi i =1
2
n(n + 1)( 2n + 1)
= (n + 1)2 +
6
(n + 1)( 2n + 7n + 6 ) (n + 1)[(n + 1) + 1][ 2(n + 1) + 1]
2
= =
6 6
2.5
Για κάθε i > 1, έχουµε 1/ i2 < 1 / i (i – 1). Συνεπώς,
Ê 1 1ˆ
n n n n
   Â
1 1 1
=1+ £1+ =1+ Á - ˜
i =1
i2 i =2
i2 i =2
i(i - 1) i =2
Ë i -1 i ¯
Ê 1 1ˆ
n
Â
n
Ένα τηλεσκοπικό άθροισµα έχει τη µορφή ( ai - ai +1 ) . Το αποτέλεσµα αυτού
i =1
του αθροίσµατος είναι α1 – αn + 1, επειδή οι όροι α2, α3, … αn προστίθενται και αφαι-
ρούνται ακριβώς µία φορά ο καθένας.
Ê 1 1ˆ
n n
 Âi
1 1 1
Εποµένως, Á - ˜ = 1 - , και £ 2- = O (1) .
i =2
Ë i -1 i ¯ n i =1
2
n
2.6
merge(A, p, q, r)
array X[p, ..., r]
X[p, ..., q] ¨ A[p, ..., q];
X[q + 1, ..., r] ¨ A[q + 1, ..., r];
i ¨ p; j ¨ q + 1;
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 221
for k ¨ p to r do
if i > q then
A[k] ¨ X[j]; j ¨ j + 1;
if j > r then
A[k] ¨ X[i]; i ¨ i + 1;
if (i £ q) and (j £ r) and (X[i] > X[j]) then
A[k] ¨ X[j]; j ¨ j + 1;
else
A[k] ¨ X[i]; i ¨ i + 1;
Στον παραπάνω ψευδοκώδικα, χρησιµοποιούµε τον πίνακα x σαν περιοχή προσωρι-
νής αποθήκευσης, και αντιγράφουµε τα στοιχεία των υποπινάκων A[p, …, q] και A[q
+ 1, …, r] στις αντίστοιχες θέσεις του πίνακα X. Οι µεταβλητές i και j δείχνουν κάθε
φορά στα µικρότερα στοιχεία των υποπινάκων Χ[p, …, q] και Χ[q + 1, …, r] τα οποία
δεν έχουν τοποθετηθεί ακόµα στον πίνακα Α[p, …, r], ενώ η µεταβλητή k δείχνει
πόσα στοιχεία έχουν τοποθετηθεί στον συνενωµένο πίνακα. Σε κάθε επανάληψη,
τοποθετούµε το µικρότερο από τα στοιχεία X[i] (p £ i £ q) και X[j] (q + 1 £ j £ r)
στον συνενωµένο πίνακα Α, ενώ όταν τελειώσουν τα στοιχεία κάποιου από τους υπο-
πίνακες, γεµίζουµε τον πίνακα Α µε τα υπόλοιπα στοιχεία του άλλου υποπίνακα.
Επειδή οι υποπίνακες X[p, …, q] και X[q + 1, …, r] είναι διατεταγµένοι σε αύξου-
σα σειρά, ο πίνακας A[p, …, r] που προκύπτει σαν αποτέλεσµα τη συνένωσης, είναι
επίσης διατεταγµένος σε αύξουσα σειρά.
Όσον αφορά στον χρόνο εκτέλεσης της διαδικασίας merge, η αντιγραφή των υποπι-
νάκων στον πίνακα X κοστίζει γραµµικό χρόνο, ενώ κάθε επανάληψη του βρόγχου
for κοστίζει σταθερό χρόνο. Επειδή ο βρόγχος for εκτελείται ακριβώς r – p + 1
φορές, ο χρόνος εκτέλεσης της διαδικασίας merge είναι όντως γραµµικός στο µέγε-
θος του πίνακα Α που προκύπτει από τη συνένωση των δύο υποπινάκων.
2.7
binary_search(array A[p,...,n], x)
m ¨ (p + n) / 2;
if A[m] = x then return(m);
if n = 1 then return(0); {Το x δεν βρέθηκε}
if A[m] < x then binary_search(A[m + 1, ..., n], x);
else binary_search(A[1, ..., m], x);
Έστω T(n) είναι ο χρόνος εκτέλεσης χειρότερης περίπτωσης για δυαδική αναζήτη-
ση σε έναν πίνακα n στοιχείων. Το T(n) είναι ίσο µε το άθροισµα του χρόνου για τον
222 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
υπολογισµό του m, τη σύγκριση του A[m] µε το x, και την αναδροµική κλίση της
binary_search σε έναν από τους δύο υποπίνακες, οι οποίοι έχουν το πολύ n/2 στοι-
χεία. (Η χειρότερη περίπτωση της binary search συµβαίνει όταν το x δεν υπάρχει
στον πίνακα Α). Ο χρόνος για τον υπολογισµό του m και τη σύγκριση των A[m] και
x είναι σταθερός, ενώ ο χρόνος για την αναδροµική κλήση της binary_search είναι
το πολύ T(n/2). Όσον αφορά στις αρχικές συνθήκες της αναδροµικής εξίσωσης, όταν
ο πίνακας εισόδου περιέχει µόνο ένα στοιχείο, η αναζήτηση γίνεται σε σταθερό
χρόνο. Εποµένως, ο χρόνος εκτέλεσης χειρότερης περίπτωσης για την δυαδική ανα-
ζήτηση δίνεται από την εξίσωση:
ÏQ (1) αν = 1.
T (n ) = Ì
ÓT (n / 2 ) + Q (1) αν > 1,
2.8
Το δέντρο της αναδροµής για την αναδροµική εξίσωση T (n ) = 4T ( În / 2û ) + n φαί-
νεται στο Σχήµα 2.4. Βλέπουµε ότι η συνεισφορά του επιπέδου i του δέντρου της
αναδροµής (η ρίζα βρίσκεται στο επίπεδο 0) είναι ίση µε n2i. Επιπλέον, το δέντρο
έχει ύψος log n (log n + 1 επίπεδα). Εποµένως,
log n log n
T (n ) =  2 n = n 2 £ 2n ,
i =0
i
i =0
i 2
όπου η τελευταία ανισότητα προκύπτει από την Άσκηση Αυτοαξιολόγησης 2.4. Πράγ-
µατι, αν θεωρήσουµε αρχική συνθήκη Τ(1) = 1 και σαν τιµές του n µόνο ακέραιες δυνά-
µεις του 2, µε µαθηµατική επαγωγή µπορούµε να αποδείξουµε ότι T(n) = n(2n – 1).
n n
log n ¥4 ¥4 ¥4 ¥4
+
...
2.9
Έχουµε δει ότι ο χρόνος εκτέλεσης χειρότερης περίπτωσης της δυαδικής αναζήτη-
σης περιγράφεται από την αναδροµική εξίσωση T(n) = T(n/2) + Θ(1), Τ(1) = Θ(1).
Επίσης, στην Άσκηση Αυτοαξιολόγησης 2.4 είδαµε µια παρόµοια αναδροµική εξί-
σωση, η οποία είχε λύση T¢(n) = log n + 1. Υποθέτουµε λοιπόν ότι η λύση της ανα-
δροµικής εξίσωσης που δίνει το χρόνο εκτέλεσης χειρότερης περίπτωσης της δυα-
δικής αναζήτησης είναι T(n) = Θ(log n).
Αν και log 1 = 0, για µικρές τιµές του n που ξεπερνούν τη µονάδα (n = 2, 3, 4, κοκ.)
η λύση Θ(log n) επαληθεύει την αναδροµική εξίσωση. Έστω c1, c2 οι σταθερές που
κρύβει ο συµβολισµός Θ(1) στον ορισµό της αναδροµικής εξίσωσης. Υποθέτουµε
ότι c1 log(n/2) £ T(n/2) £ c2 log(n/2) και, µε τη µέθοδο της αντικατάστασης, θα δεί-
ξουµε ότι c1 log n £ T(n) £ c2 log n. Πράγµατι:
n n
T (n ) £ c2 log + c2 T (n ) ≥ c1 log + c1
2 και 2
£ c2 (log n - 1) + c2 ≥ c1 (log n - 1) + c1
= c2 log n , = c1 log n .
2.10
n log n n log n
+
log n +
...
Για να αποκτήσουµε µια ασυµπτωτική εκτίµηση για τη λύση της αναδροµικής εξί-
σωσης, σχεδιάζουµε το δέντρο της αναδροµής (Σχήµα 2.5).
224 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
Èlog n log n ù
Â
= n Í log n -
ÍÎ i = 0
iú
i =0 ú
Â
û
È log n(log n + 1) ù
= n Í log n(log n + 1) - ú
Î 2 û
n log n(log n + 1)
= = Q (n log 2 n ) .
2
3.1
A[p...r]
5 3 2 6 4 1 3 7 5 3 2 6 4 1 3 7
(α) (β)
i j i j
3 3 2 6 4 1 5 7 3 3 2 6 4 1 5 7
i j i j
(γ) (δ)
A[p...q] A[q+1...r]
™¯‹Ì· 3.5
3 3 2 1 4 6 5 7
Η λειτουργία της
partition για τον
πίνακα Α = [5, 3, j i
2, 6, 4, 1, 3, 7]. (ε)
Η αναπαράσταση λειτουργίας της partition για τον πίνακα Α φαίνεται στο Σχήµα 3.5,
όπου τα στοιχεία που έχουν δεν τοποθετηθεί ακόµη στο σωστό υποπίνακα σηµειώ-
νονται µε γκρίζο φόντο. Το στοιχείο γύρω από το οποίο οργανώνεται η διαίρεση είναι
το x = 5. Αρχικά, το στοιχείο 5 (5 ≥ x) δεν επιτρέπει στην περιοχή του αριστερού
άκρου να µεγαλώσει, και το στοιχείο 3 (3 £ x) δεν επιτρέπει στην περιοχή του δεξι-
ού άκρου να µεγαλώσει (Σχήµα 3.5.(β)). Αυτό διορθώνεται µε την αντιµετάθεση των
στοιχείων 5 και 3 (Σχήµα 3.5.(γ)). Τα επόµενα στοιχεία που δεν επιτρέπουν την ανά-
πτυξη των δύο περιοχών είναι τα 6 και 1 (Σχήµα 3.5.(δ)). Μετά την αντιµετάθεση
των 6 και 1, η διαίρεση ολοκληρώνεται µε όριο το σηµείο q = j = 5.
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 225
13 19 9 5 12 8 7 4 11 2 6 21 13 19 9 5 12 8 7 4 11 2 6 21
i i j
6 19 9 5 12 8 7 4 11 2 13 21 6 2 9 5 12 8 7 4 11 19 13 21
i j j i
™¯‹Ì· 3.6
Η λειτουργία της partition για τον πίνακα B = [13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 21]
Η λειτουργία
φαίνεται στο Σχήµα 3.6. της partition για
τον πίνακα Β.
3.2
Από τον ψευδοκώδικα της partition, είναι φανερό ότι κάθε στοιχείο του πίνακα A[p,
…, r], εκτός από τα δύο στοιχεία που βρίσκονται εκατέρωθεν του ορίου q, συγκρί-
νεται ακριβώς µία φορά µε το στοιχείο x γύρω από το οποίο οργανώνεται η διαίρε-
ση. Ο λόγος είναι ότι ο δείκτης j πάντα µειώνεται, ο δείκτης i πάντα αυξάνεται και,
όταν ο j σταµατήσει σε κάποια θέση (συµπεριλαµβανοµένης και θέσης q), ο δείκτης
i θα σταµατήσει πριν τη θέση j, ή στη θέση j + 1 στην τελευταία επανάληψη. Επί-
σης, κάθε στοιχείο αντιµετατίθεται το πολύ µία φορά, ενώ µετά την αντιµετάθεση
δεν συγκρίνεται πάλι µε το στοιχείο x. Εποµένως, αφού σε κάθε στοιχείο του πίνα-
κα A[p,…, r] αντιστοιχεί µία σύγκριση µε το x και το πολύ µία αντιµετάθεση, ο χρό-
νος εκτέλεσης της partition είναι Θ(r – p + 1) = Θ(n).
3.3
Είδαµε ότι ένα στιγµιότυπο εισόδου για την quicksort χρειάζεται χρόνο Θ(n log n)
όταν, σε κάθε της εφαρµογή, η διαδικασία partition παράγει δύο ισοµεγέθεις υποπί-
νακες. Ας θεωρήσουµε τον πίνακα [5, 1, 2, 4, 7, 3, 6, 8]. Αρχικά, η partition παρά-
γει τους υποπίνακες [3, 1, 2, 4] και [7, 5, 6, 8]. Ο υποπίνακας [3, 1, 2, 4] διαιρείται
περαιτέρω στους υποπίνακες [2, 1] και [3, 4], ενώ ο υποπίνακας [7, 5, 6, 8] διαιρεί-
ται περαιτέρω στους υποπίνακες [6, 5] και [7, 8]. Εποµένως, ο πίνακας [5, 1, 2, 4, 7,
3, 6, 8] έχει τα χαρακτηριστικά των στιγµιότυπων που χρειάζονται χρόνο Θ(n log n).
Ένα άλλο παράδειγµα πίνακα µε ανάλογα χαρακτηριστικά είναι ο [9, 1, 2, 4, 7, 3, 6,
8, 13, 5, 10, 12, 15, 11, 14, 16].
Από την άλλη πλευρά, ένα στιγµιότυπο εισόδου για την quicksort χρειάζεται χρόνο
Θ(n2) όταν, σε κάθε βήµα, η διαδικασία partition παράγει έναν υποπίνακα µεγέθους
1 και έναν υποπίνακα µεγέθους n – 1. Τέτοια παραδείγµατα είναι κάθε πίνακας του
οποίου τα στοιχεία είναι διατεταγµένα σε αύξουσα ή φθίνουσα σειρά.
226 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
3.4
Ο χρόνος εκτέλεσης της quicksort T(n) σε αυτή την περίπτωση δίνεται από την ανα-
δροµική εξίσωση T(n) = T(cn) + T(dn) + Θ(n). Έστω y ≥ 1 µία σταθερά τέτοια, ώστε
ο χρόνος εκτέλεσης της διαδικασίας partition να µην ξεπερνά το yn. Παρατηρώντας
το δέντρο της αναδροµής (Σχήµα 3.7), βλέπουµε ότι η συνεισφορά του επιπέδου i
(η ρίζα βρίσκεται στο επίπεδο 0) είναι y(c + d)in = yn. Επιπλέον, το ύψος του δέντρου
είναι µεταξύ logcn και logdn, είναι δηλαδή Θ(log n). Εποµένως, εφόσον c + d = 1,
T(n) = Θ(y n log n) = Θ(n log n), αφού το y είναι σταθερά.
yn yn
Το δέντρο
+
της αναδροµής για
...
την εξίσωση
T(n) = T(cn) +
T(dn) + Θ(n). Σύνολο: Θ(n logn)
3.5
Η ακόλουθη διαδικασία υπολογίζει το ελάχιστο στοιχείο ενός πίνακα A[1, …, n].
Επιπλέον, αν η σύγκριση (key > A[i]) γίνει (key < A[i]), η διαδικασία θα επιστρέφει
το µέγιστο στοιχείο του πίνακα Α[1, …, n].
minimum(A[1, ..., n])
key ¨ A[1];
for i ¨ 2 to n do
if key > A[i] then key ¨ A[i];
return key ;
Η διαδικασία minimum εκτελείται σε γραµµικό χρόνο αφού εκτελεί ακριβώς n – 1
επαναλήψεις. Επίσης, η διαδικασία minimum εκτελεί ακριβώς n – 1 συγκρίσεις µετα-
ξύ στοιχείων του Α.
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 227
Ο αριθµός των n – 1 συγκρίσεων είναι και ο ελάχιστος για την εύρεση του ελάχι-
στου / µέγιστου ενός πίνακα n στοιχείων. Κάθε αλγόριθµος που βρίσκει το ελάχιστο
στοιχείο µπορεί να θεωρηθεί σαν ένα τουρνουά µεταξύ των n στοιχείων. Οι συγκρί-
σεις αντιστοιχούν σε αγώνες του τουρνουά, σε καθέναν από τους οποίους νικητής
είναι το µικρότερο στοιχείο. Όλα τα στοιχεία, εκτός από το µικρότερο, πρέπει να
χάσουν σε τουλάχιστον ένα αγώνα. Εποµένως, απαιτούνται τουλάχιστον n – 1 αγώ-
νες / συγκρίσεις για την εύρεση του ελάχιστου στοιχείου. Αυτό σηµαίνει ότι δεν
υπάρχει αλγόριθµος µε χρόνο εκτέλεσης χειρότερης περίπτωσης o(n) για την εύρε-
ση του ελάχιστου / µέγιστου ενός πίνακα n στοιχείων.
3.6
Παρατηρώντας το δέντρο της αναδροµής (Σχήµα 3.8), βλέπουµε ότι η συνεισφορά
του επιπέδου i (η ρίζα βρίσκεται στο επίπεδο 0) είναι (1/c + 1/d)i Θ(n). Επιπλέον, το
ύψος του δέντρου είναι µεταξύ log(1/c)n και log(1/d)n, είναι δηλαδή Θ(log n). Εποµέ-
νως, είναι:
Q (log n ) Q (log n )
T (n ) = Â
i =0
Q (n )(1 / c + 1 / d )i = Q (n ) Â
i =0
(1 / c + 1 / d )i .
Â
Q (log n )
Όταν 1/c + 1/d < 1, το άθροισµα (1 / c + 1 / d )i είναι ίσο µε µια σταθερά,
i =0
Θ(n) Θ(n)
+
T(n) = T(n/c) +
...
T(n/d) + Θ(n).
228 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
Â
Q (log n )
Στην περίπτωση που 1/c + 1/d = 1, είναι (1 / c + 1 / d )i = Q (log n ) , και T(n)
i =0
= Θ(n log n).
3.7
Όταν τα στοιχεία του πίνακα Α χωρίζονται σε οµάδες των 7, το ενδιάµεσο στοιχείο
του δείγµατος είναι µεγαλύτερο από τουλάχιστον 4n/14 στοιχεία, και µικρότερο από
τουλάχιστον 4n/14 στοιχεία. Εποµένως, ο µεγαλύτερος υποπίνακας που µπορεί να
προκύψει από τη διαδικασία της διαίρεσης έχει µέγεθος το πολύ 5n/7. Ο χρόνος εκτέ-
λεσης χειρότερης περίπτωσης T(n) δίνεται από την αναδροµική εξίσωση T(n) =
T(5n/7) + T(n/7) + Θ(n), όπου T(n/7) είναι ο χρόνος για τον υπολογισµό του ενδιά-
µεσου στοιχείου του δείγµατος. Αφού 5/7 + 1/7 = 6/7 < 1, είναι Τ(n) = Θ(n).
Όταν τα στοιχεία χωρίζονται σε οµάδες των 3, ο µεγαλύτερος υποπίνακας µπορεί να
έχει µέγεθος µέχρι 2n/3. Ο χρόνος εκτέλεσης T(n) δίνεται από την αναδροµική εξί-
σωση T(n) = Τ(2n/3) + T(n/3) + Θ(n). Επειδή 2/3 + 1/3 = 1, η λύση αυτής της εξί-
σωσης είναι Τ(n) = Θ(n log n). ∆ηλαδή, όταν τα στοιχεία χωρίζονται σε οµάδες των
3 για τον υπολογισµό του δείγµατος, ο χρόνος χειρότερης περίπτωσης της διαδικα-
σίας quickselect είναι ασυµπτωτικά ίσος µε το χρόνο που χρειάζεται για να διατά-
ξουµε ολόκληρο τον πίνακα n στοιχείων.
3.8
Χρησιµοποιώντας τη διαδικασία quickselect µπορούµε να υπολογίσουµε το ενδιά-
µεσο στοιχείου του πίνακα Α[p, …, r] σε γραµµικό χρόνο. Οργανώνοντας τη διαίρε-
ση του πίνακα Α[p, …, r] γύρω από το ενδιάµεσο στοιχείο, η διαδικασία partition θα
καταλήγει πάντα σε δύο ισοµεγέθεις υποπίνακες. Ο χρόνος εκτέλεσης χειρότερης
περίπτωσης T(n) αυτής της παραλλαγής της quicksort δίνεται από την αναδροµική
εξίσωση T(n) = 2T(n/2) + Θ(n), η οποία γνωρίζουµε ότι έχει λύση T(n) = Θ(n log n).
Η παραλλαγή αυτή δεν χρησιµοποιείται στην πράξη γιατί, αν και έχει ασυµπτωτικά
µικρότερο χρόνο εκτέλεσης χειρότερης περίπτωσης, η πολλαπλασιαστική σταθερά
είναι σηµαντικά µεγαλύτερη, και ο αλγόριθµος είναι σηµαντικά πιο αργός από την
πιθανοτική παραλλαγή της quicksort.
3.9
Horner(A[a0, ...an – 1], x 0)
value ¨ 0; i ¨ n – 1;
while i ≥ 0 do
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 229
4.1
Προφανώς, ο αριθµός των πινάκων που αντιστοιχεί στο διάνυσµα d είναι n = 6. Η
διαδικασία MATRIX – CHAIN – MULT πρώτα αρχικοποιεί τα στοιχεία m[i, i], i = 1, …,
6, στο 0. Στη συνέχεια, υπολογίζει τις τιµές m[i, j], 1 £ i < j £ 6, εφαρµόζοντας την
αναδροµική εξίσωση:
ÏÔ0 αν i = j
m[i, j] = Ì
min{m[i, k ] + m[ k + 1, j] + di -1d k d j } αν i < j
ÔÓi £ k < j
Η λειτουργία της διαδικασίας matrix – chain – mult αναπαρίσταται στο Σχήµα 4.2, όπου
τα στοιχεία του πίνακα συµπληρώνονται από κάτω προς τα πάνω, και από αριστερά
προς τα δεξιά. Στο Σχήµα 4.2 έχει συµπληρωθεί ο ελάχιστος αριθµός των πολλαπλα-
σιασµών για τον υπολογισµό κάθε γινοµένου Αi..j, και σε παρένθεση, η θέση k στην
οποία γίνεται η διαίρεση, δηλαδή η θέση k για την οποία υπολογίζεται Ai..j = Ai..k Ak + 1..j.
6 1
15.125
5 (3) 2
11.875 10.500
j i
4 (3) (3) 3
9.375 7.125 5.375
3 (3) (3) (3) 4
7.875 4.375 2.500 3.500
2 (3) (3) (3) (3) 5
15.750 2.625 750 1.000 5.000
1 (3) (3) (3) (3) (3) 6
0 0 0 0 0 0 ™¯‹Ì· 4.2
Οι τιµές
του πίνακα m για
A1 A2 A3 A4 A5 A6 το διάνυσµα d.
230 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
Ο ελάχιστος αριθµός των πολλαπλασιασµών για τον υπολογισµό του γινοµένου είναι
15.125. Αυτός επιτυγχάνεται µε διαίρεση στη θέση 3, δηλαδή υπολογίζοντας πρώτα
τα γινόµενα Α1..3 και Α4..6. Ο υπολογισµός του Α1..3 απαιτεί 7.875 πολλαπλασιασµούς
στοιχείων και διαιρείται στη θέση 1, ενώ ο υπολογισµός του Α4..6 απαιτεί 3.500 πολ-
λαπλασιασµούς και διαιρείται στη θέση 5. Τελικά, ο βέλτιστος τρόπος υπολογισµού
είναι ((Α1(Α2 Α3))((Α4 Α5)Α6)).
4.2
RECURSIVE – MATRIX – CHAIN(d[i,...,j])
if i = j then return 0;
m[i,j] ¨ •;
for k ¨ i to j – 1 do
q ¨ RECURSIVE – MATRIX – CHAIN(d[i,...,k]) +
RECURSIVE – MATRIX – CHAIN(d[k + 1,...,j]) +
d[i – 1]d[k]d[j];
if q < m[i, j] then m[i,j] ¨ q;
return m[i,j];
Ο παραπάνω ψευδοκώδικας υπολογίζει αναδροµικά όλες τις τιµές m[i, j], 1 £ i < j £
n, συµπεριλαµβανοµένης και της m[1, n]. Παρατηρούµε ότι για τον υπολογισµό του
m[1, n] γίνονται 2 αναδροµικές κλήσεις για κάθε k = 1, 2, …, n – 1. Η πρώτη ανα-
δροµική κλήση αφορά τον υπολογισµό της τιµής m[1, k] και η δεύτερη της m[k + 1,
n]. Εποµένως, ο χρόνος εκτέλεσης T(n) για τον υπολογισµού της τιµής m[1, n] δίνε-
ται από την αναδροµική εξίσωση:
n -1 n -1
T (n ) ≥ 1 + Âk =1
(T ( k ) + T (n - k ) + 1) = n + 2 ÂT (k ) .
k =1
4.3
Έστω ότι για κάποια 1 < i < n και 1 < j £ m, είναι xi = yj, xi – 1 π yj και xi π yj – 1. Για
να υπολογιστούν οι τιµές των θέσεων c[i, j], c[i – 1, j] και c[i, j – 1] πρέπει να υπο-
λογιστεί η τιµή της θέσης c[i – 1, j – 1]. Άρα, το στιγµιότυπο <Xi – 1, Yj – 1> αποτελεί
κοινό επιµέρους στιγµιότυπο των στιγµιότυπων <Xi, Yj>, <Xi – 1, Yj> και <Xi, Yj – 1>.
Εποµένως, το πρόβληµα της µεγαλύτερης κοινής υπακολουθίας έχει την ιδιότητα
των επικαλυπτόµενων επιµέρους προβληµάτων.
4.4
Η διαδικασία LCS – length ξεκινά αρχικοποιώντας στο 0 την πρώτη γραµµή και την
πρώτη στήλη του πίνακα c (c[0, j] και c[i, 0]). Στη συνέχεια, οι τιµές των στοιχείων
του πίνακα m υπολογίζονται από πάνω προς τα κάτω, και από αριστερά προς τα
δεξιά, δηλαδή κάθε στοιχείο της γραµµής i υπολογίζεται πριν από κάθε στοιχείο της
γραµµής i + 1, και το στοιχείο c[i, j] υπολογίζεται πριν από το στοιχείο c[i, j + 1].
Οι τιµές όλων των στοιχείων του πίνακα c για τις ακολουθίες x και Υ φαίνονται στον
Πίνακα 4.1. Με γκρίζο σηµειώνονται τα κοινά στοιχεία των ακολουθιών που προ-
καλούν αύξηση του µήκους της κοινής υπακολουθίας κατά 1, δηλαδή εφαρµογή του
κανόνα c[i, j] = c[i – 1, j –1] + 1. Η µεγαλύτερη κοινή υπακολουθία των Χ και Υ έχει
µήκος 4. Η βέλτιστη υπακολουθία που υπολογίζεται από την LCS – LENGTH είναι
<Β, Γ, Β, Α>.
¶›Ó·Î·˜ 4.1
Ο πίνακας c για τις ακολουθίες Χ και Υ.
j 0 1 2 3 4 5 6
i yi B ∆ Γ A B A
0 xi 0 0 0 0 0 0 0
1 A 0 0 0 0 1 1 1
2 B 0 1 1 1 2 2 2
3 Γ 0 1 1 2 2 2 2
4 B 0 1 1 2 2 3 3
5 ∆ 0 1 2 2 2 3 3
6 A 0 1 2 2 3 3 4
8 B 0 1 2 2 3 4 4
232 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
4.5
Κάθε στοιχείο c[i, j] εξαρτάται µόνο από τις τιµές των στοιχείων c[i – 1, j – 1], c[i –
1, j] και c[i, j – 1]. Μπορούµε λοιπόν σε χρόνο Θ(1) να ελέγξουµε από ποιον κανό-
να της αναδροµικής εξίσωσης προέκυψε το στοιχείο c[i, j]. Η αναδροµική διαδικα-
σία PRINT – LCS υλοποιεί αυτή ακριβώς την ιδέα.
PRINT – LCS(Xi, Yj)
if i = 0 or j = 0 then return;
if xi = yj then
PRINT – LCS(Xi – 1, Yj – 1); print(xi);
else
if c[i, j] = c[i – 1, j] then
PRINT – LCS(Xi – 1, Yj);
else PRINT – LCS(Xi, Yj – 1);
Ο χρόνος εκτέλεσης της διαδικασίας PRINT – LCS είναι Ο(n + m), αφού σε κάθε βήµα
της αναδροµής ένα τουλάχιστον από τα i και j µειώνεται κατά 1.
5.1
Εφαρµόζουµε τον άπληστο αλγόριθµο που επιλέγει τη δραστηριότητα µε τη µικρό-
τερη διάρκεια στο στιγµιότυπο του παρακάτω πίνακα. Ο αλγόριθµος δίνει λύση C =
{2}, ενώ η βέλτιστη λύση είναι C* = {1, 3}.
i 1 2 3
si 1 4 5
fi 5 6 10
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
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.
5.3
GREEDY – KNAPSACK(B, (s1, p1),...,(sn, pn))
for i ¨ 1 to n do
r[i] ¨ pi / si ;
¢È¿Ù·Í ٷ ·ÓÙÈΛÌÂÓ· ÒÛÙ r[1] ≥ r[2] ≥ ... ≥ r[n];
for i ¨ 1 to n do
if B £ 0 then f[i] ¨ 0;
else if B ≥ si then
f[i] ¨ 1; B ¨ B – si;
else
f[i] ¨ si / B; B ¨ B – f[i]*si;
return f;
Έστω ότι ο άπληστος αλγόριθµος συµπεριλαµβάνει στο σακίδιο ακριβώς f1 s1, 0 <
f1 £ 1, µονάδες από το αντικείµενο 1. Θα αποδείξουµε ότι το κλασµατικό πρόβλη-
µα σακιδίου έχει την ιδιότητα της άπληστης επιλογής, αποδεικνύοντας ότι υπάρχει
µία βέλτιστη λύση Α¢ η οποία, επίσης, συµπεριλαµβάνει στο σακίδιο ακριβώς f1s1
µονάδες του αντικειµένου 1.
Αφού ο άπληστος αλγόριθµος συµπεριλαµβάνει στο σακίδιο (που αρχικά είναι άδειο)
όσες περισσότερες µονάδες από το αντικείµενο 1 µπορεί, δεν υπάρχει καµία λύση
που να συµπεριλαµβάνει στο σακίδιο περισσότερες µονάδες από το αντικείµενο 1
από τη λύση που υπολογίζει ο άπληστος αλγόριθµος. Έστω µία βέλτιστη λύση Α η
οποία συµπεριλαµβάνει στο σακίδιο f1A s1 µονάδες του αντικειµένου 1, όπου
f1A s1 < f1s1 . Η λύση Α¢ δηµιουργείται αντικαθιστώντας ακριβώς f1s1 - f1A s1 µονά-
δες των αντικειµένων που έχουν συµπεριληφθεί στην λύση Α και έχουν τους µικρό-
τερους λόγους αξίας προς µέγεθος, από ίσο αριθµό µονάδων του αντικειµένου 1.
Αυτή η αντικατάσταση δεν µεταβάλει το µέγεθος του σακιδίου, ενώ είναι p(A΄) ≥
p(A), αφού ο λόγος αξίας προς µέγεθος του αντικειµένου 1 είναι µεγαλύτερος ή ίσος
από τους αντίστοιχους λόγους των αντικειµένων που αντικατέστησε στη λύση Α.
Εποµένως, η λύση Α΄ είναι βέλτιστη και περιέχει ακριβώς f1s1 µονάδες του αντι-
κειµένου 1.
Από την ιδιότητα των βέλτιστων επιµέρους δοµών, η λύση Α¢ / {1} πρέπει να είναι
βέλτιστη λύση του επιµέρους στιγµιότυπου που προκύπτει από την αποµάκρυνση f1s1
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 235
5.4
Έστω ένα δυαδικό δέντρο Τ, το οποίο δεν είναι πλήρες, και έστω ένας εσωτερικός
κόµβος z του Τ, ο οποίος έχει ακριβώς έναν κόµβο – παιδί w. Μπορούµε να δηµι-
ουργήσουµε ένα νέο δέντρο Τ¢ αποµακρύνοντας το z και συνδέοντας το w στον
κόµβο – πατέρα του z. Οι κωδικοί που αντιστοιχούν σε όλα τα φύλλα – απόγονους
του z έχουν ένα δυαδικό ψηφίο λιγότερο στο δέντρο Τ¢. Επίσης, το µήκος των κωδι-
κών για τα φύλλα του Τ που δεν είναι απόγονοι του z δεν µεταβλήθηκε. Εποµένως,
το κόστος του Τ¢ είναι µικρότερο από αυτό του Τ, και το Τ δεν είναι βέλτιστο.
Αφού κάθε ακµή του δέντρου αναπαράστασης ενός κώδικα αντιστοιχεί σε ένα δυα-
δικό ψηφίο, όταν το δέντρο δεν είναι πλήρες χρησιµοποιούµε περισσότερα δυαδικά
ψηφία από όσα πραγµατικά χρειάζονται και, άρα, δεν έχουµε έναν βέλτιστο κώδικα.
5.5
Θα χρησιµοποιήσουµε µαθηµατική επαγωγή στον αριθµό των φύλλων του δέντρου
Τ. Για δύο φύλλα x και y, προφανώς, Β(Τ) = f(x) + f(y). ∆εχόµαστε ότι η πρόταση
ισχύει για δέντρα µε n ή λιγότερα φύλλα και θα αποδείξουµε ότι ισχύει και για δέντρα
n + 1 φύλλων.
Έστω ένα δέντρο T µε n + 1 φύλλα, το οποίο αποτελείται από τα υποδέντρα T1 µε
n1 < n + 1 φύλλα, και Τ2 µε n2 < n + 1 φύλλα. Όταν γίνεται συνένωση των υποδέ-
ντρων Τ1 και Τ2, το µήκος των κωδικών που αντιστοιχούν σε όλα τα φύλλα των T1
και Τ2 αυξάνεται κατά 1, εποµένως, το κόστος Β(Τ) είναι ίσο µε το άθροισµα του
κόστους των Τ1 και Τ2, προσαυξηµένο µε το άθροισµα των συχνοτήτων εµφάνισης
όλων των φύλλων του Τ1 και Τ2. Το άθροισµα των συχνοτήτων εµφάνισης των φύλ-
λων ενός υποδέντρου Τ1 είναι ίσο µε τη συχνότητα f(T1) του κόµβου – ρίζα του Τ1.
Εποµένως, Β(Τ) = f(Τ1) + f(Τ2) + Β(Τ1) + Β(Τ2), δηλαδή το Β(Τ) είναι ίσο µε το άθροι-
σµα του κόστους της συνένωσης των Τ1 και Τ2 και του κόστους των δύο υποδέντρων
Τ1 και Τ2. Από την επαγωγική υπόθεση, τα κόστη Β(Τ1) και Β(Τ2) είναι ίσα µε τα
αθροίσµατα του κόστους όλων των συνενώσεων για τη δηµιουργία των Τ1 και Τ2,
αντίστοιχα. Εποµένως, το Β(Τ) είναι πράγµατι ίσο µε το άθροισµα του κόστους όλων
των συνενώσεων για τη δηµιουργία του δέντρου Τ.
236 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
5.6
Θεωρούµε κάποιο βέλτιστο κώδικα και, έστω ότι οι χαρακτήρες του συνόλου C = {c1,
c2, …, cn} είναι διατεταγµένοι σε αύξουσα σειρά των συχνοτήτων εµφάνισης, f(c1) £
f(c2) £ …£ f(cn). Επίσης, έστω ότι για κάποιο j, 1 £ j < n, είναι f(cj) < f(cj + 1) και l(cj) >
l(cj + 1), όπου l(c) είναι το µήκος του κωδικού που αντιστοιχεί στον χαρακτήρα c Œ C.
Â
n
το άθροισµα f ( c j )l ( c j ) µειώνεται. Το γεγονός αυτό αντίκειται στην υπόθεση
j =1
6.1
Παρατηρούµε ότι κάθε ακµή {v, w} συνεισφέρει ακριβώς 2 στο άθροισµα των βαθ-
µών όλων των κορυφών (µία µονάδα στο βαθµό της v και µία µονάδα στο βαθµό της
w), επειδή συντρέχει σε ακριβώς δύο κορυφές (v και w). Εποµένως, το διπλάσιο του
αριθµού των ακµών είναι ίσο µε το άθροισµα των βαθµών όλων των κορυφών. Για
παράδειγµα, στο γράφηµα του Σχήµατος 6.1.(β), το άθροισµα των βαθµών είναι 12
και ο αριθµών των ακµών είναι 6.
6.2
Έστω ότι το G(V, E) είναι δέντρο, δηλαδή συνεκτικό και άκυκλο. Αφού το G είναι
συνεκτικό, οποιεσδήποτε δύο κορυφές του θα ενώνονται µε τουλάχιστον ένα µονο-
πάτι. Έστω ότι οι κορυφές u και v ενώνονται µε δύο µονοπάτια, το p1 και το p2. Έστω
w η πρώτη κορυφή που τα p1 και p2 διαφοροποιούνται, δηλαδή αν η κορυφή που ακο-
λουθεί τη w στο p1 είναι η x και η κορυφή που ακολουθεί τη w στο p2 είναι y, τότε x
π y. Επίσης, έστω w¢ η πρώτη κορυφή µετά τη w η οποία είναι κοινή στα µονοπάτια
p1 και p2. Τα τµήµατα των p1 και p2 µεταξύ w και w¢ σχηµατίζουν κύκλο, γεγονός
που αντίκειται στην υπόθεση ότι το G είναι άκυκλο.
Αντίστροφα, αν οποιεσδήποτε δύο κορυφές του G ενώνονται µε ένα µονοπάτι τότε
είναι συνεκτικό. Επίσης, η ύπαρξη κύκλου µεταξύ δύο κορυφών προϋποθέτει δύο ή
περισσότερα διαφορετικά µονοπάτια µεταξύ τους. Εποµένως, αν οποιεσδήποτε δύο
κορυφές του G ενώνονται µε ένα µοναδικό µονοπάτι, τότε το G είναι δέντρο.
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 237
6.3
Έστω ότι το G(V, E) είναι κλίκα και υπάρχει ένας τρόπος να εκτελεστεί το ΨΠΒ
ώστε να δώσει δέντρο που δεν είναι ήταν ένα απλό µονοπάτι. Θα έπρεπε το ΨΠΒ να
σταµατούσε την εξερεύνηση σε κάποια κορυφή u, να επιστρέψει στον πρόγονο της
u και από εκεί να συνεχίσει σε µία νέα κορυφή v. Αυτό σηµαίνει ότι η ακµή {u, v}
δεν ανήκει στο Ε, γεγονός που αντιβαίνει στην υπόθεση ότι το G είναι κλίκα.
Για ένα µη κατευθυντικό γράφηµα που το ίδιο είναι ένα απλό µονοπάτι, το δέντρο
του ΨΠΒ είναι, σε κάθε περίπτωση, ένα απλό µονοπάτι. Ένα άλλο παράδειγµα είναι
το γράφηµα µε σύνολο κορυφών V = {a, b, c, d} και σύνολο ακµών E = {{a, b}, {b,
c}, {c, d}, {d, a}}.
6.4
Έστω G(V, E) ένα µη κατευθυντικό γράφηµα και {u, v} µία ακµή του G. Χωρίς
βλάβη της γενικότητας, υποθέτουµε ότι d[u] < d[v]. Εποµένως, η κορυφή v έγινε
γκρίζα και, στη συνέχεια, µαύρη, πριν γίνει µαύρη η u, αφού η v περιέχεται στη λίστα
των γειτόνων της u. Αν η ακµή {u, v} πρώτα εξετάστηκε στην κατεύθυνση από τη u
στη v (δηλαδή (u, v)), τότε θα είναι µία ακµή του δέντρου του ΨΠΒ. Αν η ακµή {u,
v} πρώτα εξετάστηκε στην αντίθετη κατεύθυνση (δηλαδή (v, u)), θα είναι µία πίσω
ακµή, αφού η u είναι ακόµη γκρίζα τη στιγµή που η ακµή {u, v} εξετάστηκε από το
ΨΠΒ για πρώτη φορά.
6.5
Εκτελέστε ΨΠΒ(G), και σταµατήστε όταν βρεθεί η πρώτη πίσω ακµή. Αν δεν υπάρ-
χει πίσω ακµή, τότε το γράφηµα δεν έχει κύκλο, και υπάρχουν το πολύ |V| – 1 ακµές.
Εποµένως, ο χρόνος εκτέλεσης του ΨΠΒ είναι O(|V| + |E|) = O(|V|). Αν υπάρχουν
πίσω ακµές, ο αλγόριθµος σταµατάει όταν βρεθεί η πρώτη πίσω ακµή. Μέχρι αυτή
τη στιγµή, ο αλγόριθµος δεν µπορεί να έχει εξετάσει περισσότερες από |V| ακµές.
Άρα, σε κάθε περίπτωση, ο χρόνος εκτέλεσης του αλγόριθµου είναι O(|V|).
7.1
Στο πρόβληµα του Πολλαπλασιασµού Ακολουθίας Πινάκων δίνονται οι πίνακες Α1,
Α2, …, Αn και ένα όριο Β, και πρέπει να αποφασισθεί αν υπάρχει ένας τρόπος επιµε-
ρισµού (θέσεις παρενθέσεων), ώστε ο υπολογισµός του γινοµένου Α = A1 ¥ A2 L ¥
An, να απαιτεί το πολύ Β πολλαπλασιασµούς µεταξύ στοιχειών των πινάκων.
Στο πρόβληµα της Μεγαλύτερης Κοινής Υπο – Ακολουθίας, δεδοµένων δύο ακο-
238 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
7.2
Έστω Μ = (Q, Σ, q0, δ) η Ντετερµινιστική Μηχανή Turing που µετακινεί την είσο-
δό της µία θέση δεξιά. Είναι Σ = {0, 1} και Γ = {0, 1, u}. Επίσης, θα χρησιµοποιή-
σουµε το σύµβολο > για να δηλώσουµε την αρχή της ταινίας. Οι τελικές καταστά-
σεις είναι F = {ΠΕΡΑΣ}, και όλες οι καταστάσεις είναι Q = {q0, s, s0, s1} » F. Η
συνάρτηση µετάβασης δ φαίνεται στον παρακάτω πίνακα:
Ακολουθεί ένα παράδειγµα λειτουργίας για συµβολοσειρά εισόδου >1101 (το υπο-
γραµµισµένο σύµβολο δηλώνει τη θέση της κεφαλής).
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 239
(q0, >1101) Æ (q0, >1101) Æ (q0, >1101) Æ (q0, >1101) Æ (q0, >1101) Æ
(q0, >1101u) Æ (s, >1101u) Æ (s1, >110u u) Æ (q0, >110u1) Æ (s, >110u1) Æ
(s0, >11u u1) Æ (q0, >11u01) Æ (s, >11u01) Æ (s1, >1u u01) Æ (q0, >1u101) Æ
(s, >1u101) Æ (s1, >u u101) Æ (q0, >u1101) Æ (s, >u1101) Æ (ΠΕΡΑΣ, >u1101).
7.3
Οι συναρτήσεις f1, f2, και f3 είναι φανερά αύξουσες. Για την f1, η αντίστοιχη DTM Μ1
απλά γράφει το 1c στην ταινία εξόδου, αγνοώντας την είσοδο. Αυτό γίνεται σε χώρο
και χρόνο Ο(c) = Ο(1). Για την f2, η αντίστοιχη DTM Μ2 απλά γράφει ένα σύµβολο
1 στην ταινία εξόδου για κάθε σύµβολο του x. Η Μ2 λειτουργεί σε χρόνο O(n) και
χρησιµοποιεί Ο(n) κελιά επιπλέον των κελιών που καταλαµβάνει η είσοδος x. Η DTM
Μ3 για τη συνάρτηση f3 χρησιµοποιεί και µια ταινία εργασίας, εκτός από τις ταινίες
εισόδου και εξόδου. Αρχικά, η Μ3 χρησιµοποιεί την ταινία εργασίας για να γράψει το
µήκος της εισόδου x στο δυαδικό σύστηµα. Όταν διαβάσει όλο το x, για κάθε σύµ-
βολο που έχει γράψει στην ταινία εργασίας, η Μ3 γράφει ένα σύµβολο 1 στην ταινία
εξόδου. Αν |x| = n, το αποτέλεσµα είναι 1È ù , ενώ η Μ3 λειτουργεί σε χρόνο Ο(n +
log n
log n) και χρησιµοποιεί Ο(log n) κελιά των ταινιών εργασίας και εξόδου.
7.4
Έστω R1 η πολυωνυµική αναγωγή από Π1 στο Π2, και R2 η πολυωνυµική αναγωγή
από το Π2 στο Π3. Για κάθε είσοδο x, υπολογίζουµε το R2(R1(x)), το οποίο είναι ένα
θετικό στιγµιότυπο του Π3 (δηλαδή, γίνεται αποδεκτό από µία DTM που αποφασί-
ζει το Π3) αν και µόνο αν το R1(x) είναι ένα θετικό στιγµιότυπο του Π2 αν και µόνο
αν το x είναι ένα θετικό στιγµιότυπο του Π1. Αφού το R1(x) υπολογίζεται σε πολυω-
νυµικό χρόνο, το µήκος του R1(x) είναι πολυωνυµικό ως προς το µήκος του x (καµία
DTM δεν µπορεί να γράψει περισσότερα σύµβολα από τον αριθµό των βηµάτων που
εκτελεί). Συνεπώς, το R2(R1(x)) υπολογίζεται σε πολυωνυµικό χρόνο ως προς το |x|.
∆ηλαδή, η σύνθεση των πολυωνυµικών αναγωγών R1 και R2 είναι µία πολυωνυµική
αναγωγή από το Π1 στο Π3.
7.5
Έστω R η πολυωνυµική αναγωγή από το Π1 στο Π2. Για να αποφασίσουµε αν κάποιο
x είναι θετικό στιγµιότυπο του Π1, υπολογίζουµε το R(x) και, αποδεχόµαστε το x, αν
και µόνο αν R(x) Œ Π2. Το R(x) υπολογίζεται σε πολυωνυµικό χρόνο και έχει µήκος
πολυωνυµικό ως προς το |x|. Εποµένως, µια DTM που αποφασίζει το Π2µπορεί να
αποφασίσει αν το R(x) Œ Π2 σε πολυωνυµικό χρόνο ως προς το |x|.
240 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
7.6
Αφού το Π είναι πλήρες για τη C, κάθε πρόβληµα Π¢ Œ C ανάγεται στο Π Œ C¢.
Αφού η C¢ είναι κλειστή ως προς την αναγωγή, κάθε πρόβληµα Π¢, που ανάγεται
στο Π, πρέπει να ανήκει και στην κλάση 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).
∞ ¶ ∞ ¡ ∆ ∏ ™ ∂ π ™ ¢ ƒ∞ ™ ∆ ∏ ƒ π √ ∆ ∏ ∆ ø ¡ 241
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),
242 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
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. Τα σηµαντικότερα είδη υπολογιστικών πόρων
που προσδιορίζονται είναι ο χρόνος εκτέλεσης και ο αριθµός των θέσεων µνήµης.
244 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
Ασυµπτωτική Εκτίµηση
Ο προσδιορισµός της τάξης µεγέθους των συναρτήσεων, που εκφράζουν την
ποσότητα των πόρων που απαιτεί η εκτέλεση ενός αλγόριθµου.
Ασυµπτωτικός Συµβολισµός
Μαθηµατικός συµβολισµός που χρησιµοποιείται για τον προσδιορισµό και την
περιγραφή της τάξης µεγέθους ακεραίων συναρτήσεων. Τα σηµαντικότερα σύµ-
βολα είναι το Θ για ακριβή προσδιορισµό της τάξης µεγέθους µιας συνάρτησης,
το Ο για άνω φράγµα της τάξης µεγέθους, το Ω για κάτω φράγµα της τάξης µεγέ-
θους, το ο για άνω φράγµα που ξεπερνά την τάξη µεγέθους της συνάρτησης, και
το ω για κάτω φράγµα που υπολείπεται της τάξης µεγέθους της συνάρτησης.
Μ που τερµατίζει για κάθε συµβολοσειρά εισόδου, αποδέχεται όλες τις συµβο-
λοσειρές που ανήκουν στη γλώσσα και απορρίπτει όλες τις συµβολοσειρές που
δεν ανήκουν στη γλώσσα.
Γλώσσα
Κάθε σύνολο συµβολοσειρών που ορίζεται σε συγκεκριµένο αλφάβητο. Χρησι-
µοποιώντας µία κωδικοποίηση, ένα πρόβληµα απόφασης µπορεί να αντιστοιχη-
θεί σε µία γλώσσα.
Γράφηµα
Ένα γράφηµα G(V, E) είναι ένα διατεταγµένο ζεύγος το οποίο αποτελείται από
το σύνολο των κορυφών V και από το σύνολο των ακµών Ε. Οι ακµές µπορεί να
έχουν κατεύθυνση, οπότε το γράφηµα ονοµάζεται κατευθυντικό ή να µην έχουν
κατεύθυνση, οπότε το γράφηµα ονοµάζεται µη κατευθυντικό.
κόµβος του οποίου αναπαριστά µία διαµόρφωση, ενώ οι κόµβοι – απόγονοί του
αναπαριστούν όλες τις εναλλακτικές επόµενες διαµορφώσεις.
∆έντρο
Ένα άκυκλο, συνεκτικό γράφηµα.
∆υναµικός Προγραµµατισµός
Μέθοδος σχεδιασµού αλγόριθµων που επιλύει ένα πρόβληµα συνδυάζοντας τις
λύσεις κατάλληλα επιλεγµένων προβληµάτων. Εφαρµόζεται, συνήθως, σε προ-
βλήµατα βελτιστοποίησης και η µέθοδος επίλυσης βασίζεται σε µία αναδροµική
εξίσωση που περιγράφει την τιµή της βέλτιστης λύσης.
λυση του αρχικού στιγµιότυπου απαιτεί την επίλυση ενός µικρού αριθµού δια-
φορετικών επιµέρους στιγµιότυπων. Ιδιότητα χαρακτηριστική των προβληµάτων
στα οποία εφαρµόζεται ο δυναµικός προγραµµατισµός.
Κλάση Πολυπλοκότητας NP
Το σύνολο των γλωσσών / προβληµάτων που αποφασίζονται από NDTM πολυω-
νυµικού χρόνου.
Κλάση Πολυπλοκότητας P
Το σύνολο των γλωσσών / προβληµάτων που αποφασίζονται από DTM πολυω-
νυµικού χρόνου.
Κύκλος Γραφήµατος
Ένα µονοπάτι στο οποίο η πρώτη και η τελευταία κορυφή ταυτίζονται.
Κωδικοποίηση
Κάθε συστηµατική αναπαράσταση των στιγµιότυπων ενός προβλήµατος σε συµ-
βολοσειρές ενός αλφάβητου.
Μέθοδος Απληστίας
Βλέπε Άπληστος Αλγόριθµος.
Μη Ντετερµινισµός
Υπολογιστικό µοντέλο στο οποίο το επόµενο βήµα του υπολογισµού δεν ορίζε-
ται µονοσήµαντα από τον αλγόριθµο και τη συµβολοσειρά εισόδου. Με βάση την
τρέχουσα διαµόρφωση, το επόµενο βήµα του υπολογισµού επιλέγεται από ένα
σύνολο εναλλακτικών βηµάτων. Η µη ντετερµινιστική µηχανή επιλέγει πάντα το
«καλύτερο» βήµα. Έτσι, αρκεί µία τις εναλλακτικές ακολουθίες υπολογισµού να
οδηγεί σε αποδοχή για να θεωρηθεί η είσοδος αποδεκτή, ενώ πρέπει όλες οι εναλ-
λακτικές ακολουθίες υπολογισµού να οδηγούν σε απόρριψη για να θεωρηθεί η
είσοδος απορριπτέα. ∆εν αποτελεί ένα ρεαλιστικό υπολογιστικό µοντέλο, αλλά
έχει πληθώρα εφαρµογών σε όλο το φάσµα της Επιστήµης των Υπολογιστών.
Μονοπάτι Γραφήµατος
Μία ακολουθία κορυφών <v0, v1, …, vk–1, vk> που συνδέονται µε ακµές (v0, v1),
(v1, v2), …, (vk–1, vk). Το µήκος του µονοπατιού είναι k, δηλαδή όσος ο αριθµός
των ακµών που παρεµβάλλονται. Το µονοπάτι είναι απλό αν καµία κορυφή δεν
εµφανίζεται δύο ή περισσότερες φορές.
Ντετερµινιστικός Αλγόριθµος
Κάθε αλγόριθµος που δεν χρησιµοποιεί τυχαιότητα τις επιλογές του ονοµάζεται
ντετερµινιστικός αλγόριθµος.
Πιθανοτικός Αλγόριθµος
Κάθε αλγόριθµος που χρησιµοποιεί τυχαιότητα σε κάποιες από τις επιλογές του
ονοµάζεται πιθανοτικός αλγόριθµος.
Πολυωνυµική Αναγωγή
Ένας µετασχηµατισµός R ενός προβλήµατος Π1 σε ένα πρόβληµα Π2 που µπορεί
να υπολογιστεί σε πολυωνυµικό χρόνο. Έχει την ιδιότητα το x Œ Π1 αν και µόνο
αν το R(x) Œ Π2.
Πρόβληµα
Βλέπε Υπολογιστικό Πρόβληµα.
Πρόβληµα NP – Πλήρες
Κάθε πρόβληµα που είναι πλήρες για την κλάση NP. Η εκδοχές απόφασης πολύ
σηµαντικών προβληµάτων συνδυαστικής βελτιστοποίησης έχουν αποδειχθεί πλή-
ρεις για το NP. Είναι κοινή επιστηµονική πεποίθηση ότι για τα NP – πλήρη προ-
βλήµατα δεν υπάρχουν αλγόριθµοι πολυωνυµικού χρόνου. Αν για κάποιο NP –
250 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
Πρόβληµα Απόφασης
Ένα πρόβληµα απόφασης είναι ένα υπολογιστικό πρόβληµα µε µόνο δύο λύσεις,
ΝΑΙ και ΟΧΙ. Τα προβλήµατα απόφασης µελετώνται, κυρίως, στη Θεωρία Υπολο-
γιστικής Πολυπλοκότητας.
Πρόβληµα Βελτιστοποίησης
Ένα πρόβληµα βελτιστοποίησης έχει πολλές αποδεκτές λύσεις για κάθε στιγµιό-
τυπο εισόδου, σε καθεµία από τις οποίες αντιστοιχεί µία τιµή. Το ζητούµενο είναι
ο υπολογισµός της λύσης µε τη βέλτιστη τιµή. Παραδείγµατα προβληµάτων βελ-
τιστοποίησης είναι τα προβλήµατα του Πολλαπλασιασµού Ακολουθίας Πινάκων,
της Μεγαλύτερη Κοινής Υποακολουθίας και της Επιλογής Ανταγωνιστικών ∆ρα-
στηριοτήτων.
Πρόβληµα ∆υσεπίλυτο
Κάθε πρόβληµα για το οποίο είτε υπάρχει απόδειξη είτε ισχυρές ενδείξεις ότι δεν
ανήκει στην κατηγορία των ευεπίλυτων προβληµάτων.
Πρόβληµα Ελαχιστοποίησης
Ένα πρόβληµα βελτιστοποίησης όπου ζητείται να υπολογιστεί η λύση µε την ελά-
χιστη τιµή.
Πρόβληµα Ευεπίλυτο
Κάθε πρόβληµα για το οποίο υπάρχει αλγόριθµος που λύνει το πρόβληµα χρησι-
µοποιώντας εύλογη ποσότητα υπολογιστικών πόρων. Η θέση των Cook – Karp
ταυτίζει τα ευεπίλυτα προβλήµατα µε αυτά που λύνονται από αλγόριθµους
πολυωνυµικού χρόνου.
Πρόβληµα Μεγιστοποίησης
Ένα πρόβληµα βελτιστοποίησης όπου ζητείται να υπολογιστεί η λύση µε τη µέγι-
στη τιµή.
Συµβολοσειρά
Κάθε ακολουθία συµβόλων ενός αλφαβήτου είναι µία συµβολοσειρά ορισµένη
στο συγκεκριµένο αλγάβητο.
Συνεκτικό Γράφηµα
Ένα γράφηµα µεταξύ κάθε δύο κορυφών του οποίου υπάρχει µονοπάτι από τη
µία στην άλλη. Ένα κατευθυντικό γράφηµα ονοµάζεται ισχυρά συνεκτικό όταν
για κάθε ζευγάρι κορυφών v, u, υπάρχει µονοπάτι τόσο από τη v στη u όσο και
από τη u στη v.
Υπογράφηµα Γραφήµατος
Ένα γράφηµα G¢(V¢, E¢) ονοµάζεται υπογράφηµα ενός γραφήµατος G(V, E) αν
V¢ Õ V και E¢ Õ E. Το G¢ ονοµάζεται υπογράφηµα του G που ορίζεται από το V¢
αν περιέχει όλες τις ακµές του G που συνδέουν κορυφές του V¢.
Υπολογιστική Πολυπλοκότητα
Κλάδος της Επιστήµης των Υπολογιστών που εξετάζει τους λόγους για τους οποί-
ους µερικά προβλήµατα είναι δύσκολο ή αδύνατο να λυθούν από έναν υπολογι-
στή. Εξετάζει την επίδραση διάφορων υπολογιστικών µοντέλων στην ποσότητα
των πόρων που χρειάζεται ένα πρόβληµα για να λυθεί, και οµαδοποιεί τα προ-
βλήµατα σε κλάσεις ανάλογα µε τους πόρους που χρειάζονται για να λυθούν σε
κάποιο υπολογιστικό µοντέλο.
Υπολογιστικό Πρόβληµα
Ένα υπολογιστικό πρόβληµα ορίζεται από ένα σύνολο δεδοµένων εισόδου, ένα
σύνολο δεδοµένων εξόδου και µία επιθυµητή σχέση µεταξύ τους. Η σχέση µετα-
252 A § ° √ ƒ π £ ª √ π ∫ ∞ π ¶ √ § À ¶ § √ ∫ √ ∆ ∏ ∆∞
Ψευδοκώδικας
Ένα απλό σύνολο κανόνων και εντολών που µοιάζει ως προς τη µορφή και την
έκφραση µε τις γλώσσες προγραµµατισµού και χρησιµοποιείται για την αναπα-
ράσταση αλγορίθµων. Ένας αλγόριθµος διατυπωµένος σε ψευδοκώδικα, συνή-
θως, µπορεί εύκολα να µετατραπεί σε ένα έγκυρο πρόγραµµα σε κάποια γλώσσα
προγραµµατισµού.