45
K r i t i k i P u b l i s h i n g - d r a f t Υπάρχουν πολλά βιβλία για αλγόριθμους που παρέχουν καλογυαλισμένο κώδικα και αποδείξεις ορθότητας. Αντίθετα, το παρόν βιβλίο παρουσιάζει βαθιά γνώση, ση- μειώσεις και αναλογίες που θα βοηθήσουν τους αρχάριους να περιγράφουν και να κατανοούν τους αλγόριθμους σαν ειδικοί. Θα μπορούσατε να πείτε ότι αυτό το βιβλίο μοιάζει με έναν ξυλουργό που εξετάζει σφυριά και όχι σπίτια. Ο Jeff Edmonds προ- σφέρει τη μεγάλη εικόνα, αλλά και εύκολες και αναλυτικές μεθόδους για την ανά- πτυξη αλγόριθμων, αποφεύγοντας ταυτόχρονα να πέσει στις γνωστές παγίδες. Πρό- τυπα όπως οι αναλλοίωτες συνθήκες και η αναδρομή συμβάλουν στην ενοποίηση μιας μεγάλης δεξαμενής αλγόριθμων σε μερικούς μετα-αλγόριθμους. Το βιβλίο θα προσπαθήσει να διδάξει τους φοιτητές να σκέφτονται αφηρημένα. Χωρίς να βυθί- ζεται στο βάτο των επίσημων αποδείξεων, το βιβλίο επιχειρεί να εξηγήσει σε βάθος τις έννοιες, ώστε ο τρόπος και η λειτουργία κάθε αλγόριθμου να είναι διάφανα. Αυ- τές οι βαθιές εξηγήσεις παρουσιάζονται με αργό και σαφή τρόπο τον οποίο μπορούν να προσεγγίσουν οι δευτεροετείς ή τριτοετείς φοιτητές της επιστήμης των υπολογι- στών, ώστε να είναι όσο το δυνατόν πιο έτοιμοι να ανακαλύψουν τους δικούς τους καινοτόμους τρόπους να λύνουν προβλήματα. Η απαγωγή είναι κάτι που συμβαίνει όταν μεταφράζετε τις εξισώσεις, τους κανόνες και την υποκείμενη ουσία του προβλήματος όχι μόνο σε μια γλώσσα που μπορεί να κατανοήσει ένας άσχετος με το θέμα φίλος σας, αλλά και σε μια μορφή που μπορεί να διεισδύσει στο υποσυνείδητό σας. Επειδή το υποσυνείδητό σας είναι αυτό που μπο- ρεί να πραγματοποιήσει τα θαυμαστά άλματα της έμπνευσης, όχι το εξαντλημένο σώμα σας, ούτε η αλαζονική λογική σας. Και μην ξεχνάτε ότι αντίθετα από εσάς, το υποσυνείδητό σας δεν καταλαβαίνει τον κώδικα της Java. i

K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t

Υπάρχουν πολλά βιβλία για αλγόριθμους που παρέχουν καλογυαλισμένο κώδικα καιαποδείξεις ορθότητας. Αντίθετα, το παρόν βιβλίο παρουσιάζει βαθιά γνώση, ση-μειώσεις και αναλογίες που θα βοηθήσουν τους αρχάριους να περιγράφουν και νακατανοούντουςαλγόριθμουςσανειδικοί. Θαμπορούσατεναπείτεότιαυτότοβιβλίομοιάζει με έναν ξυλουργό που εξετάζει σφυριά και όχι σπίτια. Ο Jeff Edmonds προ-σφέρει τη μεγάλη εικόνα, αλλά και εύκολες και αναλυτικές μεθόδους για την ανά-πτυξηαλγόριθμων, αποφεύγοντας ταυτόχρονα ναπέσει στις γνωστές παγίδες. Πρό-τυπα όπως οι αναλλοίωτες συνθήκες και η αναδρομή συμβάλουν στην ενοποίησημιας μεγάλης δεξαμενής αλγόριθμων σε μερικούς μετα-αλγόριθμους. Το βιβλίο θαπροσπαθήσει να διδάξει τους φοιτητές να σκέφτονται αφηρημένα. Χωρίς να βυθί-ζεται στο βάτο των επίσημων αποδείξεων, το βιβλίο επιχειρεί να εξηγήσει σε βάθοςτις έννοιες, ώστε ο τρόπος και η λειτουργία κάθε αλγόριθμου να είναι διάφανα. Αυ-τές οι βαθιές εξηγήσεις παρουσιάζονται με αργό και σαφή τρόπο τον οποίο μπορούννα προσεγγίσουν οι δευτεροετείς ή τριτοετείς φοιτητές της επιστήμης των υπολογι-στών, ώστε να είναι όσο το δυνατόν πιο έτοιμοι να ανακαλύψουν τους δικούς τουςκαινοτόμους τρόπους να λύνουν προβλήματα.Ηαπαγωγή είναι κάτι πουσυμβαίνει ότανμεταφράζετε τις εξισώσεις, τουςκανόνες

και την υποκείμενη ουσία του προβλήματος όχι μόνο σε μια γλώσσα που μπορεί νακατανοήσει έναςάσχετοςμετοθέμαφίλοςσας, αλλάκαισεμιαμορφήπουμπορεί ναδιεισδύσει στο υποσυνείδητό σας. Επειδή το υποσυνείδητό σας είναι αυτό που μπο-ρεί να πραγματοποιήσει τα θαυμαστά άλματα της έμπνευσης, όχι το εξαντλημένοσώμα σας, ούτε η αλαζονική λογική σας. Και μην ξεχνάτε ότι αντίθετα από εσάς, τουποσυνείδητό σας δεν καταλαβαίνει τον κώδικα της Java.

i

Page 2: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t

Page 3: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t

Αφιερώνεται στον πατέρα μου, Τζακ, και τους γιους μου, Τζόσουα και Μίκα.Είθε η αγάπη και τα μαθηματικά να συνεχίσουν την πορεία τους στις γενιές.

Επίλυση προβλήματοςΒήματα εκτός πλαισίουΒαθιά σκέψηΔημιουργική απαγωγήΛογική συναγωγήΕργασία με φίλουςΔιασκέδασηΕξερεύνηση και ψηλάφησηΓενναία επιμονήΧαρμόσυνη επιτυχία

iii

Page 4: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t

Page 5: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

tΠΡΟΛΟΓΟΣ

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

μους που μερικές φορές φαίνεται αβάσταχτο. Προκειμένου να μετριάσουν τη δυ-σκολία των φοιτητών, τα περισσότερα βιβλία καλύπτουν τους βασικούς όρους τωνεπαναληπτικών αλγόριθμων, της αναδρομής, των άπληστων αλγόριθμων και τουδυναμικού προγραμματισμού. Γενικά όμως, όσον αφορά την παρουσίαση των ίδιωντωναλγόριθμωνκαι τωναποδείξεων τηςορθότητάς τους, οι έννοιες κρύβονται μέσασε βελτιστοποιημένο κώδικα και καλογυαλισμένες αποδείξεις. Ένας στόχος αυ-τού του βιβλίου είναι να παρουσιάσει έναν σταθερό και ξεκάθαρο τρόπο αντίληψηςτων αλγόριθμων και αυτό θα γίνει με την εστίαση στη δομή και την απόδειξη ορ-θότητας των επαναληπτικών και αναδρομικών μετα-αλγόριθμων και μέσα σ’ αυτούς,στους άπληστους μετα-αλγόριθμους και τους μετα-αλγόριθμους δυναμικού προγραμ-ματισμού. Όταν κάποιος μάθει αυτούς τους μετα-αλγόριθμους και τις αποδείξεις ορ-θότητάς τους, θα μπορεί να κατανοήσει εύκολα τους περισσότερους αλγόριθμους.Τοδύσκολοσημείο είναι ότι οι σπουδή τωνμετα-αλγόριθμωναπαιτεί έντονηαπαγω-γική σκέψη.Απαγωγικός συλλογισμός: Οι φοιτητές είναι πολύ ικανοί να μάθουν πώς να

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

σκέψης και μια διαίσθησηηοποία δενμπορεί να διδαχθεί. Το συμπέρασμα είναι λοι-πόν ότι δεν μπορούν να διδαχθούν αλλάπρέπει ο καθένας να τους κατανοήσει μόνος

v

Page 6: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

tvi

του. Αυτό το βιβλίο επιχειρεί να διδάξει στους φοιτητές να σκέφτονται σαν σχεδια-στές αλγόριθμων.Δεν πρόκειται για βιβλίο αναφοράς: Σκοπός μου δεν είναι να διδάξω μια συγκεκρι-

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

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

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

ρουσιάσω τημεγάλη εικόνα και κατόπιν να την αναλύσωσε βήματα πουμπορούν ναγίνουν εύκολα κατανοητά.Επίπεδο παρουσίασης: Αυτό το κομμάτι είναι δύσκολο και δεν υπάρχει τρό-

πος να το παρακάμψουμε. Έχω προσπαθήσει να καταλάβω πού γεννάται σύγχυσηκαι να καλύψω αυτά τα σημεία πιο αναλυτικά. Προσπαθώ να πετύχω μια ισορροπίαανάμεσαστην λακωνικήσαφήνεια πουσυνοδεύει τημαθηματική τυπολατρία και τιςπροσωποποιημένες αναλογίες και μεταφορές που παράγει η διαίσθηση και το χιού-μορ.Παρουσίαση με διακριτά σημεία: Το κείμενο δομείται σε κομμάτια με καθένα

να έχει έναν τίτλο και να περιέχει μόνο ένα συλλογισμό. Ευελπιστώ ότι με τον τρόποαυτό, το βιβλίο θα μπορεί να διδαχθεί πιο εύκολα, τόσο από την πλευρά του καθη-γητή, όσο και από την πλευρά του φοιτητή.Προαπαιτούμενα: Ηύλητουβιβλίουπροϋποθέτειότι οιφοιτητέςέχουνολοκλη-

ρώσει ένα μάθημα προγραμματισμού εισαγωγικού επιπέδου και κατέχουν κάποιεςγενικές μαθηματικές γνώσεις. Το Παράρτημα (Μέρος Τέταρτο) καλύπτει πολλά απότα μαθηματικά που είναι απαραίτητα.Ερωτήσεις-Εργασίες: Έχουμε επίσης συμπεριλάβει κάποιες ερωτήσεις και ερ-

γασίες. Ελπίζω ότι θα αναπτύξω πολλές περισσότερες, μαζί με τις λύσεις τους.Οποιαδήποτε συνεισφορά είναι καλοδεχούμενη.Προκαταβολική μελέτη: Οφοιτητής θα πρέπει να διαβάζει την ύλη πριν το μά-

θημα, καθώς αυτό είναι κάτι που θα προάγει την παραγωγική συζήτηση κατά τηδιάρκεια του μαθήματος.

Page 7: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

tvii

Επεξήγηση: Για να αποδείξετε όσα γνωρίζετε σε ένα διαγώνισμα ή στη δουλειάσας, πρέπει να είστε σε θέση να εξηγείτε καλά αυτό που πραγματεύεστε. Επιπλέον,ο καλύτερος τρόπος για να το μάθετε καλά είναι να το εξηγήσετε σε κάποιον άλλο.Επομένως, σας προτείνω να αφιερώσετε πολύ χρόνο στην επεξήγηση της ύλης ξανάκαι ξανά στον εαυτό σας, στους συμφοιτητές σας και στον αγαπημένο σας λούτρινοαρκούδο.Ονειροπόληση: Θα ήθελα να τονίσω τη σημασία της σκέψης, ή ακόμα και της

ονειροπόλησης, της ύλης του βιβλίου. Αυτό είναι κάτι που μπορείτε να κάνετε μέσαστην καθημερινότητά σας, όταν κολυμπάτε, λούζεστε, μαγειρεύετε ή αράζετε. Κά-ντε ερωτήσεις. Γιατί αυτό γίνεται μ’ αυτόν τον τρόπο και όχι με κάποιον άλλο; Επινο-ήστε άλλους αλγόριθμους για να λύσετε ένα πρόβλημα και αναζητήστε στιγμιότυπαεισόδου για τα οποία ο αλγόριθμός σας δίνει λάθος απαντήσεις. Τα μαθηματικά δενείναι γραμμικός λογισμός. Εάν επιτρέψετε στην ουσία της ύλης, στο τι πραγματικάρωτούν οι ερωτήσεις, να βουτήξει στο υποσυνείδητό σας, τότε συν το χρόνο, μικρέςσκέψεις θα αρχίσουν να διυλίζονται. Ακολουθήστε αυτές τις ιδέες. Μερικές φορές,θα δείτε μπροστά σας αναλαμπές έμπνευσης.

Page 8: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t

Page 9: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

tΕυχαριστίες

Θα ήθελα να ευχαριστήσω τους Andy Mirzaian, Franck van Breugel, James Elder,SuprakashDatta, Eric Ruppert, Russell Impagliazzo, Toniann Pitassi και Kirk Pruhs,με τους οποίους συνεργάζομαι στη διδασκαλία και την έρευνα των αλγόριθμων γιαπολλά χρόνια. Θα ήθελα να ευχαριστήσω τις Jennifer Wolfe και Lauren Cowles γιατη φανταστική τους δουλειά στην επιμέλεια. Ευχαριστώ όλους αυτούς τους ανθρώ-πους που παρείχαν την υποστήριξή τους σ’ αυτό το έργο.

ix

Page 10: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t

Page 11: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

tΕισαγωγή

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

ματος χρησιμοποιεί προσυνθήκες και μετασυνθήκες για να περιγράψει για κάθε έγκυροστιγμιότυπο εισόδου που μπορεί να λάβει ο υπολογισμός, η πράξη, ποια είναι η απαι-τούμενη έξοδος ή οι απαιτούμενες ενέργειες. Αυτό μπορεί να είναι μια λειτουργίαη οποία αντιστοιχίζει κάθε στιγμιότυπο εισόδου στην απαιτούμενη έξοδο, ένα πρό-βλημα βελτιστοποίησης που απαιτεί την έξοδο μιας λύσης που θα είναι «βέλτιστη»μεταξύ άπειρωνπιθανών λύσεων για το δεδομένο στιγμιότυπο εισόδου, ή ακόμα καιένα διαρκές σύστημα ή δομή δεδομένων που ανταποκρίνεται κατάλληλα σε μια συ-νεχή ροή εισόδου.Παράδειγμα: Το πρόβλημα ταξινόμησης ορίζεται ως εξής:

• Προσυνθήκες: Η είσοδος είναι μια λίστα με n τιμές, συμπεριλαμβανομένων πι-θανών επαναλήψεων.

• Μετασυνθήκες: Ηέξοδος είναι μια λίστα που αποτελείται από τις ίδιεςn τιμές σεμη φθίνουσα σειρά.

Ένας αλγόριθμος: Ένας αλγόριθμος είναι μια διαδικασία που εξελίσσεται βήμαπρος βήμα, η οποία ξεκινά με ένα στιγμιότυπο εισόδου και παράγει μια κατάλληληέξοδο. Περιγράφεται στο επίπεδολεπτομέρειας και θεωρίαςπου ταιριάζει καλύτεραστο κοινόπουπρέπει να τον καταλάβει. Αντίθετα, ο κώδικας είναι μια υλοποίηση ενόςαλγόριθμου που μπορεί να εκτελέσει ένας υπολογιστής. Ο ψευδοκώδικας βρίσκεταικάπου ανάμεσα στα δύο.Ένας αφηρημένος τύπος δεδομένων: Οι υπολογιστές χρησιμοποιούν μηδε-

νικά και άσσους, AND και OR, IF και GOTO. Αυτό δεν σημαίνει ότι το ίδιο πρέπει νακάνουμεκι εμείς. Ηπεριγραφήενόςαλγόριθμουμπορεί νααναφέρει αφηρημένα αντι-κείμενα, όπωςακέραιους, πραγματικούς, συμβολοσειρές, σύνολα, στοίβες, γράφουςκαι δέντρα, αφηρημένες πράξεις, όπως «ταξινόμησε τη λίστα», «αφαίρεσε ένα στοι-χείο από τη στοίβα» ή «ακολούθησε μια διαδρομή», και αφηρημένες σχέσεις, όπωςτο μεγαλύτερο από, ένα πρόθεμα, ένα υποσύνολο, μια σύνδεση και ένα παιδί. Για

1

Page 12: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t2

να είναι χρήσιμος ένας αλγόριθμους, πρέπει να κατανοούμε πλήρως τηφύση αυτώντων αντικειμένων και το αποτέλεσμα αυτών των πράξεων. Ωστόσο, προκειμένου νααποκρύπτονται οι λεπτομέρειεςπουείναι ανιαρέςήάσχετες, οι ακριβείςυλοποιήσειςαυτών των δομών δεδομένων και των αλγόριθμων δεν είναι αναγκαίο να διατυπώ-νονται. Για περισσότερες πληροφορίες, ανατρέξτε στο Κεφάλαιο 3.Ορθότητα: Ένας αλγόριθμος για το πρόβλημα είναι σωστός αν για κάθε έγκυρο

στιγμιότυπο εισόδου, παράγεται η απαιτούμενη έξοδος. Αν και απαιτείται κάποιοεπίπεδο λογικού συλλογισμού, ο στόχος αυτού του βιβλίου είναι να διδάξει πώς θασκέφτεστε για τους αλγόριθμους, για την ανάπτυξη και για την περιγραφή τους μετέτοιο τρόπο που η ορθότητά τους να είναι διάφανη. Στο Κεφάλαιο 28 θα μάθετεπερισσότερα για τα τυπικά βήματαπουαπαιτούνται για την απόδειξη της ορθότηταςκαι στο Κεφάλαιο 22 θα παρακολουθήσετε μια συζήτηση για τις προτάσεις για κάθεκαι υπάρχει που είναι απαραίτητες για την πραγματοποίηση επίσημων προτάσεων.Χρόνος εκτέλεσης: Δεναρκεί αν ένας υπολογισμός τελικάδώσει τησωστήαπά-

ντηση. Πρέπει επίσης να το κάνει σε εύλογο χρονικό διάστημα και απασχολώνταςεύλογο χώρο μνήμης. Ο χρόνος εκτέλεσης ενός αλγόριθμου είναι μια συνάρτηση πουπροκύπτει από το μέγεθος n του στιγμιότυπου εισόδου που δίνεται ως ένα όριο στοπλήθος των πράξεων που πρέπει να κάνει ο υπολογισμός (βλ. Κεφάλαιο 23). Ο αλ-γόριθμος λέμε ότι είναι εφικτός αν αυτή η συνάρτηση είναι ένα πολυώνυμο σαν τοTime(n) = Θ(n2) και λέμε ότι είναι ανέφικτος αν αυτή η συνάρτηση είναι εκθετικήσαν τον Time(n) = Θ(2n). (Για περισσότερες πληροφορίες για τις ασυμπτωματι-κές λύσεις συναρτήσεων, ανατρέξτε στα Κεφάλαιο 24 και 25.) Προκειμένου να μπο-ρεί κάποιος να υπολογίσει το χρόνο εκτέλεσης, πρέπει να μπορεί να προσθέσει τουςχρόνους που απαιτούνται για κάθε επανάληψη ενός βρόχου και να λύσει τη σχέσηεπανάληψης που ορίζει το χρόνο ενός αναδρομικού προγράμματος. (Για περισσό-τερες πληροφορίες για το

∑ni=1 i = Θ(n2) ανατρέξτε στο Κεφάλαιο 26 και για το

T (n) = 2T (n2 ) + n = Θ(n log n), ανατρέξτε στο Κεφάλαιο 27.)Μετα-αλγόριθμοι: Οι περισσότεροι αλγόριθμοι περιγράφονται καλύτερα ως

επαναληπτικοί ή αναδρομικοί. Ένας επαναληπτικός αλγόριθμος (Μέρος Πρώτο) εκτε-λεί ένα βήμα κάθε φορά, εξασφαλίζοντας ότι κάθε βήμα προχωρά, διατηρώνταςόμως την αναλλοίωτη συνθήκη. Ένας αναδρομικός αλγόριθμος (Μέρος Δεύτερο) χω-ρίζει τοστιγμιότυπό τουσεμικρότεραστιγμιότυπα, την επίλυση τωνοποίων τηνανα-θέτει σε ένα φίλο και κατόπιν συνδυάζει τις λύσεις τους σε μία δική του.Τα προβλήματα βελτιστοποίησης (Μέρος Τρίτο) αποτελούν μια σημαντική κατηγο-

ρία υπολογιστικών προβλημάτων. Οι κύριοι αλγόριθμοι γι’ αυτά είναι οι εξής: Οιάπληστοι αλγόριθμοι (Κεφάλαιο 16) επιλέγουν το επόμενο αντικείμενο πουφαίνεται ναείναι το καλύτερο. Οι αλγόριθμοι αναδρομικής οπισθοδρόμησης (Κεφάλαιο 17) δοκιμά-ζουν πράγματα και αν δεν λειτουργούν, επιστρέφουν και δοκιμάζουν κάτι άλλο. Οδυναμικός προγραμματισμός (Κεφάλαιο 18) επιλύει μια σειρά από όλο και μεγαλύτεραστιγμιότυπα, χρησιμοποιώντας ξανά τις λύσεις που αποθηκεύτηκαν πρωτύτερα γιατα μικρότερα στιγμιότυπα, μέχρι να βρεθεί μια λύση για το δεδομένο στιγμιότυπο.Οι αναγωγές (Κεφάλαιο 20) χρησιμοποιούν έναν αλγόριθμο για ένα πρόβλημα ώστε

Page 13: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t3

να λύσουν κάποιο άλλο. Οι πιθανοκρατικοί αλγόριθμοι (Κεφάλαιο 21) στρίβουν κέρ-ματα για να αποφασίσουν ποιες ενέργειες πρέπει να εκτελέσουν. Τέλος, τα κατώτεραόρια (Κεφάλαιο 7) αποδεικνύουν ότι δεν υπάρχουν ταχύτεροι αλγόριθμοι.

Page 14: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t

Page 15: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t

Μέρος I

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

5

Page 16: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t

Page 17: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

tΚΕΦΑΛΑΙΟ 1

Επαναληπτικοί αλγόριθμοι:Μέτρα προόδου καιαναλλοίωτες συνθήκες

Ηχρήση ενός επαναληπτικού αλγόριθμου για την επίλυση ενός υπολογιστικού προβλή-ματος είναι κάπως σαν να οδηγεί κάποιος σε ένα δρόμο, πιθανώς μακρύ και δύ-σκολο, από τηναφετηρίαως τονπροορισμό. Μεκάθε επανάληψη, έχετεμιαμέθοδοη οποία σας φέρει ένα βήμα πιο κοντά στον προορισμό. Για να βεβαιωθείτε ότι προ-χωράτε προς τα εμπρός, πρέπει να έχετε ένα μέτρο προόδου που σας λέει πόσο απέ-χετε από τον προορισμό ή πόση απόσταση έχετε διανύσει από την αφετηρία. Δεν εί-ναιδυνατόνναγνωρίζετεακριβώςπρος ταπούθακινηθεί οαλγόριθμος, γι’ αυτόπρέ-πει να προετοιμαστείτε για παρακάμψεις και λοξοδρομήσεις. Από την άλλη πλευρά,δεν είστε αναγκασμένοι να γνωρίζετε πώς να χειριστείτε κάθε χαντάκι και κάθε διέ-ξοδο στον κόσμο. Ένας συμβιβασμός ανάμεσα σ’ αυτά τα δύο είναι η ύπαρξη μιαςαναλλοίωτης συνθήκης, η οποία ορίζει ένα δρόμο (ή μια περιοχή) που δεν πρέπει ναεγκαταλείψετε. Όταν ταξιδεύετε, αςανησυχείτε για έναμόνοβήμακάθεφορά. Πρέ-πει να γνωρίζετε πώς να μπείτε στη σωστή πορεία από οποιαδήποτε αφετηρία. Απόκάθε σημείο στο δρόμο, πρέπει να γνωρίζετε ποιες ενέργειες θα εκτελέσετε προκει-μένου να προχωρήσετε προς τα εμπρός χωρίς να εγκαταλείψετε το δρόμο. Τέλος,όταν θα έχετε κάνει αρκετή πρόοδο στο δρόμο, πρέπει να γνωρίζετε πώς να βγείτεαπ’ αυτόν και να φτάσετε στον προορισμό σας σε εύλογο χρονικό διάστημα.

1.1 Αλλαγή προτύπου: Μια σειρά από ενέρ-γειες και μια σειρά από ισχυρισμοί

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

χουν οι προγραμματιστές είναι να μην θεωρούν τους αλγόριθμους σαν σειρές από

7

Page 18: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t8ΚΕΦΑΛΑΙΟ 1. ΕΠΑΝΑΛΗΠΤΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ: ΜΕΤΡΑ ΠΡΟΟΔΟΥ ΚΑΙ

ΑΝΑΛΛΟΙΩΤΕΣ ΣΥΝΘΗΚΕΣ

ενέργειες, αλλά σαν σειρές από στιγμιότυπα της κατάστασης του υπολογιστή. Οιπρογραμματιστές έχουν την τάσηναπροτιμούν τησειράαπόενέργειες, επειδήοκώ-δικας είναι μια σειρά από οδηγίες για ενέργειες και ένας υπολογισμός είναι μια σειράαπό ενέργειες. Αν και αυτή η προτίμηση είναι σημαντική, υπάρχει μια διαφορετική.Φανταστείτε ότι σταματάτε το χρόνοσε καίρια σημεία κατά τηδιάρκεια τουυπολογι-σμού και φωτογραφίζετε την κατάσταση του υπολογιστή. Εάν το κάνετε, τότε μπο-ρείτε να σκεφτείτε έναν υπολογισμό σαν μια σειρά από τέτοια στιγμιότυπα. Ότανέχετε στη διάθεσή σας δύο τρόπους να δείτε το ίδιο πράγμα, τότε αποκτάτε πρό-σβαση σε περισσότερα εργαλεία για να το χειριστείτε και είστε σε θέση να το κατανο-ήσετε καλύτερα. Δείτε ένα παράδειγμα του πώς ένας υπολογισμός μπορεί να αντι-μετωπιστεί με δύο τρόπους: ως ισχυρισμοί για την τρέχουσα κατάσταση του υπολο-γισμού και ως ενέργειες που προωθούν τον υπολογισμό στην επόμενη κατάσταση.

Max(a, b, c)Προσυνθήκη: Η είσοδος έχει 3 αριθμούς.m = aισχυρισμός: Το m είναι max στο {a}.if(b > m)m = b

τέλος ifισχυρισμός: Το m είναι max στο {a,b}.if(c > m)m = c

τέλος ifισχυρισμός: Το m είναι max στο {a,b,c}.return (m)Μετασυνθήκη: Επέστρεψε το max στο {a,b,c}.

Τέλος αλγόριθμουΗπρόκληση της θεώρησηςως σειρά ενεργειών: Έστωότι κάποιος σχεδιάζει

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

τυπο είναι χρήσιμο για κάποιον που ψάχνει τρόπους για να επινοήσει, να εξηγήσει ήνα αναπτύξει έναν αλγόριθμο.

Page 19: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t1.1. ΑΛΛΑΓΗΠΡΟΤΥΠΟΥ:ΜΙΑ ΣΕΙΡΑ ΑΠΟ ΕΝΕΡΓΕΙΕΣ ΚΑΙΜΙΑ ΣΕΙΡΑ ΑΠΟΙΣΧΥΡΙΣΜΟΙ 9

Προ- και Μετασυνθήκες: Για να είναι σε θέσει κάποιος να σκεφτεί έναν αλγό-ριθμοπουθαλύνει έναυπολογιστικόπρόβλημα, πρέπει πρώτα ναορίσει προσεκτικάτο πρόβλημα. Αυτό γίνεται με προ- και με μετασυνθήκες, οι οποίες παρέχουν τηναρχική εικόνα, τον ισχυρισμό, σχετικά με το στιγμιότυπο εισόδου, αλλά και μια αντί-στοιχη εικόνα ή ισχυρισμό για την απαιτούμενη έξοδο.Ξεκινήστε από τη μέση: Αντί να ξεκινήσετε με την πρώτη γραμμήκώδικα, ένας

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

δεδομένων που είναι σημαντικές για την κατανόηση του αλγόριθμου. Εάν αυτός οισχυρισμός είναι επαρκώς γενικός, δεν θα αποτυπώσει μόνο αυτό το συγκεκριμένοσημείοκατάτηδιάρκεια τουυπολογισμού, αλλάπολλάπαρόμοιασημεία. Τότε, ίσωςνα μπορεί να γίνει κομμάτι ενός βρόχου.Ακολουθία στιγμιότυπων: Όταν δημιουργήσουμε μια σειρά από ισχυρισμούς

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

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

εντελώς ανεξάρτητα από τα άλλα. Είναι πολύ πιο εύκολο να βλέπουμε κάθε ενέρ-γεια ξεχωριστά παρά να ανησυχούμε για όλο τον υπολογισμό. Θα πρέπει μάλιστα ναγνωρίζετε ότι μπορείτε να ολοκληρώσετε αυτά τα κομμάτια με όποια σειρά επιθυ-μείτε και να τροποποιείτε κάθε κομμάτι χωρίς να ανησυχείτε για τον αντίκτυπο πουθα έχουν στα άλλα.Εξωγήινοι: Έτσι ακριβώςθαπρέπει να συμπληρώσετε τον κώδικαανάμεσαστον

i και τον i + 1 ισχυρισμό. Φανταστείτε ότι είστε εξωγήινοι και το μοναδικό πράγμαπου γνωρίζετε για την τρέχουσα κατάσταση του υπολογισμού σας είναι αυτή πουδημιουργεί ο i ισχυρισμός. Ο υπολογισμός μπορεί μάλιστα να βρίσκεται σε μια κα-τάσταση στην οποία είναι αδύνατο να φτάσει ποτέ, λαμβάνοντας υπόψη τον αλγό-ριθμο που έχει σχεδιαστεί μέχρι αυτό το σημείο. Εάν όμως επιτρέψετε κάτι τέτοιο,τότε θα έχετε πετύχει την ανεξαρτησία που επιθυμείτε ανάμεσα στα κομμάτια τωνενεργειών.Κάντε ένα βήμα: Εάν ξεκινήσετε σε μια κατάσταση στην οποία ισχύει ο i ισχυ-

ρισμός, αρκεί να γράψετε λίγο απλό κώδικα που θα εκτελεί κάποιες απλές ενέργειεςπου θα αλλάζουν την κατάσταση του υπολογισμού, ώστε να ισχύει ο i + 1.Απόδειξη ορθότητας κάθε βήματος: Η απόδειξη ότι ο αλγόριθμός σας λει-

τουργεί μπορεί να γίνει βήμα-βήμα, σε ένα κομμάτι του κάθε φορά. Πρέπει να απο-δείξετε ότι αν ο χρόνος σταματήσει και η κατάσταση του υπολογισμού είναι τέτοια

Page 20: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t10ΚΕΦΑΛΑΙΟ 1. ΕΠΑΝΑΛΗΠΤΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ: ΜΕΤΡΑ ΠΡΟΟΔΟΥ ΚΑΙ

ΑΝΑΛΛΟΙΩΤΕΣ ΣΥΝΘΗΚΕΣ

πουνα ισχύει ο i ισχυρισμόςκαι ξεκινήσετε το χρόνοξανάγιααρκετήώρα, τόσηώστενα εκτελεστεί το επόμενο κομμάτι κώδικα, τότε όταν σταματήσετε ξανά το χρόνο, ηκατάσταση του υπολογισμού θα είναι τέτοια που να ισχύει ο i + 1 ισχυρισμός. Αυτή ηαπόδειξη μπορεί να είναι μια επίσημη μαθηματική απόδειξη ή μπορεί να είναι έναςεντελώς ανεπίσημος μορφασμός. Σε κάθε περίπτωση, η επίσημη πρόταση αυτούπου πρέπει να αποδειχθεί έχει ως εξής:

⟨ith–ισχυρισμός⟩&κώδικαςi ⇒ ⟨i+ 1st–ισχυρισμός⟩

Απόδειξη ορθότητας του αλγόριθμου: Όλα αυτά τα μεμονωμένα βήματαμπορούν να συγκεντρωθούν σε έναν ολόκληρο, λειτουργικό αλγόριθμο. Θεωρούμεότι το στιγμιότυπο εισόδου που δίνεται ικανοποιεί την προσυνθήκη. Σε κάποιο ση-μείο, αποδείξαμε ότι αν ισχύει η προσυνθήκη ισχύει και εκτελείται το πρώτο κομμάτικώδικα, τότε η κατάσταση του υπολογισμού θα είναι τέτοια που να ισχύει ο πρώτοςισχυρισμός. Σε κάποιο άλλο σημείο, αποδείξαμε ότι αν ισχύει ο πρώτος ισχυρισμόςκαι εκτελείται το δεύτερο κομμάτι κώδικα, τότε η κατάσταση του υπολογισμού θαείναι τέτοια που να ισχύει ο δεύτερος ισχυρισμός. Αυτό γίνεται για κάθε κομμάτι.Όλες αυτές οι ανεξάρτητα αποδεδειγμένες προτάσεις μπορούν να συγκεντρωθούν,ώστε να αποδείξουν αν, αρχικά, το στιγμιότυπο εισόδου ικανοποιεί την προσυνθήκηκαι εκτελείται ολόκληρος ο κώδικας, τότε στο τέλος, η κατάσταση του υπολογισμούθα είναι τέτοια που να ικανοποιείται η μετασυνθήκη. Αυτό ακριβώς είναι αυτό πουαπαιτείται προκειμένου να αποδειχθεί ότι ο αλγόριθμος λειτουργεί.

1.2 Ταβήματαανάπτυξης ενός επαναληπτικούαλγόριθμου

Επαναληπτικοί αλγόριθμοι: Ένας καλός τρόπος για να δημιουργείτε πολλά προ-γράμματα υπολογιστών είναι να αποθηκεύετε τις βασικές πληροφορίες που γνωρί-ζετε ήδη σε κάποια δομή δεδομένων και κατόπιν, κάθε επανάληψη του κύριου βρό-χου να σας μεταφέρει ακόμα ένα βήμα προς τον προορισμό σας, κάνοντας μια μικρήαλλαγή σ’ αυτές τις πληροφορίες.Αναλλοίωτη συνθήκη: Μια αναλλοίωτη συνθήκη εκφράζει σημαντικές σχέσεις

ανάμεσα στις μεταβλητές που πρέπει να ισχύουν στην αρχή κάθε επανάληψης καιόταν ο βρόχος τερματίζεται. Εάν ισχύει, τότε ο υπολογισμός βρίσκεται σε καλόδρόμο, αλλά αν δεν ισχύει, τότε ο αλγόριθμος έχει αποτύχει.Η δομή του κώδικα: Η βασική δομή του κώδικα έχει ως εξής:

αρχή ρουτίνας⟨προσυνθήκη⟩κώδικαςπρο–βρόχου %Όρισε αναλλοίωτη συνθήκη

Page 21: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t1.2. ΤΑ ΒΗΜΑΤΑ ΑΝΑΠΤΥΞΗΣ ΕΝΟΣ ΕΠΑΝΑΛΗΠΤΙΚΟΥ ΑΛΓΟΡΙΘΜΟΥ 11

βρόχος⟨αναλλοίωτη συνθήκη⟩έξοδος όταν ⟨συνθήκη εξόδου⟩κώδικαςβρόχος %Προχώρα όσο διατηρείται η αναλλοίωτη συνθήκη

τέλος βρόχουκώδικαςμετά βρόχου % Τακτοποίησε τις εκκρεμείς εργασίες⟨μετασυνθήκη⟩

τέλος ρουτίνας

Απόδειξη ορθότητας: Θα πρέπει να είστε βέβαιοι ότι ο αλγόριθμός σας θα λει-τουργεί για όλες τις εισόδους που δίνονται και θα παράγει τη σωστή απάντηση.Χρόνος εκτέλεσης: Θαπρέπει επίσηςναείστεβέβαιοιότι οαλγόριθμόςσαςολο-

κληρώνεται σε εύλογο χρονικό διάστημα.Τα πιο σημαντικά βήματα: Εάν πρέπει να σχεδιάσετε έναν αλγόριθμο, μην ξε-

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

1. Προδιαγραφές: Τι πρόβλημα επιχειρείτε να λύσετε; Ποιες είναι οι προ- και οιμετασυνθήκες – δηλαδή, από πού ξεκινάτε και πού βρίσκεται ο προορισμόςσας;

2. Βασικά βήματα: Ποια βασικά βήματαθασας οδηγήσουν λίγο ήπολύστησω-στή κατεύθυνση;

3. Μέτρο προόδου: Πρέπει να ορίσετε ένα μέτρο προόδου: πού βρίσκονται οιχιλιομετρικοί δείκτες κατά μήκος της διαδρομής;

4. Η αναλλοίωτη συνθήκη: Πρέπει να ορίσετε μια αναλλοίωτη συνθήκη ηοποία θα σας δίνει μια εικόνα για την κατάσταση του υπολογισμού σας ότανβρίσκεται στην κορυφή του κύριου βρόχου. Με άλλα λόγια, καθορίστε τοδρόμο που θα ακολουθήσετε.

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

6. Πρόοδος: Κάθε επανάληψη του κύριου βήματός σας πρέπει να προχωράσύμ-φωνα με το μέτρο προόδου που έχετε ορίσει.

Page 22: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t12ΚΕΦΑΛΑΙΟ 1. ΕΠΑΝΑΛΗΠΤΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ: ΜΕΤΡΑ ΠΡΟΟΔΟΥ ΚΑΙ

ΑΝΑΛΛΟΙΩΤΕΣ ΣΥΝΘΗΚΕΣ

Εικόνα 1.1: Οι απαιτήσεις ενός επαναληπτικού αλγόριθμου.

148.png

Ορισμός προβλήματος Ορισμός αναλλοίωτων συνθηκώνΟρισμός μέτρου προόδου79 χιλιόμετρα για το σχολείο

Ορισμός βήματος Ορισμός συνθήκης εξόδου Διατήρηση αναλλοίωτων συνθηκώνΈξοδος Πρόοδος Αρχικές συνθήκες Τερματισμός

7. Διατήρησηαναλλοίωτης συνθήκης: Κάθε επανάληψη τουκύριουβήματοςπρέπει να διασφαλίζει ότι η αναλλοίωτη συνθήκη ισχύει ξανά όταν ο υπολογι-σμός επιστρέφει στην αρχή του βρόχου. (Με τη μέθοδο της επαγωγής θα απο-δειχθεί ότι ισχύει πάντα.)

8. Επαλήθευση της αναλλοίωτης συνθήκης: Τώρα που γνωρίζετε περίπουπροςταπούπηγαίνετε, καταλαβαίνετεκαλύτεραπώςναξεκινήσετε. Πρέπει ναγράψετε τον ψευδοκώδικα κώδικαςπρο βρόχου ώστε να ορίσετε αρχικά την αναλ-λοίωτη συνθήκη. Ποια διαδρομή θα ακολουθήσετε για να πάτε από το σπίτισας στο σωστό δρόμο;

9. Συνθήκη εξόδου: Πρέπει να γράψετε τη συνθήκη ⟨συνθήκη εξόδου⟩ η οποίαθα αναγκάζει τον υπολογισμό να εγκαταλείψει το βρόχο.

10. Τερματισμός: Πως διασφαλίζει η συνθήκη εξόδου μαζί με τη αναλλοίωτησυνθήκη ότι το πρόβλημα λύθηκε; Όταν βρίσκεστε στο τέλος του δρόμου,

Page 23: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t1.2. ΤΑ ΒΗΜΑΤΑ ΑΝΑΠΤΥΞΗΣ ΕΝΟΣ ΕΠΑΝΑΛΗΠΤΙΚΟΥ ΑΛΓΟΡΙΘΜΟΥ 13

αλλά ακόμα σ’ αυτόν, πώς παράγετε την απαιτούμενη έξοδο; Πρέπει να γρά-ψετε τονψευδοκώδικα κώδικαςμετά βρόχου πουθα τακτοποιήσει τις εκκρεμείς ερ-γασίες και θα επιστρέψει την απαιτούμενη έξοδο.

11. Τερματισμός και χρόνος εκτέλεσης: Πόσοπρόοδοθαπρέπει να έχετε κάνειπροκειμένου να καταλάβετε ότι έχετε φτάσει στην έξοδο; Αφορά μια εκτίμησητου χρόνου εκτέλεσης του αλγόριθμού σας.

12. Ειδικές περιπτώσεις: Όταν επιχειρείτε αρχικά να σχεδιάσετε έναν αλγό-ριθμο, θα πρέπει να λαμβάνετε υπόψησας μόνο ένα γενικό τύπο στιγμιότυπωνεισόδου. Αργότερα, θα πρέπει να επαναλάβετε τα βήματα και για άλλους τύ-πους στιγμιότυπων και ειδικές περιπτώσεις. Θα πρέπει επίσης να δοκιμάσετετον αλγόριθμό σας σε αρκετά διαφορετικά παραδείγματα.

13. Κωδικοποίηση και λεπτομέρειες υλοποίησης: Τώρα είστε έτοιμοι να ενώ-σετε όλα τα κομμάτια και να παράγετε τον ψευδοκώδικα για τον αλγόριθμο. Σ’αυτό το σημείο, ίσως χρειαστεί να παρέχετε κάποιες πρόσθετες λεπτομέρειεςυλοποίησης

14. Επίσημη απόδειξη: Εάν τα παραπάνω κομμάτια ταιριάζουν όπως πρέπει,τότε ο αλγόριθμός σας λειτουργεί.

ΠΑΡΑΔΕΙΓΜΑ 1.2.1Οαλγόριθμοςδύοδαχτύλωνεύρεσηςμέγιστουγιαπα-ρουσίαση αυτών των εννοιών

1. Προδιαγραφές: Ένα στιγμιότυπο εισόδου αποτελείται από μια λίστα L(1..n)με στοιχεία. Η έξοδος αποτελείται από ένα δείκτη i, ώστε τοL(i) να έχει μέγι-στητιμή. Εάνυπάρχουνπολλάστοιχείαμετην ίδια τιμή, τότεεπιστρέφειοποιο-δήποτε απ’ αυτά.

2. Βασικά βήματα: Αποφασίζετε να εφαρμόσετε τη μέθοδο δύο δαχτύλων. Τοδεξί σας δάχτυλο διατρέχει τη λίστα.

3. Μέτρο προόδου: Το μέτρο προόδου είναι πόσο μακριά έχει προχωρήσει στηλίστα το δεξί σας δάχτυλο.

4. Η αναλλοίωτη συνθήκη: Η αναλλοίωτη συνθήκη δηλώνει ότι το αριστερόσας δάχτυλο δείχνει ένα από τα μεγαλύτερα στοιχεία της λίστας που έχετε συ-ναντήσει έως τώρα με το δεξί σας δάχτυλο.

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

Page 24: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t14ΚΕΦΑΛΑΙΟ 1. ΕΠΑΝΑΛΗΠΤΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ: ΜΕΤΡΑ ΠΡΟΟΔΟΥ ΚΑΙ

ΑΝΑΛΛΟΙΩΤΕΣ ΣΥΝΘΗΚΕΣ

6. Πρόοδος: Προχωράτε, επειδή το δεξί σας δάχτυλο μετακινήθηκε κατά έναστοιχείο.

7. Διατήρησηαναλλοίωτης συνθήκης: Θακαταλάβετεότι ηαναλλοίωτησυν-θήκη διατηρείται ως εξής: Για κάθε βήμα, το νέο στοιχείο που δείχνει το αρι-στερό δάχτυλο είναι το μέγιστο ανάμεσα στο παλαιό στοιχείο του αριστερούδαχτύλου και στο νέο στοιχείο. Στην αναλλοίωτη συνθήκη, αυτό είναι το μέγι-στο ανάμεσα στο μέγιστο της μικρότερης λίστας και στο νέο στοιχείο. Με μα-θηματικούς όρους, πρόκειται για το μέγιστο της μεγαλύτερης λίστας.

8. Επαλήθευση της αναλλοίωτης συνθήκης: Ορίζετε αρχικά την αναλλοίωτησυνθήκη δείχνοντας με αμφότερα τα δάχτυλα το πρώτο στοιχείο.

9. Συνθήκηεξόδου: Έχετε τελειώσει όταν τοδεξί σαςδάχτυλοέχει διασχίσει όλητη λίστα.

10. Τερματισμός: Θα γνωρίζετε τελικά ότι το πρόβλημα με τον εξής τρόπο: Στησυνθήκη, το δεξί σας δάχτυλο έχει συναντήσει όλα τα στοιχεία. Στην αναλλοί-ωτη συνθήκη, το αριστερό σας δάχτυλο δείχνει το μέγιστο στοιχείο. Θα πρέπεινα επιστρέψετε τότε αυτό το στοιχείο.

11. Τερματισμός και χρόνος εκτέλεσης: Οχρόνος που απαιτείται είναι μια συν-θήκη που χρονομετρά το μήκος της λίστας.

12. Ειδικές περιπτώσεις: Ελέγξτε τι συμβαίνει όταν υπάρχουν πολλά στοιχεία μετην ίδια τιμή ή όταν n = 0 ή n = 1.

13. Κωδικοποίηση και λεπτομέρειες υλοποίησης:

αλγόριθμος Εύρεση μέγιστου (L)

⟨προσυνθήκη:⟩L είναι ένας πίνακας με n τιμές.⟨μετασυνθήκη:⟩ Επιστρέφει ένα δείκτη με τη μέγιστη τιμή.αρχή

i = 1; j = 1

βρόχος

⟨αναλλοίωτη συνθήκη⟩ : L[i] είναι το μέγιστο στοL[1..j].έξοδος όταν (j ≥ n)

%Προχώρα ενώ διατηρείται η αναλλοίωτη συνθήκη

j = j + 1

αν(L[i] < L[j] ) τότε i = j

τέλος βρόχου

Page 25: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t1.3. ΠΕΡΙΣΣΟΤΕΡΑ ΓΙΑ ΤΑ ΒΗΜΑΤΑ 15

επέστρεψε(i)

τέλος αλγόριθμου

14. Επίσημη απόδειξη: Η ορθότητα του αλγόριθμου προκύπτει από τα παρα-πάνω βήματα.

Ένας νέος τρόπος σκέψης: Ίσως μπείτε στον πειρασμό να σκεφτείτε ότι τα μέ-τρα προόδου και οι αναλλοίωτες συνθήκες είναι θεωρητικές φλυαρίες. Αλλά ο κλά-δος, μετά από πολλά λάθη που στοίχισαν ακριβά, εκτιμά βαθύτερα την ανάγκη γιαορθότητα. Η φιλοσοφία μας είναι να σας διδάξουμε πώς να σκέφτεστε, αναπτύσ-σετε και περιγράφετε αλγόριθμους με τέτοιο τρόπο που η ορθότητά τους να είναιδιάφανη. Γι’ αυτόν το λόγο, τα, μέτρα προόδου και οι αναλλοίωτες συνθήκες είναιαναγκαία. Η περιγραφή των προηγούμενων αλγόριθμων και των αποδείξεων ορθό-τητάς τους ενώνονται σε μία οντότητα.Μείνετε προσγειωμένοι: Οι αναλλοίωτες συνθήκες συνιστούν φιλοσοφία

ζωής και μας οδηγούν σε ρεαλισμό. Το μεγαλύτερο μέρος του κώδικα που βαθ-μολογώ ως καθηγητής μου δίνει μια αίσθηση ότι οι φοιτητές πετούν στα σύννεφα.Υπάρχει μια κυκλική διάταξη, αλλά δεν καταλαβαίνω τι σημαίνουν οι μεταβλητές,πώς ταιριάζουν μεταξύ τους, προς τα πού κατευθύνεται ο αλγόριθμος ή πώς πρέπεινα τον σκεφτώ εξ αρχής. Οι αναλλοίωτες συνθήκες σημαίνουν ότι ξεκινώ τη μέραμου στο σπίτι, όπου ξέρω τι ισχύει και τι σημαίνουν τα πράγματα. Από εκεί, έχωόλα όσα χρειάζονται για να τολμήσω να βγω στο άγνωστο. Ωστόσο, οι αναλλοίωτεςσυνθήκες σημαίνουν επίσης ότι αφούδιανύσωέναν ολόκληρο κύκλο, θα επιστρέψωστην ασφάλεια του σπιτιού μου στο τέλος της ημέρας.ΑΣΚΗΣΗ 1.2.1Ποιες είναι οι επίσημες μαθηματικές έννοιες που περιλαμβάνουν αναλλοί-

ωτες συνθήκες που πρέπει να αποδειχθούν, ώστε να αποδειχθεί ότι αν το πρόγραμμα τερματι-στεί, πετυχαίνει τη μετασυνθήκη;

1.3 Περισσότερα για τα βήματαΣ’ αυτήν την ενότητα δίνω περισσότερες λεπτομέρειες για τα βήματα που πρέπει ναγίνουν προκειμένου να αναπτυχθεί ένας επαναληπτικός αλγόριθμος.

1. Προδιαγραφές: Για να σχεδιάσουμε έναν επαναληπτικό αλγόριθμο, πρέπειπρώταναγνωρίζουμεακριβώς τι είναι αυτόπουυποτίθεται ότι πρέπει νακάνει.

Προσυνθήκες: Ποια είναι τα έγκυρα στιγμιότυπα εισόδου; Οποιοσδή-ποτε ισχυρισμός που πρέπει να ισχύει σε σχέση με το στιγμιότυπο εισόδουαναφέρεται ως προσυνθήκη.

Page 26: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t16ΚΕΦΑΛΑΙΟ 1. ΕΠΑΝΑΛΗΠΤΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ: ΜΕΤΡΑ ΠΡΟΟΔΟΥ ΚΑΙ

ΑΝΑΛΛΟΙΩΤΕΣ ΣΥΝΘΗΚΕΣ

Μετασυνθήκες: Ποια είναι η απαιτούμενη έξοδος για κάθε έγκυρο στιγ-μιότυπο; Οποιοσδήποτε ισχυρισμός που πρέπει να ισχύει σε σχέση με τηνέξοδο αναφέρεται ως μετασυνθήκη.

Ορθότητα: Ένας αλγόριθμος για το πρόβλημα είναι σωστός αν για κάθεέγκυρο στιγμιότυπο εισόδου παράγεται η απαιτούμενη έξοδος. Εάν τοστιγμιότυποεισόδουδεν ικανοποιεί τιςπροσυνθήκες, τότεδενυπάρχει κα-μία βεβαιότητα για τίποτα. Επισήμως, αυτό εκφράζεται ως

⟨προσυνθήκη⟩& κώδικαςεπίπεδο εφαρμογής ⇒ ⟨μετασυνθήκη⟩

Αυτή η ορθότητα σχετίζεται μόνο με τις προδιαγραφές.

Παράδειγμα: Το πρόβλημα ταξινόμησης ορίζεται ως εξής:

Προσυνθήκες: Η είσοδος είναι μια λίστα από n τιμές, συμπεριλαμ-βανομένων πιθανών επαναλήψεων.

Μετασυνθήκες: Ηέξοδος είναι μια λίσταηοποίααποτελείται από τιςίδιες n τιμές σε μη φθίνουσα σειρά.

Τοσυμβόλαιο: Οιπρο-καιοιμετασυνθήκεςείναι, υπόμίαέννοια, τοσυμ-βόλαιο ανάμεσα στον υλοποιητή και το χρήστη του κωδικοποιημένου αλ-γόριθμου.

Υλοποιητής: Όταν γράφετε μια υπορουτίνα, μπορείτε να θεωρήσετε ότιη είσοδος φτάνει στο πρόγραμμά σας με τη σωστή μορφή και ικανοποιείόλες τις προσυνθήκες. Πρέπει να γράψετε την υπορουτίνα έτσι, ώστε ναεξασφαλίζει ότι όλες οι μετασυνθήκες θα ισχύουν μετά την εκτέλεση.

Χρήσης: Όταν χρησιμοποιείτε την υπορουτίνα, πρέπει να εξασφαλίσετεότι η είσοδος που δίνετε ικανοποιεί τις προσυνθήκες της υπορουτίνας καιτότε θα μπορείτε να είστε βέβαιοι ότι η έξοδος ικανοποιεί τις μετασυνθή-κες της.

2. Βασικά βήματα: Στην αρχή της διαδικασίας σχεδίασης του αλγόριθμου, θαήταν χρήσιμο να σκεφτείτε τα βασικά βήματα ή τις βασικές ενέργειες που θαμπορούσατε να εκτελέσετε προκειμένου να προχωρήσετε προς την επίλυσητου προβλήματος. Κάντε μερικά απ’ αυτά τα βήματα για ένα απλό στιγμιότυποεισόδου,ώστε ναπάρετεμια ιδέασχετικάμε τηνπορείαπουμπορεί ναακολου-θήσει ο υπολογισμός. Πώς όμως οι πληροφορίες που αποκτώνται μπορούν ναπεριορίσουν το πρόβλημα του υπολογισμού;

3. Μέτροπροόδου: Πρέπει ναορίσετεμια λειτουργίαηοποίαόταν λαμβάνει τηντρέχουσα κατάσταση του υπολογισμού, επιστρέφει μια ακέραια τιμή που εκ-φράζει την πρόοδο που έχει κάνει ήδη ο υπολογισμός ή την πρόοδο που υπο-λείπεται. Αυτήη τιμήαναφέρεται είτεωςμέτρο προόδου είτεωςσυνάρτησηδυνα-μικού. Πρέπει να είναι τέτοια, ώστε η συνολική πρόοδος που απαιτείται για την

Page 27: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t1.3. ΠΕΡΙΣΣΟΤΕΡΑ ΓΙΑ ΤΑ ΒΗΜΑΤΑ 17

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

4. Η αναλλοίωτη συνθήκη: Συχνά, η εύρεση της αναλλοίωτης συνθήκης είναιτο πιο δύσκολο κομμάτι της σχεδίασης ενός αλγόριθμου. Απαιτεί εξάσκηση,επιμονή, δημιουργικότητα και βαθιά γνώση. Ωστόσο, μετά απ’ αυτό, ο υπό-λοιπος αλγόριθμος ρέει άνετα. Δείτε μερικές χρήσιμες συμβουλές.

Ορισμός:Μια αναλλοίωτη συνθήκη είναι ένας ισχυρισμός που τοποθετείταιστην αρχή ενός βρόχου και πρέπει να ισχύει κάθεφοράπουουπολογισμόςεπιστρέφει στην αρχή του βρόχου.

Ισχυρισμοί: Πιο γενικά, ένας ισχυρισμός είναι μια δήλωση που γίνεται σεκάποιο συγκεκριμένο σημείο κατά τη διάρκεια της εκτέλεσης ενός αλγό-ριθμου σχετικά με την τρέχουσα κατάσταση των δομών δεδομένων τουυπολογισμού, η οποία είναι αληθής ή ψευδής. Εάν είναι ψευδής, τότευπάρχει κάποιο σφάλμα στη λογική του αλγόριθμου. Οι προ- και οι μετα-συνθήκες είναι ειδικές περιπτώσεις ισχυρισμών οι οποίες παρέχουν σαφήόρια μεταξύ συστημάτων, υποσυστημάτων, ρουτινών και υπορουτινών.Μέσα σε ένα τέτοιο κομμάτι, οι ισχυρισμοί μπορούν επίσης να παρέχουνσημεία ελέγχουκατά τονυπολογισμό,ώστε ναμπορούνόλοι να γνωρίζουντι θα έπρεπε να έχει επιτευχθεί μέχρι το συγκεκριμένο σημείο. Οι αναλ-λοίωτες συνθήκες είναι το ίδιο, με τη διαφορά ότι εφαρμόζονται είτε σε έναβρόχο που εκτελείται πολλές φορές, είτε σε μια αντικειμενοστραφή δομήδεδομένων με συνεχόμενη παρουσία.

Σχεδίαση, κατανόηση και απόδειξη της ορθότητας: Γενικά, οιισχυρισμοί δεν είναι εργασίες που πρέπει να εκτελέσει ο αλγόριθμος,αλλά είναι μόνο σχόλια που προστίθενται προκειμένου να βοηθήσουντο σχεδιαστή, τον υλοποιητή και τον αναγνώστη να καταλάβουν τοναλγόριθμο και την ορθότητά του

Εκσφαλμάτωση: Ορισμένες γλώσσες σας επιτρέπουν να εισάγετεισχυρισμούς ως γραμμές κώδικας. Εάν κατά τη διάρκεια της εκτέλε-σης ένας τέτοιος ισχυρισμός είναι ψευδής, τότε το πρόγραμμα στα-ματά αυτόματα με ένα χρήσιμο μήνυμα σφάλματος – χρήσιμο τόσοκατά την εκσφαλμάτωση, αλλά και αφού ολοκληρωθεί ο κώδικας. Εί-ναιαυτόπουσυμβαίνει ότανέναπλαίσιομεμήνυμασφάλματοςεμφα-

Page 28: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t18ΚΕΦΑΛΑΙΟ 1. ΕΠΑΝΑΛΗΠΤΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ: ΜΕΤΡΑ ΠΡΟΟΔΟΥ ΚΑΙ

ΑΝΑΛΛΟΙΩΤΕΣ ΣΥΝΘΗΚΕΣ

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

Εικόνα από τη μέση:Μιααναλλοίωτη συνθήκηθαπρέπει να περιγράφειπώς θα θέλατε να μοιάζει η δομή δεδομένων όταν ο υπολογισμός βρίσκε-ται στην αρχή μιας επανάληψης. Από την περιγραφή σας, ο αναγνώστηςθα πρέπει να αποκτήσει μια εικόνα. Σχεδιάστε μια εικόνα αν προτιμάτε.

Στο δρόμο: Μια αναλλοίωτη συνθήκη πρέπει να εξασφαλίζει ότι ο υπο-λογισμός εξακολουθεί να κινείται στην πορεία του προς τον προορισμό καιότι δεν γλίστρησε σε κάποιο χαντάκι ή έπεσε πάνω σε δέντρο.

Ένας πλατύς δρόμος: Δεδομένου ενός σταθερού αλγόριθμου με στα-θερή είσοδο, ο υπολογισμός θα ακολουθεί μια σταθερή γραμμή. Όταν οσχεδιαστής τουαλγόριθμουγνωρίζει ακριβώςπούθαπάειαυτήηγραμμή,μπορεί να χρησιμοποιήσει μια πολύ σφιχτή αναλλοίωτη συνθήκη για ναορίσει ένα πολύ στενό δρόμο. Από την άλλη πλευρά, επειδή ο αλγόριθ-μός σας πρέπει να λειτουργεί για άπειρο αριθμό στιγμιότυπων εισόδουκαι επειδή μπορεί να συναντήσετε και να υπερπηδήσετε πολλά εμπόδιαστη διαδρομή, θα ήταν δύσκολο να προβλέψετε πού μπορεί να βρίσκε-ται ο υπολογισμός στη μέση της εκτέλεσης. Σε τέτοιες περιπτώσεις, ηχρήση μιας πολύ χαλαρής αναλλοίωτης συνθήκης για τον ορισμό ενόςπολύ πλατύ δρόμου είναι απολύτως αποδεκτή. Η γραμμή που ακολουθείστην πραγματικότητα ο υπολογισμός πιθανώς να μην είναι ευθεία, αλλάόλα είναι καλά αν παραμένει εντός των ορίων του δρόμου και συνεχίζει ναπροχωράπρος τα μπροστά. Ένα πλεονέκτημα ενός πλατύ δρόμου είναι ότιδίνει μεγαλύτερη ευελιξία στον τρόπο που υλοποιείται ο κύριος βρόχος.Ένα μειονέκτημα είναι ότι θα υπάρχουν πολλά περισσότερα μέρη όπουμπορεί να βρίσκεται ο αλγόριθμος και για κάθε τέτοιο μέρος, θα πρέπει νακαθορίσετε πώς θα προχωρήσει στη συνέχεια ο αλγόριθμος.

Παράδειγμα: Ως an παράδειγμα μιας χαλαρής αναλλοίωτης συνθή-κης, στον αλγόριθμο δύο δαχτύλων για την εύρεση του μέγιστου, ηαναλλοίωτη συνθήκη δεν υπαγορεύει απολύτως ποια καταχώρησηπρέπει να δείχνει το αριστερό σας δάχτυλο όταν υπάρχουν πολλές κα-ταχωρήσεις με την ίδια ελάχιστη τιμή.

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

Να γνωρίζετε τι είναι μια αναλλοίωτη συνθήκη: Θα πρέπει να είστε

Page 29: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t1.3. ΠΕΡΙΣΣΟΤΕΡΑ ΓΙΑ ΤΑ ΒΗΜΑΤΑ 19

ξεκάθαροιωςπρος το τι είναιμιααναλλοίωτησυνθήκη. Δενείναι κώδικας,προσυνθήκη, μετασυνθήκη ή κάποια άλλη ακατάλληλη πληροφορία. Γιαπαράδειγμα, το να δηλώσετε ότι κάτι ισχύει πάντα, όπως “1 + 1 = 2” ή “Ηρίζαείναι το μέγιστο σε οποιοδήποτε σωρό”, μπορεί να είναι μια χρήσιμη πλη-ροφορία για την απάντηση στο πρόβλημα, αλλά δεν θα πρέπει να μετέχειστην αναλλοίωτη συνθήκη.

Ομαλή ροή: Η αναλλοίωτη συνθήκη θα πρέπει να ρέει ομαλά από τηναρχή ως το τέλος του αλγόριθμου.

• Στην αρχή, θα πρέπει να προκύπτει άνετα από τις προσυνθήκες.• Θα πρέπει να προχωρά με μικρά, φυσικά βήματα.• Όταν ικανοποιηθεί η συνθήκη εξόδου, οι μετασυνθήκες θα πρέπει ναπροκύπτουν εύκολα.

Ζητήστε το 100%: Μια καλή φιλοσοφία στη ζωή είναι να ζητάτε το 100%των επιθυμιών σας, αλλά να μην θεωρείται βέβαιο ότι θα το πάρετε.

Όνειρο: Μην είστε ντροπαλοί. Τι θα θέλατε να ισχύει στη μέση τουυπολογισμού σας; Αυτό μπορεί να είναι μια εύλογη αναλλοίωτη συν-θήκη, αλλά μπορεί και να μην είναι.

Προσποιηθείτε: Φανταστείτε ότι ένα τζίνι πραγματοποίησε μια ευχήσας. Βρίσκεστε τώρα στη μέση του υπολογισμού σας και η ονειρικήαναλλοίωτη συνθήκη σας ισχύει πραγματικά.

Διατηρήστε την αναλλοίωτη συνθήκη: Απ’ αυτό το σημείο, μπο-ρείτε να κάνετε κάποια βήματα στον υπολογισμό σας διατηρώνταςταυτόχρονα την αναλλοίωτη συνθήκη; Εάν ναι, τότε όλα είναι τέλεια.Εάν όμως όχι, γενικά υπάρχουν δύο αιτίες.

Πολύ ασθενής: Εάν η αναλλοίωτη συνθήκη σας είναι πολύ ασθε-νής, τότε το τζίνι δεν σας έδωσε όλα όσα θα χρειαζόσασταν για ναπροχωρήσετε.

Πολύ ισχυρή: Εάν η αναλλοίωτη συνθήκη σας είναι πολύ ισχυρή,τότε δεν θα μπορείτε να την καθορίσετε αρχικά, ούτε να τη διατη-ρήσετε.

Καμία αδήλωτη παραδοχή: Οι αναλλοίωτες συνθήκες δεν πρέπει ναστερούνται λεπτομέρειας, ούτε να είναι τόσο ασθενείς που δεν θα μπο-ρούν να προχωρήσουν στο επόμενο βήμα. Δεν πρέπει να υπάρχουν παρα-δοχές που δεν δηλώνετε. Για να είστε βέβαιοι, κάντε το γνωστό κόλπο καιπροσποιηθείτε ότι είστε εξωγήινοι και μόλις προσγειωθήκατε στην αρχήτου βρόχου χωρίς να γνωρίζετε τίποτα απ’ όσα δηλώνονται στην αναλλοί-ωτη συνθήκη.

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

Page 30: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t20ΚΕΦΑΛΑΙΟ 1. ΕΠΑΝΑΛΗΠΤΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ: ΜΕΤΡΑ ΠΡΟΟΔΟΥ ΚΑΙ

ΑΝΑΛΛΟΙΩΤΕΣ ΣΥΝΘΗΚΕΣ

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

Έναστρη νύχτα: Πώς εμπνεύστηκε ο Βαν Γκονγκ το διάσημο έργο τουΈναστρη νύχτα; Η απάντηση δεν είναι εύκολη. Ομοίως, η εύρεση των αναλ-λοίωτων συνθηκών και των αλγόριθμων είναι μια μορφή τέχνης.

Εφαρμόστε αυτήν τη διαδικασία: Μην καταλήξετε στην αναλλοίωτησυνθήκη κατόπιν εορτής. Χρησιμοποιήστε την για να σχεδιάσετε τον αλ-γόριθμό σας.

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

Να ανησυχείτε για ένα βήμα κάθε φορά. Μην παρασύρεστε από την έντονη επι-θυμία να κατανοήσετε όλο τον υπολογισμό από την αρχή. Γενικά, αυτό είναικάτι που μπορεί μόνο να σας τρομάξει και να σας απογοητεύσει. Θα αναφέρωεδώ τα σοφά λόγια των Βουδιστών και των προγραμμάτων των δώδεκα βημά-των: Σήμερα, θα νιώσετε σαν να βρεθήκατε με κάποιον άγνωστο σε σας τρόποσε μια ξένη πόλη. Μην ανησυχείτε για το παρελθόν ή το μέλλον. Είστε όμωςστο σωστό δρόμο. Στόχος σας πρέπει να είναι να κάνετε ένα βήμα κάθε φοράώστε να προχωράτε προς τα εμπρός και να παραμείνετε στο δρόμο. Μπορείτεεπίσης να φανταστείτε ότι συμμετέχετε σε μια σκυταλοδρομία και ένας συνα-θλητής σας σάς δίνει τη σκυτάλη. Εσείς απλώς πρέπει να την μεταφέρετε κά-νοντας ένα γύρο στο στίβο και να την δώσετε στον επόμενο συμπαίκτη σας.

6. Πρόοδος: Πρέπει να αποδείξετε ότι η πρόοδος τουλάχιστον για μία μονάδαστο δικό σας μέτρο γίνεται κάθε φορά που ο αλγόριθμος εκτελεί μία επανά-ληψη του βρόχου. Μερικές φορές υπάρχουν κάποιες περίεργες καταστάσειςστις οποίεςοαλγόριθμοςμπορεί ναεκτελεστεί μίαφοράστοβρόχοχωρίςόμωςνα παρουσιάσει μετρήσιμη πρόοδο, αυτό όμως δεν μπορεί να γίνει αποδεκτό.Ο κίνδυνος είναι ο αλγόριθμος να επαναλαμβάνεται επ’ αόριστο. Θα πρέπεινα ορίσετε άλλο μέτρο, το οποίο σας δείχνει καλύτερα την πρόοδο σε τέτοιεςεπαναλήψεις, ή να αλλάξετε το βήμα που πραγματοποιείτε στον κύριο βρόχο,ώστε να υπάρχει πρόοδος. Η επίσημη απόδειξη αυτού είναι παρόμοια με τηναπόδειξη που εφαρμόζουμε για τη διατήρηση της αναλλοίωτης συνθήκης.

Page 31: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t1.3. ΠΕΡΙΣΣΟΤΕΡΑ ΓΙΑ ΤΑ ΒΗΜΑΤΑ 21

7. Διατηρήστε την αναλλοίωτη συνθήκη: Πρέπει να αποδείξετε ότι η αναλ-λοίωτη συνθήκη διατηρείται σε κάθε επανάληψη.

Η επίσημη πρόταση: Είτε θέλετε να την αποδείξετε επίσημη είτε όχι, η επί-σημη πρόταση που πρέπει να ισχύει είναι αυτή:

⟨αναλλοίωτη συνθήκη′⟩&not⟨συνθήκη εξόδου⟩& κώδικαςβρόχος ⇒

⟨αναλλοίωτη συνθήκη′′⟩

Τεχνική απόδειξης:

• Θεωρήστε ότι ο υπολογισμός βρίσκεται στην αρχή του βρόχου.

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

• Μπορείτε επίσης να θεωρήσετε ότι η συνθήκη εξόδου δεν ικανοποιείται,επειδή διαφορετικά ο βρόχος θα ολοκληρωνόταν.

• Εκτελέστε τονψευδοκώδικα κώδικαςβρόχος, σεμία επανάληψητουβρόχου.Αυτό αλλάζει τη δομή δεδομένων;

• Αποδείξτε ότι όταν επιστρέφετε ξανά στην αρχή του βρόχου, οι απαιτή-σεις που ορίζονται από την αναλλοίωτη συνθήκη ικανοποιούνται ακόμαμία φορά.

Διαφορετικές καταστάσεις: Πολλά λεπτά σημεία μπορεί να προκύψουν απότον τεράστιο αριθμό διαφορετικών στιγμιότυπων εισόδου και τον τεράστιοαριθμό διαφορετικών σημείων όπου μπορεί να βρεθεί ο υπολογισμός.

• Προτείνω να σχεδιάζετε αρχικά τον ψευδοκώδικα κώδικαςβρόχος έτσι ώστενα λειτουργεί για μια γενική ενδιάμεση επανάληψη, όταν έχετε ένα με-γάλο και γενικό στιγμιότυπο εισόδου. Σ’ αυτήν την περίπτωση, η αναλλοί-ωτη συνθήκη διατηρείται;

• Μετά δοκιμάστε το πρώτο και το τελευταίο ζεύγος επαναλήψεων.

• Δοκιμάστε επίσης στιγμιότυπα εισόδου ειδικών περιπτώσεων. Πριν γρά-ψετε ξεχωριστό κώδικα γι’ αυτά, ελέγξτε αν ο υπάρχων κώδικας μπορείνα χειριστεί τέτοιες περιπτώσεις. Εάν αναγκαστείτε να αλλάξετε τον κώ-δικα, μην παραλείψετε να βεβαιωθείτε ότι οι περιπτώσεις που αντιμετω-πίζονταν σωστά προηγουμένως εξακολουθούν να αντιμετωπίζονται σω-στά.

• Για να αποδείξετε ότι η αναλλοίωτη συνθήκη ισχύει σε όλες τις περιστά-σεις, φανταστείτε ότι βρίσκεστε στην αρχή του βρόχου, χωρίς όμως ναγνωρίζετε πώς φτάσατε εκεί. Ίσως να είστε πραγματικά εξωγήινοι. Πέρα

Page 32: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t22ΚΕΦΑΛΑΙΟ 1. ΕΠΑΝΑΛΗΠΤΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ: ΜΕΤΡΑ ΠΡΟΟΔΟΥ ΚΑΙ

ΑΝΑΛΛΟΙΩΤΕΣ ΣΥΝΘΗΚΕΣ

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

Διαφορές μεταξύ επαναλήψεων: Η εκχώρηση x = x + 2 έχει νόημα σανμια γραμμή κώδικα, αλλά όχι σαν μαθηματική πρόταση. Ορίστε το x

′ως τιμή

του x στην αρχή της επανάληψης και το x′′αφού εκτελέσετε το βρόχο ακόμα

μία φορά. Το αποτέλεσμα που έχει ο κώδικας x = x+ 2 είναι ότι x′′= x

′+ 2.

8. Επαλήθευση της αναλλοίωτης συνθήκης: Πρέπει να αποδείξετε ότι ο αρ-χικός κώδικας ορίζει την αναλλοίωτη συνθήκη.

Η επίσημη πρόταση: Η επίσημη πρόταση που πρέπει να ισχύει είναι

⟨προσυνθήκη⟩&κώδικαςπρο βρόχου ⇒ ⟨αναλλοίωτη συνθήκη⟩

Τεχνική απόδειξης:

• Θεωρήστε ότι μόλις ξεκινάτε τον υπολογισμό.

• Μπορείτε να θεωρήσετε ότι το στιγμιότυπο εισόδου ικανοποιεί την προ-συνθήκη, διαφορετικά δεν θα μπορείτε να λύσετε το πρόβλημα.

• Εκτελέστε τον κώδικα κώδικαςπρο βρόχου πριν το βρόχο.

• Αποδείξτεότι ότανφτάνετεαρχικάστηναρχήτουβρόχου, ικανοποιούνταιοι απαιτήσεις που ορίζονται από την αναλλοίωτη συνθήκη.

Ο πιο εύκολος τρόπος: Καθορίστε την αναλλοίωτη συνθήκη με τον πιο εύ-κολο δυνατό τρόπο. Για παράδειγμα, αν πρέπει να κατασκευάσετε ένα σύνολοόπου όλοι οι δράκοι που περιέχει να είναι μοβ, ο πιο εύκολος τρόπος να το κά-νετε είναι να κατασκευάσετε το κενό σύνολο. Παρατηρήστε ότι όλοι οι δράκοισ’ αυτό το σύνολο είναι μοβ, αφού δεν περιέχει δράκους που δεν είναι μοβ.

Προσοχή: Μερικές φορές είναι δύσκολο να γνωρίζετε πώς να ορίσετε τις με-ταβλητές ώστε αρχικά η αναλλοίωτη συνθήκη να ισχύει. Σε τέτοιες περιπτώ-σεις, θα πρέπει να δοκιμάζετε να τις ορίζετε έτσι ώστε να εξασφαλίζετε ότιισχύει μετά την πρώτη επανάληψη. Για παράδειγμα, ποια είναι η μέγιστη τιμήμέσα σε μια κενή λίστα τιμών; Κάποιος θα μπορούσε να σκεφτεί το 0 ή το∞.Ωστόσο, μια καλύτερα απάντηση είναι το−∞. Όταν προστίθεται μια νέα τιμή,χρησιμοποιείται ο κώδικας νέοΜέγιστο = max(παλιόΜέγιστο, νέαΤιμή). Εάν ξε-κινήσετε με το παλιόΜέγιστο = ∞, θα πάρετε τη σωστή απάντηση όταν προ-στεθεί η πρώτη τιμή.

9. Συνθήκη εξόδου: Γενικά, βγαίνετε από το βρόχο όταν ολοκληρώσετε την ερ-γασία του.

Page 33: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t1.3. ΠΕΡΙΣΣΟΤΕΡΑ ΓΙΑ ΤΑ ΒΗΜΑΤΑ 23

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

Επανάληψη όσο και Έξοδος όταν: Τα παρακάτω είναι ισοδύναμα:

while (A καιB) βρόχος… ⟨αναλλοίωτη συνθήκη⟩

τέλος βρόχου έξοδος όταν (όχιA ή όχιB)…

τέλος βρόχου

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

10. Τερματισμός: Σ’ αυτό τοβήμα, πρέπει να εξασφαλίσετεότι ότανολοκληρωθείο βρόχος, θα είστε σε θέση να λύσετε το πρόβλημα.

Η επίσημη πρόταση: Η επίσημη πρόταση που πρέπει να ισχύει είναι

⟨αναλλοίωτη συνθήκη⟩ & ⟨συνθήκη εξόδου⟩ & κώδικαςμετά βρόχου ⇒

⟨μετασυνθήκη⟩

Τεχνική απόδειξης:

• Θεωρήστε ότι μόλις βγήκατε από το βρόχο.

• Μπορείτε να θεωρήσετε ότι η αναλλοίωτη συνθήκη ισχύει, επειδή έχετεβεβαιωθεί ότι ίσχυε πάντα.

• Μπορείτε επίσηςναθεωρήσετεότιησυνθήκηεξόδου ισχύει, βασιζόμενοιστο γεγονός ότι βγήκατε από το βρόχο.

• Εκτελέστε τονκώδικα κώδικαςμετά βρόχου μετά τοβρόχο,ώστε ναπραγματο-ποιήσετεμερικές τελευταίες κινήσεις προς την επίλυση τουπροβλήματοςκαι να επιστρέψετε το αποτέλεσμα.

Page 34: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t24ΚΕΦΑΛΑΙΟ 1. ΕΠΑΝΑΛΗΠΤΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ: ΜΕΤΡΑ ΠΡΟΟΔΟΥ ΚΑΙ

ΑΝΑΛΛΟΙΩΤΕΣ ΣΥΝΘΗΚΕΣ

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

11. Τερματισμόςκαι χρόνοςεκτέλεσης: Πρέπει νααποδείξετεότιοαλγόριθμοςδεν επαναλαμβάνεται για πάντα. Αυτό γίνεται αν αποδείξετε ότι το μέτρο προ-όδου ικανοποιεί κάποια τιμή που έχετε δηλώσει και ότι η συνθήκη εξόδου ικα-νοποιείται οριστικά. (Εάν ο βρόχος τερματιστεί νωρίτερα, ακόμα καλύτερα.)Ο αριθμός των επαναλήψεων που απαιτούνται ορίζεται από την καθορισμένητιμή προόδου δια της τιμής προόδου που επιτυγχάνεται σε κάθε επανάληψη.Ο χρόνος εκτέλεσης υπολογίζεται αν αθροίσουμε το χρόνο που απαιτείται γιακάθε επανάληψη. Για κάποιες εφαρμογές, πιθανώς να είναι επίσης σημαντικάτα όρια του χώρου, δηλαδή η ποσότητα μνήμης που απαιτείται. Στα Κεφάλαια23-26 θααναλύσουμε σημαντικές έννοιες που έχουν σχέσημε το χρόνο εκτέλε-σης: την πολυπλοκότητα του χώρου και του χρόνου, τις χρήσιμες έννοιες τωνλογάριθμων και των εκθετικών συναρτήσεων, τις παραστάσεις BigO (O) καιTheta (Θ) και αρκετές πρακτικές προσεγγίσεις.

12. Ειδικές περιπτώσεις: Όταν σχεδιάζετε έναν αλγόριθμο, δεν πρέπει να ανη-συχείτε για κάθε πιθανό τύπο στιγμιότυπου εισόδου ταυτόχρονα. Αντίθετα, οαλγόριθμος θα πρέπει αρχικά να λειτουργεί για ένα γενικό τύπο, μετά για άλλοκαι ούτω καθ’ εξής. Αν και ο επόμενος τύπος στιγμιότυπων εισόδου μπορεί ναχρειαστεί ξεχωριστό κώδικα, ξεκινήστε εξιχνιάζοντας αυτό που μπορεί να κά-νει ο αλγόριθμος που έχετε ήδη σχεδιάσει όταν λάβει τέτοια είσοδο. Συχνά,αυτός ο αλγόριθμος τυγχάνει να χειρίζεται πολλές τέτοιες περιπτώσεις αυτό-ματα, χωρίς να απαιτείται ξεχωριστός κώδικας. Όταν προσθέτετε κώδικα σεμια ειδική περίπτωση, βεβαιωθείτε ότι οι περιπτώσεις που αντιμετωπίζοντανσωστά εξακολουθούν να αντιμετωπίζονται έτσι.

13. Κωδικοποίηση και λεπτομέρειες υλοποίησης: Ακόμα και αφού δημιουρ-γηθεί ο σκελετός του βασικού αλγόριθμου, μπορεί να απομένουν κάποιες λε-πτομέρειες που χρήζουν περαιτέρω προσοχής. Πολλές απ’ αυτές τις λεπτομέ-ρειες της υλοποίησης μπορεί να κρυφτούν σε αφηρημένους τύπους δεδομέ-νων (βλ. Κεφάλαιο 3). Εάν μια λεπτομέρεια δεν διαφοροποιεί σημαντικά έναναλγόριθμο, θαήταν καλύτερο νααφήσετεανοιχτές όλες τις πιθανότητες και ναπαραχωρήσετε επιπλέον ευελιξία στον υλοποιητή. Για πολλές λεπτομέρειες,δεν έχει σημασία η επιλογή που θα κάνετε, αλλά αν δεν είστε σταθεροί και ξε-κάθαροι στις επιλογέςσας, μάλλονθαπροκαλέσετεατέλειες. Μπορεί τοβιβλίονα μην επικεντρώνεται στις λεπτομέρειες της κωδικοποίησης, αυτό όμως δενσημαίνει ότι δεν είναι σημαντικές.

14. Επίσημη απόδειξη: Τα βήματα 1–11 είναι αρκετά για να εξασφαλιστεί η ορθήλειτουργία του επαναληπτικού σας αλγόριθμου: ότι δίνει τη σωστή απάντηση

Page 35: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t1.3. ΠΕΡΙΣΣΟΤΕΡΑ ΓΙΑ ΤΑ ΒΗΜΑΤΑ 25

γιαόλες τις εισόδουςπουκαθορίζονται. Σκεφτείτεκάποιοστιγμιότυποπου ικα-νοποιεί τις προσυνθήκες. Με το βήμα 8 ορίζουμε την αναλλοίωτη συνθήκητην πρώτη φορά που ο υπολογισμός βρίσκεται στην αρχή του βρόχου και μετο βήμα 7 τον διατηρούμε σε κάθε επανάληψη. Μέσω της επαγωγής, γνωρί-ζουμε ότι η αναλλοίωτησυνθήκη ισχύει κάθεφοράπουουπολογισμόςβρίσκε-ται στην αρχή τουβρόχου (περισσότεραστην παρακάτωενότητα). Με τοβήμα5, το βήμα που γίνεται στον κύριο βρόχο ορίζεται πάντα και εκτελείται χωρίςπροβλήματα μέχρι να τερματιστεί ο βρόχος. Επιπλέον, με το βήμα 6, κάθε τέ-τοια επανάληψηπροχωράτουλάχιστον ένακαι γι’ αυτόμε τοβήμα 11 ησυνθήκηεξόδου τελικά ικανοποιείται. Το βήμα 10 δείχνει τότε ότι η μετασυνθήκη απο-δεικνύεται και ο αλγόριθμος λειτουργεί γι’ αυτό το στιγμιότυπο.

Μαθηματική επαγωγή: Η επαγωγή είναι μια εξαιρετικά σημαντική μα-θηματική τεχνική για τηναπόδειξη γενικώνπροτάσεωνκαι αποτελεί τοθε-μέλιο λίθο των επαναληπτικών αλγόριθμων, γι’ αυτό θα τον μελετήσουμεπιο αναλυτικά.

Υπόθεση επαγωγής: Για κάθε n ≥ 0, το S(n) είναι η πρόταση “Εάνο βρόχος δεν έχει τερματιστεί ακόμα, η αναλλοίωτη συνθήκη ισχύειόταν βρίσκεστε στην αρχή του βρόχου, αφού τον έχετε εκτελέσει nφορές”.

Στόχος: Ο στόχος είναι να αποδειχθεί ότι ∀n ≥ 0, S(n), δηλαδή ότι“Όσο ο βρόχος συνεχίζεται, η αναλλοίωτη συνθήκη ισχύει πάντα ότανβρίσκεστε στην αρχή του βρόχου”.

Περίγραμμα απόδειξης: Απόδειξη με επαγωγή στο n.

Βασική περίπτωση: Η απόδειξη του S(0) περιλαμβά-νει την απόδειξη ότι η αναλλοίωτη συνθήκη ισχύει όταν οαλγόριθμος φτάνει για πρώτη φορά στην αρχή του βρό-χου. Αυτό επιτυγχάνεται με την απόδειξη της πρότασης⟨προσυνθήκη⟩&κώδικαςπρο βρόχου ⇒ ⟨αναλλοίωτη συνθήκη⟩.

Βήμα επαγωγής: Η απόδειξη του S(n1) ⇒ S(n) πε-ριλαμβάνει την απόδειξη ότι η αναλλοίωτη συνθήκη διατη-ρείται. Αυτό επιτυγχάνεται με την απόδειξη της πρότασης

⟨αναλλοίωτη συνθήκη′⟩&not⟨συνθήκη εξόδου⟩& κώδικαςβρόχος ⇒

⟨αναλλοίωτη συνθήκη′′.

Συμπέρασμα: Μέσω επαγωγής, μπορούμε να συμπεράνουμεότι ∀n ≥ 0, S(n), δηλαδή ότι η αναλλοίωτη συνθήκη ισχύει πά-ντα στην αρχή του βρόχου.

Η διαδικασία της επαγωγής:

Page 36: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t26ΚΕΦΑΛΑΙΟ 1. ΕΠΑΝΑΛΗΠΤΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ: ΜΕΤΡΑ ΠΡΟΟΔΟΥ ΚΑΙ

ΑΝΑΛΛΟΙΩΤΕΣ ΣΥΝΘΗΚΕΣ

ΤοS(0) ισχύει (με τη βασική περίπτωση)

S(0) ⇒ S(1) (με το βήμα επαγωγής, n = 1)

επομένως, τοS(1) ισχύει

S(1) ⇒ S(2) (με το βήμα επαγωγής, n = 2)

επομένως, τοS(2) ισχύει

S(2) ⇒ S(3) (με το βήμα επαγωγής, n = 3)

επομένως, τοS(3) ισχύει...

Άλλες τεχνικές απόδειξης: Άλλα επίσημη βήματα που ακολουθούνταιγια την απόδειξη της ορθότητας περιγράφονται στο Κεφάλαιο 28.

Πίστη στη μέθοδο:Μπορείτε να είστε βέβαιοι ότι αυτά ταβήματααρκούν γιατον ορισμό ενός αλγόριθμου και να μην αναρωτιέστε κάθεφορά που πρέπει νασχεδιάσετε έναν αλγόριθμο.

1.4 Διαφορετικοί τύποι επαναληπτικών αλγό-ριθμων

Για τη σχεδίαση ενός μέτρου προόδου και μιας αναλλοίωτης συνθήκης για τον αλ-γόριθμό σας, δείτε μερικούς κλασικούς τύπους που μπορείτε να χρησιμοποιήσετε,καθώς και παραδείγματα κάθε τύπου.Περισσότερα για την έξοδο: Εάν η λύση είναι μια δομή που αποτελείται από

πολλά κομμάτια (π.χ., ένας πίνακας ακεραίων, ένα σύνολο ή μια διαδρομή), το φυ-σικό θα ήταν να κατασκευάζατε τη λύση κατά κομμάτια, ένα κάθε φορά.

Μέτρο προόδου: Η ποσότητα της εξόδου που κατασκευάζετε.Αναλλοίωτη συνθήκη: Ηέξοδος που έχετε κατασκευάσει μέχρι τώρα είναι

σωστή.

Περισσότερα για την είσοδο: Έστω ότι η είσοδος αποτελείται από n αντικεί-μενα (π.χ., έναν πίνακα με n ακέραιους ή έναν γράφο με n κόμβους). Το λογικό γιατον αλγόριθμο θα ήταν να τους διαβάζει έναν κάθε φορά.

Μέτρο προόδου: Η ποσότητα της εισόδου που εξετάζεται.Αναλλοίωτη συνθήκη: Εάν θεωρήσω ότι αυτό το πρόθεμα της εισόδου εί-

ναι ολόκληρη η είσοδος, έχω μια ολοκληρωμένη λύση.Παραδείγματα: Μετά από i επαναλήψεις του προηγούμενου αλγόριθμου

δύο δαχτύλων για την εύρεση του μέγιστου, το αριστερό δάχτυλο δείχνει τηνυψηλότερη βαθμολογία στο πρόθεμα της λίστας που έχει εξεταστεί μέχρι τώρα.

Page 37: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t1.4. ΔΙΑΦΟΡΕΤΙΚΟΙ ΤΥΠΟΙ ΕΠΑΝΑΛΗΠΤΙΚΩΝΑΛΓΟΡΙΘΜΩΝ 27

Εικόνα 1.2: Δείτε τις αναλλοίωτες συνθήκες για την ταξινόμηση ένθεσης και τηνταξινόμηση επιλογής.

148.png

Είσοδος Ταξινόμηση επιλογής Ταξινόμηση ένθεσης Έξοδος

Μετάαπό iεπαναλήψειςμιαςεκδοχήςτηςταξινόμησηςένθεσης, ταξινομούνταιτα πρώτα i στοιχεία της εισόδου. Βλ. Εικόνα 1.2.

Λάθος αναλλοίωτη συνθήκη: Ένα συνηθισμένο σφάλμα είναι να δώσετε τηναναλλοίωτη συνθήκη “Έχω χειριστεί και έχω μια λύση για καθένα από τα πρώταi αντικείμενα της εισόδου”. Αυτό είναι λάθος επειδή κάθε αντικείμενο της εισό-δου δεν χρειάζεται μια ξεχωριστή λύση, αλλά πρέπει να υπάρχει μία λύση γιατην είσοδο ως σύνολο. Για παράδειγμα, στον αλγόριθμο δύο δαχτύλων για τηνεύρεση του μέγιστου, δεν μπορούμε να γνωρίζουμε αν ένα στοιχείο είναι το μέ-γιστο αν το εξετάσουμε απομονωμένο από τα άλλα στοιχεία. Ένα στοιχείο θεω-ρείται μέγιστο μόνο αν συγκριθεί με τα άλλα στοιχεία της λίστας.

Περιορισμός του χώρου αναζήτησης: Εάν ψάχνετε κάτι, δοκιμάστε να περιο-ρίσετε το χώρο αναζήτησης, ίσως μειώνοντάς τον κατά ένα, ή ακόμα καλύτερα, κό-βοντάς τον στη μέση.

Μέτροπροόδου: Τομέγεθος τουχώρουόπουέχετεπεριορίσει τηναναζήτηση.Αναλλοίωτη συνθήκη: Εάν αυτό πουψάχνετε είναι οπουδήποτε, τότε είναι

σ’ αυτήν την περιορισμένη λίστα.

Page 38: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t28ΚΕΦΑΛΑΙΟ 1. ΕΠΑΝΑΛΗΠΤΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ: ΜΕΤΡΑ ΠΡΟΟΔΟΥ ΚΑΙ

ΑΝΑΛΛΟΙΩΤΕΣ ΣΥΝΘΗΚΕΣ

Παράδειγμα: Δυαδική αναζήτηση.Το έργο που έχει ολοκληρωθεί: Το μέτρο προόδου μπορεί να είναι επίσης κάποιαάλλη πιο δημιουργική συνάρτηση του έργου που έχει ολοκληρωθεί μέχρι τώρα.

Παράδειγμα: Η ταξινόμηση φυσαλίδας μετρά την πρόοδό της από τα ζεύγηστοιχείων που βρίσκονται εκτός σειράς.

Ανάλυση περίπτωσης: Δοκιμάστε το προφανές. Για ποια στιγμιότυπα εισόδουλειτουργεί και για ποια δεν λειτουργεί; Τώρα, αρκεί να βρείτε έναν αλγόριθμο πουλειτουργεί για τις τελευταίες περιπτώσεις. Ένα μέτρο προόδου μπορεί να περιλαμ-βάνει τις περιπτώσεις που έχετε δοκιμάσει.Θα παραθέσουμε τώρα μερικά απλά παραδείγματα για κάθε περίπτωση. Μολο-

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

ΠΑΡΑΔΕΙΓΜΑ 1.4.1 Περισσότερα για την έξοδο — Ταξινόμηση επιλογής

1. Προδιαγραφές: Οστόχος είναι να αναδιοργανωθεί μια λίστα μεn τιμές σε μηφθίνουσα σειρά.

2. Βασικά βήματα: Θα επιλέγουμε επανειλημμένα το μικρότερο μη επιλεγμένοστοιχείο.

3. Μέτρο προόδου: Το μέτρο προόδου είναι ο αριθμός k των στοιχείων πουέχουν επιλεχθεί.

4. Η αναλλοίωτη συνθήκη: Ηαναλλοίωτη συνθήκη δηλώνει ότι τα επιλεγμέναστοιχεία είναι τα k μικρότερα από όλα τα στοιχεία και ότι αυτά έχουν ταξινομη-θεί. Τα μεγαλύτερα στοιχεία βρίσκονται σε ένα παράπλευρο σύνολο.

5. Κύρια βήματα: Το κύριο βήμα είναι να βρεθεί το μικρότερο στοιχείο μεταξύεκείνων που βρίσκονται στο σύνολο των μεγαλύτερων στοιχείων που απομέ-νουν και να προστεθεί αυτό το στοιχείο που επιλέγεται τώρα στο τέλος της τα-ξινομημένης λίστας στοιχείων.

6. Πρόοδος: Γίνεται πρόοδος επειδή το k αυξάνεται.

7. Διατήρηση αναλλοίωτης συνθήκης: Πρέπει να αποδείξουμε

ότι ⟨αναλλοίωτη συνθήκη′⟩ & not ⟨συνθήκη εξόδου⟩ & βρόχος ⇒

⟨αναλλοίωτη συνθήκη′′⟩. Με την προηγούμενη αναλλοίωτη συνθήκη, το

στοιχείο που επιλέχθηκε τώρα έχει τουλάχιστον το μέγεθος των στοιχείωνπου είχαν επιλεχθεί προηγουμένως και δεν είναι μεγαλύτερο από τα διπλανάστοιχεία. Επομένως, πρέπει να είναι το k + 1-οστό στοιχείο στη λίστα, γι’ αυτόκαι η μετακίνηση αυτού του στοιχείου στο τέλος της ταξινομημένης λίστας

Page 39: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t1.4. ΔΙΑΦΟΡΕΤΙΚΟΙ ΤΥΠΟΙ ΕΠΑΝΑΛΗΠΤΙΚΩΝΑΛΓΟΡΙΘΜΩΝ 29

εξασφαλίζει ότι τα επιλεγμένα στοιχεία στη νέα λίστα είναι τα k + 1 μικρότερακαι ότι είναι ταξινομημένα.

8. Επαλήθευση της αναλλοίωτης συνθήκης: Πρέπει να αποδείξουμε ότι⟨προσυνθήκη⟩&κώδικαςπρο βρόχου ⇒ ⟨αναλλοίωτη συνθήκη⟩. Αρχικά, ταξινομη-μένα είναι k = 0 και όλα τα στοιχεία βρίσκονται στην άκρη.

9. Συνθήκη εξόδου: Θα διακοπεί όταν k = n.

10. Τέλος: Πρέπει να αποδείξουμε ότι ⟨αναλλοίωτη συνθήκη⟩& ⟨συνθήκη εξόδου⟩& κώδικαςμετά βρόχου ⇒ ⟨μετασυνθήκη⟩. Μέχρι τη συνθήκη εξόδου έχουν επι-λεχθεί όλα τα στοιχεία και μέχρι την αναλλοίωτη συνθήκη έχουν ταξινομηθείαυτά τα επιλεγμένα στοιχεία.

11. Τερματισμός και χρόνος εκτέλεσης: Δεν έχουμε ελέγξει πόσος χρόνοςχρειάζεται για να βρεθεί το επόμενο μικρότερο στοιχείο ή για να γίνει η επε-ξεργασία των δομών δεδομένων.

ΠΑΡΑΔΕΙΓΜΑ 1.4.2 Περισσότερα για την είσοδο – Ταξινόμηση ένθεσης

1. Προδιαγραφές: Ο στόχος και πάλι είναι να αναδιοργανωθεί μια λίστα με nτιμές σε μη φθίνουσα σειρά.

2. Βασικά βήματα: Αυτή τηφοράθαπραγματοποιήσουμε επαναλαμβανόμενεςεισαγωγές στοιχείων εκεί όπου ανήκουν.

3. Μέτρο προόδου: Το μέτρο προόδου είναι ο αριθμός k των στοιχείων που ει-σάγονται.

4. Η αναλλοίωτη συνθήκη: Η αναλλοίωτη συνθήκη δηλώνει ότι τα k εισαχθέ-ντα στοιχεία ταξινομούνται σε μια λίστα και ότι όπως προηγουμένως, τα στοι-χεία που απομένουν παρακάμουν κάπου στην άκρη.

5. Βασικά βήματα: Το κύριο βήμα είναι να πάρουμε οποιοδήποτε από τα στοι-χεία που βρίσκονται στην άκρη και να τα εισάγουμε στην ταξινομημένη λίστα,στη θέση όπου ανήκουν.

6. Πρόοδος: Γίνεται πρόοδος επειδή το k αυξάνεται.

7. Διατήρηση αναλλοίωτης συνθήκης: ⟨αναλλοίωτη συνθήκη′⟩ & not

⟨συνθήκη εξόδου⟩ & κώδικαςβρόχος ⇒ αναλλοίωτη συνθήκη′′. Γνωρίζετε ότι η

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

Page 40: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t30ΚΕΦΑΛΑΙΟ 1. ΕΠΑΝΑΛΗΠΤΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ: ΜΕΤΡΑ ΠΡΟΟΔΟΥ ΚΑΙ

ΑΝΑΛΛΟΙΩΤΕΣ ΣΥΝΘΗΚΕΣ

8. Επαλήθευση της αναλλοίωτης συνθήκης: Αρχικά, με k = 1, σκεφτείτε ότιτο πρώτο στοιχείο στον πίνακα είναι μια ταξινομημένη λίστα μεγέθους ένα.

9. Συνθήκη εξόδου: Θα διακοπεί όταν k = n.

10. Τέλος: ⟨αναλλοίωτη συνθήκη⟩ & ⟨συνθήκη εξόδου⟩ & κώδικαςμετά βρόχου ⇒⟨μετασυνθήκη⟩. Μέχρι τη συνθήκη εξόδου έχουν εισαχθεί όλα τα στοιχεία καιμέχρι την αναλλοίωτη συνθήκη έχουν ταξινομηθεί τα στοιχεία που εισήχθη-σαν.

11. Τερματισμός και χρόνος εκτέλεσης: Δεν έχουμε ελέγξει πόσος χρόνοςχρειάζεται για να γίνει εισαγωγή του στοιχείου ή για να γίνει επεξεργασία τωνδομών δεδομένων.

ΠΑΡΑΔΕΙΓΜΑ 1.4.3Περιορισμός τουχώρουαναζήτησης—Δυαδικήαναζή-τηση

1. Προδιαγραφές: Ένα στιγμιότυπο εισόδου αποτελείται από μια ταξινομημένηλίσταA[1..n] στοιχείων και ένα κλειδί αναζήτησης. Τα στοιχεία μπορεί να επα-ναλαμβάνονται. Εάν το κλειδί βρίσκεται στη λίστα, τότε η έξοδος αποτελείταιαπό ένα δείκτη i, ώστε A[i] = κλειδί. Εάν το κλειδί δεν βρίσκεται στη λίστα,τότε η έξοδος κάνει αναφορά σ’ αυτό το γεγονός.

2. Βασικά βήματα: Συνεχίστε να κόβετε στη μέση το χώρο αναζήτησης στονοποίο μπορεί βρίσκεται το κλειδί.

3. Η αναλλοίωτη συνθήκη: Ο αλγόριθμος διατηρεί μια υπολίσταA[i..j], ώστεαν το κλειδί περιέχεται στην αρχική λίστα A[1..n], τότε περιέχεται σ’ αυτήν τημικρότερη υπολίστα. (Εάν το στοιχείο επαναλαμβάνεται, τότε μπορεί να βρί-σκεται εκτός υπολίστας.)

4. Μέτρο προόδου: Το μέτρο προόδου είναι ο αριθμός των στοιχείων στην υπο-λίστα σας, δηλαδή j − i+ 1.

5. Κύρια βήματα: Κάθε επανάληψη συγκρίνει το κλειδί με το στοιχείο που βρί-σκεταιστοκέντροτηςυπολίσταςκαιαυτόκαθορίζεισεποιομισότηςυπολίσταςδεν βρίσκεται το κλειδί και επομένως, ποιο μισό πρέπει να παραμείνει. Πιο επί-σημα, τοmid θα είναι ο δείκτης που θα υποδεικνύει το στοιχείο που βρίσκεταιστο κέντρο της τρέχουσας υπολίσταςA[i..j]. Εάν κλειδί ≤ A[mid], τότε η υπο-λίσταπεριορίζεται στοA[i..mid], διαφορετικά, περιορίζεται στοA[mid+1..j].

6. Πρόοδος: Το μέγεθος της υπολίστας μειώνεται στο μισό.

Page 41: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t1.4. ΔΙΑΦΟΡΕΤΙΚΟΙ ΤΥΠΟΙ ΕΠΑΝΑΛΗΠΤΙΚΩΝΑΛΓΟΡΙΘΜΩΝ 31

7. Διατήρηση αναλλοίωτης συνθήκης: ⟨αναλλοίωτη συνθήκη′⟩ & not

⟨συνθήκη εξόδου⟩ & κώδικαςβρόχος ⇒ ⟨αναλλοίωτη συνθήκη′′⟩. Η προηγού-

μενη αναλλοίωτη συνθήκη συνεπάγεται ότι η αναζήτηση περιορίζεται στηνυπολίστα A[i..j]. Εάν i > A[mid], τότε επειδή η λίστα είναι ταξινομημένη,γνωρίζουμε ότι το κλειδί δεν βρίσκεται στο A[1..mid] και επομένως, αυτάτα στοιχεία μπορούν να απομακρυνθούν, περιορίζοντας έτσι την αναζήτησηστο διάστημα A[mid + 1..j]. Ομοίως, αν ισχύει ότι κλειδί < A[mid]. Εάνkey = A[mid], τότε θα μπορούσαμε να αναφέρουμε ότι το κλειδί βρέθηκε.Ωστόσο, η αναλλοίωτη συνθήκη διατηρείται επίσης αν περιορίσουμε τηναναζήτηση στην περιοχήA[i..mid].

8. Επαλήθευση της αναλλοίωτης συνθήκης: ⟨προσυνθήκη⟩& κώδικαςπρο βρόχου ⇒ ⟨αναλλοίωτη συνθήκη⟩. Αρχικά, παίρνετε την αναλλοί-ωτη συνθήκη εξετάζοντας ολόκληρη τη λίστα ως υπολίστα. Προφανώς, αν τοκλειδί βρίσκεται σε ολόκληρη τη λίστα, θαβρίσκεται επίσης και στηνυπολίστα.

9. Συνθήκη εξόδου: Βγαίνουμε από το βρόχο αν η υπολίστα περιέχει ένα (ή μη-δέν) στοιχεία.

10. Τέλος: ⟨αναλλοίωτη συνθήκη⟩ & συνθήκη εξόδου & κώδικαςμετά βρόχου ⇒⟨μετασυνθήκη⟩. Μέχρι τη συνθήκη εξόδου, η υπολίστα μας περιέχει τοπολύ ένα στοιχεία και μέχρι την αναλλοίωτη συνθήκη, αν το κλειδί περιέχεταιστην αρχική λίστα, τότε περιέχεται σ’ αυτήν την υπολίστα, δηλαδή πρέπεινα είναι αυτό το συγκεκριμένο στοιχείο. Κατά συνέπεια, ο τελικός κώδικαςελέγχει αν αυτό το συγκεκριμένο στοιχείο είναι το κλειδί. Εάν είναι, τότεεπιστρέφεται ο δείκτης του, αλλά αν δεν είναι, ο αλγόριθμος αναφέρει ότι τοκλειδί δεν βρίσκεται στη λίστα.

11. Τερματισμός και χρόνος εκτέλεσης: Τα μεγέθη των υπολιστών είναι περί-που n, n

2 ,n4 ,

n8 ,

n16 , . . . , 8, 4, 2, 1. Κατά συνέπεια, χρειάζεται να γίνουν μόνο

Θ(log n) διαιρέσεις στη μέση. Κάθε διαίρεση στη μέση διαρκείO(1) και ο τε-λικός χρόνος είναιΘ(log n).

12. Ειδικές περιπτώσεις: Μια ειδική περίπτωση που πρέπει να εξεταστεί είναιόταν το κλειδί δεν περιέχεται στην αρχική λίσταA[1..n]. Σημειώστε ότι η αναλ-λοίωτησυνθήκη λαμβάνει προσεκτικά υπόψη τηςαυτήν τηνπερίπτωση. Οαλ-γόριθμος θα περιορίσει την υπολίστα σε ένα (ή κανένα) στοιχείο. Το αντίθετοτης αναλλοίωτης συνθήκης συνεπάγεται τότε ότι αν το κλειδί δεν περιέχεται σ’αυτήν την περιορισμένη υπολίστα, τότε το κλειδί δεν θα περιέχεται ούτε στηναρχική λίσταA[1..n].

13. Κωδικοποίηση και λεπτομέρειες υλοποίησης: Εκτός από τον έλεγχο ανκλειδί ≤ A[mid], κάθε επανάληψη θα μπορούσε να ελέγχει αν το A[mid] εί-

Page 42: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t32ΚΕΦΑΛΑΙΟ 1. ΕΠΑΝΑΛΗΠΤΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ: ΜΕΤΡΑ ΠΡΟΟΔΟΥ ΚΑΙ

ΑΝΑΛΛΟΙΩΤΕΣ ΣΥΝΘΗΚΕΣ

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

1.4.4 Η εργασία ολοκληρώθηκε – Ταξινόμηση φυσαλίδας

1. Προδιαγραφές: Οστόχος είναι να αναδιοργανωθεί μια λίστα μεn τιμές σε μηφθίνουσα σειρά.

2. Βασικά βήματα: Αντιμεταθέστε στοιχεία που βρίσκονται εκτός σειράς.

3. Μέτροπροόδου: Ενέλιξη είναι ένα ζεύγοςστοιχείωνπουβρίσκονται εκτόςσει-ράς, δηλαδή ένα ζεύγος i, j όπου 1 ≤ i < j ≤ n, A[i] > A[j]. Το μέτρο προό-δου μας θα είναι ο αριθμός των ενελίξεων στην τρέχουσα σειρά των στοιχείων.Για παράδειγμα, στο [1, 2, 5, 4, 3, 6], υπάρχουν τρεις ενελίξεις.

4. Η αναλλοίωτη συνθήκη: Η αναλλοίωτη συνθήκη είναι σχετικά ασθενής καιδηλώνει μόνο ότι έχουμε μια αντιμετάθεση των αρχικών στοιχείων εισόδου.

5. Κύρια βήματα: Το κύριο βήμα είναι η εύρεση δύο γειτονικών στοιχείων πουβρίσκονται εκτός σειράς και η αντιμετάθεσή τους.

6. Πρόοδος: Ένα τέτοιο βήμα μειώνει των αριθμό των ενελίξεων κατά μία.

7. Διατήρηση αναλλοίωτης συνθήκης: ⟨αναλλοίωτη συνθήκη′⟩ & not

⟨συνθήκη εξόδου⟩ & κώδικαςβρόχος ⇒ ⟨αναλλοίωτη συνθήκη⟩. Μέχρι την προη-γούμενη αναλλοίωτη συνθήκη είχαμε μια αντιμετάθεση των στοιχείων. Ηαντιμετάθεση ενός ζεύγους στοιχείων δεν το αλλάζει αυτό.

8. Επαλήθευση της αναλλοίωτης συνθήκης: ⟨προσυνθήκη⟩ &κώδικαςπρο βρόχου ⇒ ⟨αναλλοίωτη συνθήκη⟩. Αρχικά, έχουμε μια αντιμετάθεσητων στοιχείων.

9. Συνθήκη εξόδου: Σταματά όταν έχουμε μια ταξινομημένη λίστα των στοι-χείων.

10. Τέλος: ⟨αναλλοίωτη συνθήκη⟩& ⟨συνθήκη εξόδου⟩& κώδικαςμετά βρόχου ⇒⟨μετασυνθήκη⟩. Με την αναλλοίωτη συνθήκη, έχουμε μια αντιμετάθεσητων αρχικών στοιχείων και με τη συνθήκη εξόδου, τα στοιχεία ταξινομούνται.

11. Τερματισμός και χρόνος εκτέλεσης: Αρχικά, το μέτρο προόδου δεν μπορείνα είναι υψηλότεροαπόn(n−1)/2 επειδήαυτός είναι οαριθμός τωνστοιχείωνπου υπάρχουν. Σε κάθε επανάληψη, αυτό το μέτρο μειώνεται κατά ένα. Κατάσυνέπεια, μετά από το πολύ n(n − 1)/2 επαναλήψεις, το μέτρο προόδου έχει

Page 43: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t1.5. ΤΥΠΙΚΑ ΣΦΑΛΜΑΤΑ 33

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

ΑΣΚΗΣΗ 1.4.1 (Δείτε τη λύση στο Μέρος Πέμπτο.) Δώστε τις λεπτομέρειες υλοποίησηςκαι τους χρόνους εκτέλεσης για την ταξινόμηση επιλογής.ΑΣΚΗΣΗ 1.4.2 (Δείτε τη λύση στο Μέρος Πέμπτο.) Δώστε τις λεπτομέρειες υλοποίησης

και τους χρόνους εκτέλεσης για την ταξινόμηση ένθεσης. Η χρήση της δυαδικής αναζήτησηςγια την εύρεση του μικρότερου στοιχείου ή για την εύρεση της θέσης όπου πρέπει να εισαχθείβοηθά; Έχει καμία διαφορά αν τα στοιχεία αποθηκεύονται σε πίνακα ή σε συνδεδεμένη λίστα;ΑΣΚΗΣΗ 1.4.3 (Δείτε τη λύση στο Μέρος Πέμπτο.) Δώστε τις λεπτομέρειες υλοποίησης

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

1.5 Τυπικά σφάλματαΣε μια μελέτη, ζητήθηκε από μια ομάδα πεπειραμένων προγραμματιστών να κωδι-κοποιήσουν τη δυαδική αναζήτηση. Εύκολο, σωστά; Το 80% έκανε λάθος! Υποθέτωότι αν είχαν χρησιμοποιήσει αναλλοίωτεςσυνθήκες, θαείχαναπαντήσει όλοι σωστά.Να είστε σαφείς: Ο κώδικας καθορίζει το τρέχον υποδιάστημα A[i..j] με δύο

ακέραιους i και j. Θα πρέπει να διατυπώνεται με σαφήνεια αν η υπολίστα περιλαμ-βάνει τα ακραία σημεία i και j ή όχι. Δεν έχει σημασία τι από τα δύο συμβαίνει, αλλάεσείς θα πρέπει να είστε ξεκάθαροι. Η σύγχυση σε τέτοιες λεπτομέρειες είναι η αιτίαπολλών προβλημάτων στον κώδικα.Μαθηματικές λεπτομέρειες: Οι μικρές μαθηματικές πράξεις, όπως ο υπολογι-

σμός του δείκτη του κεντρικού στοιχείου του υποδιαστήματος A(i..j) είναι ευάλω-τες σε λάθη. Βεβαιωθείτε μόνοι σας ότι η απάντηση είναιmid = ⌊ i+j

2 ⌋.6) Πρόοδος: Βεβαιωθείτε ότι γίνεται πρόοδος σε κάθε επανάληψη σε κάθε ει-

δική περίπτωση. Για παράδειγμα, στη δυαδική αναζήτηση, όταν η τρέχουσα υπολί-στα έχει άρτιο μήκος, είναι λογικό (όπως κάναμε παραπάνω) να επιλέξουμε ως midτο στοιχείο που βρίσκεται αριστερά από το κέντρο. Είναι επίσης λογικό να συμπερι-λάβουμε το κεντρικό στοιχείο στο δεξί μισό της υπολίστας. Ωστόσο, αυτά σε συν-δυασμό μπορεί να επιφέρουν σφάλμα. Δεδομένης της υπολίσταςA[i..j] = A[3, 4],το κεντρικό στοιχείο θα είναι αυτό που έχει δείκτη 3 και το η δεξιά υπολίστα θα εξα-κολουθεί να είναιA[mid..j] = A[3, 4]. Εάν διατηρηθεί αυτή η υπολίστα, δεν θα γίνεικαμία πρόοδος και ο αλγόριθμος θα επαναλαμβάνεται για πάντα.

Page 44: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t34ΚΕΦΑΛΑΙΟ 1. ΕΠΑΝΑΛΗΠΤΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ: ΜΕΤΡΑ ΠΡΟΟΔΟΥ ΚΑΙ

ΑΝΑΛΛΟΙΩΤΕΣ ΣΥΝΘΗΚΕΣ

7) Διατήρηση αναλλοίωτης συνθήκης: Ηαναλλοίωτησυνθήκηπρέπει να δια-τηρείται σε κάθε ειδική περίπτωση. Για παράδειγμα, στη δυαδική αναζήτηση, είναιλογισμό να ελέγχουμε αν κλειδί < A[mid] ή κλειδί ≥ A[mid]. Είναι επίσης λογικό ηυπολίσταA[i..j] να κοπεί σεA[i..mid] καιA[mid + 1..j]. Ωστόσο, αυτά είναι αιτίεςσφαλμάτων. Όταν το κλειδί και το A[mid] είναι ίσα, ο έλεγχος κλειδί < A[mid] θααποτύχει και ο αλγόριθμος θα θεωρήσει ότι το κλειδί είναι μεγαλύτερο και θα κρα-τήσει το δεξί μισόA[mid+1..j]. Ωστόσο, εδώ έχουμε μια περίπτωση στην οποία τοκλειδί παρακάμπτεται.Απλός βρόχος: Κώδικας όπως «i = 1; while (i ≤ n)A[i] = 0; i = i + 1; end

while» είναι εξαιρετικά ευάλωτος στο σφάλμα της αστοχίας κατά ένα. Η αναλλοί-ωτη συνθήκη «Στην αρχή του βρόχου, το i δείχνει το επόμενο στοιχείο που πρέπει ναυποβληθεί σε επεξεργασία» είναι εξαιρετικά χρήσιμη σε τέτοιες περιπτώσεις.ΑΣΚΗΣΗ 1.5.1 (Δείτε τη λύσηστοΜέροςΠέμπτο.) Έστωότι είστε ο καθηγητής. Ποια από

ταβήματαανάπτυξης ενός επαναληπτικούαλγόριθμουαπότυχε να εκτελέσει σωστάοφοιτητήςστον παρακάτω κώδικα; Πώς θα διορθώνατε το λάθος;αλγόριθμος Eg(I)⟨προσυνθήκη⟩: Το I είναι ακέραιος.⟨μετασυνθήκη⟩: Εξάγει

∑Ij=1 j.

αρχήs = 0

i = 1

while(i ≤ I)

⟨αναλλοίωτη συνθήκη⟩ : Κάθε επανάληψη προσθέτει τονεπόμενο όρο που δίνει s =

∑ij=1 j.

s = s+ i

i = i+ 1

τέλος βρόχουreturn(s)

τέλος αλγόριθμου

1.6 ΑσκήσειςΑΣΚΗΣΗ 1.6.1 Βρίσκεστε στη μέση μιας λίμνης με ακτίνα 1. Μπορείτε να κολυμπήσετε μεταχύτερα 1 και μπορείτε να τρέξετε άπειρα γρήγορα. Υπάρχει ένα μικρό τέρας στην ακτή πουδεν μπορεί να μπει στο νερό, αλλά μπορεί να τρέξει με ταχύτητα 4. Στόχος σας είναι να κο-λυμπήσετε ως την ακτή, να φτάσετε σε ένα σημείο όπου δεν βρίσκεται το τέρας και μετά ναδιαφύγετε. Εάν κολυμπήσετε απευθείας ως την ακτή, θα χρειαστείτε 1 μονάδα χρόνο. Σ’ αυ-τήν τη μονάδα χρόνο, το τέρας θα διανύσει απόσταση Π < 4 ως εκεί που θα φτάσετε και θασας φάει. Η καλύτερη στρατηγική είναι να διατηρήσετε την πλέον προφανή αναλλοίωτη συν-

Page 45: K r i t i k i P u b l i s h i n g - d r a f t · K r i t i k i P u b l i s h i n g - d r a f t Αφιερώνεταιστονπατέραμου,Τζακ,καιτουςγιουςμου,ΤζόσουακαιΜίκα

K r i t

i k i

P u

b l i

s h

i n g

- d

r a f

t1.6. ΑΣΚΗΣΕΙΣ 35

θήκη ενώ αυξάνετε το πλέον προφανές μέτρο προόδου για όσο αυτό είναι δυνατό και μετά νακολυμπήσετε ως εκεί. Περιγράψτε τη λειτουργία.ΑΣΚΗΣΗ 1.6.2Μεέναν μη κατευθυνόμενο γράφοGόπου κάθε κόμβος έχει τουλάχιστον d

+ 1 γείτονες, χρωματίστε κάθε κόμβομε ένααπό ταd+ 1 χρώματα,ώστε για κάθεάκρηκάθε κόμ-βου, οι δύο κόμβοι να έχουν διαφορετικά χρώματα. Υπόδειξη: Μην σκέφτεστε πολύ. Απλώςχρωματίστε τους κόμβους. Ποια είναι η αναλλοίωτη συνθήκη που χρειάζεστε;