L11 · Άπληστοι Αλγόριθμοι I — Χρονοπρογραμματισμός Διαστημάτων
Τι θα δούμε
Ξεκινά μια νέα οικογένεια αλγορίθμων: οι άπληστοι (greedy). Τους συναντήσαμε ήδη στο L09 — Dijkstra, Prim, Kruskal — αλλά εκεί η απληστία ήταν «κρυμμένη» μέσα στο γράφημα. Εδώ τη βλέπουμε γυμνή, σε δύο προβλήματα χρονοπρογραμματισμού:
- Χρονοπρογραμματισμός διαστημάτων — διάλεξε όσο το δυνατόν περισσότερες μη-επικαλυπτόμενες εργασίες.
- Διαμέριση διαστημάτων — μοίρασε όλες τις εργασίες σε όσο το δυνατόν λιγότερες μηχανές.
Η ιδέα του άπληστου αλγορίθμου
Δες την παγίδα να συμβαίνει. Ο πεζοπόρος παρακάτω ακολουθεί έναν και μόνο κανόνα — «κάνε πάντα το βήμα προς τα πάνω» — και δεν βλέπει τίποτα πέρα από τα δύο σημεία δίπλα στα πόδια του. Άλλαξε την αφετηρία και δες πού καταλήγει:
Ίδιος κανόνας («κάνε το βήμα προς τα πάνω»), διαφορετική αφετηρία. Διάλεξε αφετηρία και πάτα «Επόμενο».
Ίδιος κανόνας, διαφορετική κατάληξη: άλλοτε η κορυφή, άλλοτε ένας λοφίσκος. Κι ο πεζοπόρος δεν μαθαίνει ποτέ τη διαφορά — από εκεί που στέκεται, ο λοφίσκος μοιάζει με κορυφή. Αυτός είναι ο άπληστος αλγόριθμος σε μία εικόνα. Γι' αυτό δεν αρκεί να βρεις έναν κανόνα που «δείχνει λογικός»· πρέπει να τον αποδείξεις. Θα ξεκινήσουμε δείχνοντας ότι οι περισσότεροι λογικοφανείς κανόνες απλώς δεν δουλεύουν.
Χρονοπρογραμματισμός διαστημάτων
Διατύπωση
Είσοδος: εργασίες· η εργασία ξεκινά τη στιγμή και τελειώνει τη στιγμή .
Δύο εργασίες είναι συμβατές αν δεν επικαλύπτονται χρονικά.
Στόχος: βρες το μεγαλύτερο σε πλήθος υποσύνολο εργασιών που είναι ανά δύο συμβατές.
Το άπληστο πρότυπο — και ποια σειρά
Όλοι οι υποψήφιοι άπληστοι αλγόριθμοι έχουν την ίδια σκελετική μορφή:
Θεώρησε τις εργασίες σε κάποια σειρά. Διάλεξε κάθε εργασία εφόσον είναι συμβατή με όσες έχεις ήδη επιλέξει.
Όλο το παιχνίδι είναι ποια σειρά. Τέσσερις λογικοφανείς υποψήφιες:
| Κριτήριο | Σειρά εξέτασης |
|---|---|
| Μικρότερος χρόνος έναρξης | αύξουσα ως προς |
| Μικρότερος χρόνος λήξης | αύξουσα ως προς |
| Μικρότερο διάστημα | αύξουσα ως προς |
| Λιγότερες διενέξεις | αύξουσα ως προς το πλήθος μη-συμβατών |
Τρεις από τις τέσσερις είναι λάθος. Στο εργαλείο παρακάτω, κάθε κριτήριο έρχεται με το δικό του στιγμιότυπο: για τα τρία λανθασμένα κριτήρια είναι ένα αντιπαράδειγμα — μια είσοδος όπου ο κανόνας αποδεδειγμένα αποτυγχάνει· για το σωστό, μια είσοδος που τη λύνει τέλεια. Διάλεξε κριτήριο και σάρωσε βήμα-βήμα:
Εξέταση με σειρά: αύξουσα σειρά χρόνου έναρξης. Ο αριθμός αριστερά από κάθε γραμμή είναι η σειρά εξέτασης.
Γιατί τα τρία κριτήρια αποτυγχάνουν
Κάθε ένα από τα τρία λανθασμένα κριτήρια έχει ένα μικρό, καθαρό αντιπαράδειγμα — κι αυτό ακριβώς δείχνει η αντίστοιχη καρτέλα του εργαλείου παραπάνω.
Μικρότερος χρόνος έναρξης. Στην καρτέλα «Πρώτη έναρξη», μία εργασία ξεκινά πρώτη απ' όλες και απλώνεται σχεδόν σε ολόκληρο τον άξονα. Επειδή ξεκινά πρώτη, ο κανόνας τη διαλέγει αμέσως — και τότε αυτή επικαλύπτεται με καθεμία από τις τέσσερις σύντομες εργασίες, που από μόνες τους θα χωρούσαν άνετα όλες μαζί. Λύση: 1 αντί για 4. Το πότε ξεκινά μια εργασία δεν λέει τίποτα για το πόσο χώρο αφήνει στις επόμενες.
Μικρότερο διάστημα. Στην καρτέλα «Μικρότερο διάστημα», η συντομότερη εργασία «κάθεται» ακριβώς πάνω στο σημείο όπου δύο μεγαλύτερες εργασίες σχεδόν αγγίζονται. Οι δύο μεγάλες είναι μεταξύ τους συμβατές — αλλά η σύντομη επικαλύπτεται και με τις δύο, οπότε διαλέγοντάς τη τις χάνεις αμφότερες. Λύση: 1 αντί για 2. Μικρή διάρκεια δεν σημαίνει «μικρό εμπόδιο».
Λιγότερες διενέξεις. Το πιο ύπουλο από τα τρία. Στην καρτέλα «Λιγότερες διενέξεις», η βέλτιστη λύση είναι οι τέσσερις εργασίες της πάνω σειράς. Όμως οι δύο μεσαίες της σειράς συγκρούονται με πολλές γειτονικές, άρα ο κανόνας τις αφήνει για το τέλος. Διαλέγει πρώτα τις εργασίες με τις «λίγες» συγκρούσεις — κι ανάμεσά τους μία εργασία που, ενώ μετράει λίγες διενέξεις, στέκεται σ' ένα σταυροδρόμι και μπλοκάρει ταυτόχρονα δύο εργασίες της βέλτιστης λύσης. Λύση: 3 αντί για 4. Το να συγκρούεσαι με λίγες εργασίες δεν σημαίνει ότι δεν είσαι εσύ το κρίσιμο εμπόδιο.
Το κριτήριο που δουλεύει: μικρότερος χρόνος λήξης
- Είσοδος:
- n εργασίες, η καθεμία με χρόνο έναρξης sⱼ και λήξης fⱼ
- Έξοδος:
- το μεγαλύτερο σε πλήθος σύνολο ανά δύο συμβατών εργασιών
Με λόγια. Ταξινόμησε τις εργασίες ώστε ο χρόνος λήξης να αυξάνει. Σάρωσέ τες με τη σειρά: κράτα την επόμενη εργασία αν δεν συγκρούεται με ό,τι έχεις ήδη επιλέξει. Επειδή σαρώνεις κατά χρόνο λήξης, αρκεί να θυμάσαι μόνο την τελευταία εργασία που μπήκε — η νέα είναι συμβατή με όλες τις προηγούμενες ακριβώς όταν ξεκινά μετά τη λήξη της τελευταίας.
Πολυπλοκότητα. Η ταξινόμηση κοστίζει · η σάρωση είναι με ανά εργασία. Σύνολο .
Ορθότητα — «ο άπληστος προηγείται»
Απόδειξη (εις άτοπον). Έστω οι εργασίες που επιλέγει ο άπληστος, σε σειρά. Έστω μια βέλτιστη λύση — και μάλιστα διαλεγμένη έτσι ώστε να συμφωνεί με τον άπληστο για όσο το δυνατόν περισσότερες αρχικές εργασίες: για τη μέγιστη δυνατή τιμή του .
Αν ο άπληστος δεν είναι βέλτιστος, τότε . Θα φτάσουμε σε άτοπο.
Βήμα 1 — ο άπληστος «προηγείται». Ισχυρισμός: . Γιατί; Αφού , η εργασία είναι συμβατή με την — άρα ήταν υποψήφια τη στιγμή που ο άπληστος διάλεγε την . Και ο άπληστος επιλέγει πάντα την υποψήφια με τον μικρότερο χρόνο λήξης. Άρα η δεν τελειώνει αργότερα από την .
Βήμα 2 — η ανταλλαγή. Φτιάχνουμε νέα λύση αντικαθιστώντας στη βέλτιστη την με την :
Είναι έγκυρη: η είναι συμβατή με τις (αυτές είναι οι , και ο άπληστος την επέλεξε δίπλα τους)· και επειδή , η τελειώνει όχι αργότερα από την , οπότε δεν συγκρούεται ούτε με την . Το έχει εργασίες — άρα είναι κι αυτό βέλτιστο — αλλά συμφωνεί με τον άπληστο για εργασίες. Αντίφαση με τη μεγιστότητα του .
Μένει η περίπτωση : τότε υπάρχει η , συμβατή με την — και ο άπληστος δεν θα είχε σταματήσει, θα την είχε εξετάσει. Άτοπο. Άρα .
Η ανταλλαγή είναι η καρδιά της απόδειξης — και γίνεται πολύ πιο καθαρή όταν τη δεις να εκτελείται. Πάνω η λύση του άπληστου, κάτω μια βέλτιστη· σε κάθε θέση πρόσεξε την ανισότητα — «ο άπληστος δεν τελειώνει ποτέ αργότερα» — και μετά την ανταλλαγή που ξαναγράφει τη βέλτιστη μία εργασία πιο κοντά στον άπληστο, ώσπου οι δύο λύσεις να ταυτιστούν:
Πάνω: ο άπληστος. Κάτω: μια βέλτιστη λύση. Μπλε = θέσεις όπου ήδη συμφωνούν.
Διαμέριση διαστημάτων
Διατύπωση
Αλλάζουμε ριζικά το ερώτημα. Τώρα πρέπει να προγραμματίσουμε όλες τις εργασίες — αλλά έχουμε πολλές μηχανές.
Στόχος: βρες το ελάχιστο πλήθος μηχανών ώστε κάθε εργασία να ανατεθεί σε μία μηχανή, με δύο εργασίες που τρέχουν ταυτόχρονα ποτέ στην ίδια μηχανή.
Το κάτω φράγμα — το βάθος
Αν σε κάποια στιγμή τρέχουν ταυτόχρονα εργασίες, αυτές χρειάζονται διαφορετικές μηχανές — αναγκαστικά. Άρα κάθε λύση, όσο έξυπνη κι αν είναι, χρειάζεται:
Το βάθος είναι πιο εύκολο να το δεις παρά να το ορίσεις: πέρνα μια κατακόρυφη γραμμή σάρωσης πάνω από τον χρόνο και μέτρα πόσες εργασίες κόβει σε κάθε στιγμή — η μεγαλύτερη τιμή που θα συναντήσει είναι το βάθος. Ξεκίνα με τη λειτουργία «Βάθος» του εργαλείου· κράτησέ το ανοιχτό, θα το χρειαστούμε ξανά αμέσως μετά:
Κόκκινο = εργασία που τρέχει τη στιγμή της σάρωσης.
Το ερώτημα τώρα: μπορούμε πάντα να πετύχουμε ακριβώς το βάθος — ή μήπως υπάρχουν στιγμιότυπα που απαιτούν περισσότερες μηχανές απ' όσο το βάθος τους;
Ο άπληστος αλγόριθμος
- Είσοδος:
- n εργασίες με χρόνους έναρξης και λήξης
- Έξοδος:
- το ελάχιστο πλήθος μηχανών, και η ανάθεση εργασιών σε μηχανές
Με λόγια. Ταξινόμησε τις εργασίες κατά αύξοντα χρόνο έναρξης. Πάρε τες με τη σειρά: αν υπάρχει ήδη ανοιγμένη μηχανή που είναι ελεύθερη τη στιγμή που η εργασία ξεκινά, ανάθεσέ τη εκεί· αν όχι, άνοιξε μια νέα μηχανή.
Γύρνα τώρα τον διακόπτη του εργαλείου παραπάνω στη λειτουργία «Άπληστος» και δες τον αλγόριθμο να τρέχει σ' αυτό ακριβώς το στιγμιότυπο — εργασία την εργασία, μηχανή τη μηχανή. Πρόσεξε ιδιαίτερα τη στιγμή που ανοίγει η τρίτη μηχανή.
Ορθότητα — το επιχείρημα του βάθους
Πρώτα, ο αλγόριθμος δίνει έγκυρη λύση: αναθέτει εργασία σε μηχανή μόνο όταν είναι συμβατή με ό,τι υπάρχει ήδη εκεί, άρα ποτέ δύο συγκρουόμενες εργασίες μαζί. Μένει να δείξουμε ότι χρησιμοποιεί ελάχιστες μηχανές.
Απόδειξη. Έστω το πλήθος μηχανών που άνοιξε ο αλγόριθμος. Η τελευταία μηχανή, η -οστή, άνοιξε επειδή κάποια εργασία — έστω η — δεν ήταν συμβατή με καμία από τις μηχανές που ήδη υπήρχαν.
Άρα, τη στιγμή που εξετάστηκε η , καθεμία από τις μηχανές είχε τουλάχιστον μία εργασία σε σύγκρουση με την . Επειδή ο αλγόριθμος εξετάζει τις εργασίες κατά αύξοντα χρόνο έναρξης, όλες αυτές οι εργασίες ξεκίνησαν πριν την — και αφού συγκρούονται με την , καμία τους δεν έχει τελειώσει μέχρι την .
Συνεπώς, τη χρονική στιγμή λίγο μετά την τρέχουν ταυτόχρονα εργασίες — οι συν την . Άρα το βάθος είναι .
Αλλά κάθε λύση χρειάζεται μηχανές, και ο άπληστος χρησιμοποιεί ακριβώς . Άρα είναι βέλτιστος.
Αυτό ακριβώς ανάβει κόκκινο στο εργαλείο τη στιγμή που ανοίγει η τρίτη μηχανή: η κατακόρυφη γραμμή δείχνει τρεις εργασίες να τρέχουν μαζί. Το βάθος «αποκαλύφθηκε» μέσα από την ίδια την εκτέλεση του αλγορίθμου — δεν χρειάστηκε καν ξεχωριστή σάρωση για να το βρούμε.
Κλείδωσε τη γνώση
Βάλε στη σειρά τα βήματα του χρονοπρογραμματισμού διαστημάτων:
Και συμπλήρωσε τα κενά:
Μοτίβο σκέψης
Τι μάθαμε
Τι κρατάμε από αυτή τη διάλεξη
- Άπληστος αλγόριθμος — χτίζει λύση σταδιακά, κάθε βήμα τοπικά βέλτιστο. Το δύσκολο δεν είναι ο κανόνας, είναι η απόδειξη.
- Χρονοπρογραμματισμός διαστημάτων — μέγιστο πλήθος συμβατών εργασιών. Σωστό κριτήριο: μικρότερος χρόνος λήξης. .
- Τα κριτήρια «μικρότερη έναρξη», «μικρότερο διάστημα», «λιγότερες διενέξεις» αποτυγχάνουν — πάντα ζήτα αντιπαράδειγμα πριν εμπιστευτείς έναν greedy κανόνα.
- «Ο άπληστος προηγείται» — απόδειξη ότι η μερική λύση του άπληστου είναι σε κάθε βήμα τουλάχιστον τόσο καλή όσο κάθε άλλης.
- Διαμέριση διαστημάτων — ελάχιστο πλήθος μηχανών. Κριτήριο: μικρότερος χρόνος έναρξης. Το αποτέλεσμα ισούται πάντα με το βάθος.
- Δομικό κάτω φράγμα — βρες ένα εμπόδιο μέσα στο πρόβλημα (το βάθος) και δείξε ότι ο αλγόριθμος το πετυχαίνει ακριβώς.
Ασκήσεις από εξετάσεις
Από τη θεωρία στην εξεταστική
9 άσκησεις που χρησιμοποιούν ως τελευταίο εργαλείο αυτή τη διάλεξη. Οι πρόσφατες εξεταστικές (2024/2025) φέρουν badge προτεραιότητας.
Σεπτέμβριος 2025 · Θέμα 2.3 — Άπληστα ρέστα (αποτυγχάνει)
Εργαζόμαστε ως ταμίες σε κατάστημα. Τα χαρτονομίσματα/κέρματα που μπορούμε να επιστρέψουμε ως ρέστα έχουν αξία ευρώ (απεριόριστα). Στόχος: όταν δίνουμε ρέστα, να χρησιμοποιούμε το μικρότερο πλήθος κερμάτων.
Μπορούμε να πετύχουμε τον στόχο επιλέγοντας πάντα το κέρμα με τη μεγαλύτερη αξία που δεν ξεπερνά το υπόλοιπο ποσό; (i) ΝΑΙ · (ii) ΟΧΙ. Αιτιολόγησε την απάντηση.
Φροντιστηριακό Σετ #6 · Άσκηση 3 — Μέγιστη εναλλασσόμενη υπακολουθία σε O(n)
Δίνεται ένας πίνακας με αριθμούς και ζητείται να βρεθεί, σε χρόνο , η υπακολουθία μέγιστου μήκους με την ιδιότητα:
(εναλλάξ «πάνω-κάτω»). Η υπακολουθία δε χρειάζεται να βρίσκεται σε συνεχόμενες θέσεις.
Φροντιστηριακό Σετ #6 · Άσκηση 5 — Ρέστα με τον ελάχιστο αριθμό νομισμάτων
Θέλουμε να δώσουμε ρέστα cents χρησιμοποιώντας τον ελάχιστο αριθμό νομισμάτων, από νομίσματα αξίας cents. Υπάρχει άπληστος αλγόριθμος που οδηγεί σε βέλτιστη λύση;
Φροντιστηριακό Σετ #6 · Άσκηση 6 — Ελάχιστες στάσεις για ανεφοδιασμό
Ο καθηγητής Μίδας οδηγεί με αυτοκίνητο από μια αφετηρία προς έναν προορισμό. Η δεξαμενή καυσίμων του αυτοκινήτου, όταν είναι γεμάτη, έχει αρκετά καύσιμα ώστε να οδηγεί για χιλιόμετρα, και ο χάρτης του δείχνει τις αποστάσεις μεταξύ των σταθμών καυσίμων στον δρόμο του. Ο καθηγητής θέλει να κάνει όσες λιγότερες στάσεις γίνεται. Δώστε έναν αποδοτικό (άπληστο) αλγόριθμο με τον οποίο ο καθηγητής Μίδας θα προσδιορίζει σε ποιούς σταθμούς πρέπει να κάνει στάση, και αποδείξτε ότι ο αλγόριθμός σας δίνει βέλτιστη λύση.
Φροντιστηριακό Σετ #6 · Άσκηση 8 — Άπληστος χρωματισμός & ελάχιστα ταξί
Δώστε έναν άπληστο αλγόριθμο χρωματισμού των κορυφών ενός γράφου με τον ελάχιστο δυνατό αριθμό χρωμάτων, ώστε γειτονικές κορυφές να μην έχουν το ίδιο χρώμα. Στη συνέχεια, δοθέντος ενός συνόλου ραντεβού (καθένα με χρόνο έναρξης και λήξης), βρείτε τον μικρότερο αριθμό ταξί που χρειάζονται ώστε να εξυπηρετηθούν όλα — κάθε ταξί δεν μπορεί να εξυπηρετεί επικαλυπτόμενα ραντεβού.
Φροντιστηριακό Σετ #7 · Άσκηση 4 — Μηνιαίο vs ετήσιο πακέτο ίντερνετ
Θέλουμε να επιλέξουμε τον τρόπο παροχής ίντερνετ στο σπίτι, με μηνιαίο πακέτο (χωρίς δέσμευση, μεταβλητή τιμή τον μήνα ), ετήσιο συμβόλαιο (δέσμευση 12 μηνών, σταθερή τιμή ), ή κάποιον συνδυασμό τους σε ορίζοντα μηνών. Ποιος είναι ένας άπληστος αλγόριθμος για αυτό το πρόβλημα;
Φροντιστηριακό Σετ #7 · Άσκηση 5 — Παιχνίδι διαδρομής σε πίνακα: αποτυγχάνει ο άπληστος
Έστω ένας πίνακας ακεραίων με γραμμές και στήλες. Παιχνίδι: ξεκινώντας από οποιοδήποτε κελί της κάτω γραμμής, προσπαθούμε να φτάσουμε σε κάποιο κελί της πάνω γραμμής, περνώντας από κελιά ελαχίστου συνολικού κόστους. Κόστος ενός κελιού = ο αριθμός που αναγράφεται σε αυτό. Από ένα κελί κινούμαστε είτε ακριβώς επάνω, είτε διαγωνίως επάνω-αριστερά, είτε διαγωνίως επάνω-δεξιά.
Θεωρήστε τον εξής άπληστο αλγόριθμο: επίλεξε στην κάτω γραμμή το κελί ελαχίστου κόστους, και σε κάθε βήμα επίλεξε το κελί ελαχίστου κόστους της αμέσως πιο πάνω γραμμής στο οποίο έχεις δικαίωμα να μεταβείς. Είναι ο αλγόριθμος βέλτιστος; Αν όχι, δώστε αντιπαράδειγμα.
Φροντιστηριακό Σετ #7 · Άσκηση 7 — Ελάχιστα μοναδιαία διαστήματα που καλύπτουν σημεία
Περιγράψτε έναν αποδοτικό αλγόριθμο ο οποίος, δεδομένου ενός συνόλου σημείων στον άξονα των πραγματικών αριθμών, καθορίζει το μικρότερο σύνολο κλειστών διαστημάτων μοναδιαίου μήκους που εμπεριέχει όλα τα δοθέντα σημεία.
Φροντιστηριακό Σετ #7 · Άσκηση 8 — Κατανομή μαθημάτων σε αίθουσες
Το Τμήμα Πληροφορικής ενός Πανεπιστημίου θέλει να κατανείμει ένα σύνολο μαθημάτων στις διαθέσιμες αίθουσες (που είναι το πλήθος, με το αρκετά μεγάλο). Οποιοδήποτε μάθημα μπορεί να γίνει σε οποιαδήποτε αίθουσα, αρκεί να μην υπάρχουν χρονικές επικαλύψεις μεταξύ μαθημάτων της ίδιας αίθουσας. Θέλουμε να προγραμματίσουμε όλα τα μαθήματα χρησιμοποιώντας όσο το δυνατόν λιγότερες αίθουσες. Δώστε αποδοτικό άπληστο αλγόριθμο που αποφασίζει ποια αίθουσα θα φιλοξενήσει ποιο μάθημα. Δίνει ο αλγόριθμός σας βέλτιστο αποτέλεσμα;