L15 · Δυναμικός Προγραμματισμός II — Σακίδιο & Μέγιστη Κοινή Υπακολουθία
Τι θα δούμε
Δύο κλασικά DP προβλήματα — και ένα νέο δίδαγμα. Στο L14 τα υποπροβλήματα παραμετροποιήθηκαν με μία μεταβλητή ( = «τα πρώτα αιτήματα»). Εδώ θα δούμε ότι αυτό δεν αρκεί πάντα: το πρόβλημα του σακιδίου χρειάζεται δύο μεταβλητές. Μετά, η μέγιστη κοινή υπακολουθία δείχνει DP πάνω σε δύο συμβολοσειρές.
Το πρόβλημα του σακιδίου (knapsack)
Διατύπωση
Είσοδος: αντικείμενα και ένα «σακίδιο». Το αντικείμενο έχει βάρος και αξία . Το σακίδιο αντέχει το πολύ κιλά.
Στόχος: διάλεξε υποσύνολο αντικειμένων που χωράει () και μεγιστοποιεί τη συνολική αξία.
Ο άπληστος δεν αρκεί
Ο λόγος απαντά στο «πόσο καλό είναι ένα αντικείμενο μόνο του». Αγνοεί όμως ότι το σακίδιο έχει πεπερασμένο χώρο και ότι ο στόχος είναι ο καλύτερος συνδυασμός. Ο άπληστος γεμίζει το σακίδιο με μικρά αντικείμενα καλού λόγου και μετά κολλάει με ένα κενό που κανένα μεγαλύτερο αντικείμενο δεν χωράει να καλύψει. Δες το να συμβαίνει βήμα-βήμα:
Πρώτη απόπειρα — και γιατί αποτυγχάνει
Στο L14 κάθε DP πρόβλημα λύθηκε με μία παράμετρο. Ας δοκιμάσουμε το ίδιο: ορίζουμε = η μέγιστη αξία που πετυχαίνουμε χρησιμοποιώντας μόνο τα αντικείμενα . Όπως πάντα, κοιτάμε το τελευταίο αντικείμενο — μέσα ή έξω;
- Το ΕΞΩ: μένει το ίδιο πρόβλημα με ένα αντικείμενο λιγότερο → .
- Το ΜΕΣΑ: κερδίζουμε αξία … αλλά το καταναλώνει κιλά χώρου. Και εδώ η αναδρομή κολλάει: για να πούμε αν το χωράει καν, πρέπει να ξέρουμε πόσος χώρος έχει ήδη ξοδευτεί — κι αυτό η δεν μας το λέει.
Το πρόβλημα είναι βαθύτερο από «μια λεπτομέρεια που λείπει». Σκέψου τι σημαίνει ένας αριθμός : «η καλύτερη αξία με τα πρώτα αντικείμενα». Όμως το καλύτερο prefix για το μέλλον δεν είναι αυτό με τη μεγαλύτερη αξία τώρα — είναι αυτό που αφήνει αρκετό χώρο για ό,τι ακολουθεί. Δύο διαφορετικές επιλογές στα ίδια αντικείμενα μπορεί να έχουν διαφορετική αξία και διαφορετικό ελεύθερο χώρο· ένας μόνο αριθμός δεν χωράει να κρατήσει και τα δύο. Παίξε με τις δύο στήλες:
Διάλεξε τα αντικείμενα 1–3 σε κάθε σενάριο. Μένει το αντικείμενο 4 (βάρος 5, αξία 6). Ερώτηση: ποιο prefix οδηγεί στην καλύτερη τελική λύση;
Η σωστή αναδρομή — δύο μεταβλητές
Σκεφτόμαστε ξανά το αντικείμενο :
- Το ΕΞΩ: η καλύτερη λύση από τα με την ίδια χωρητικότητα → .
- Το ΜΕΣΑ (μόνο αν ): «ξοδεύουμε» χώρο και κερδίζουμε αξία, και λύνουμε το υπόλοιπο με χωρητικότητα → .
Ο αλγόριθμος
- Είσοδος:
- n αντικείμενα με βάρη/αξίες, και χωρητικότητα W
- Έξοδος:
- η μέγιστη συνολική αξία ενός υποσυνόλου που χωράει στο σακίδιο
Με λόγια. Φτιάχνουμε έναν πίνακα με γραμμές (αντικείμενα ) και στήλες (χωρητικότητες ). Η γραμμή είναι όλο μηδενικά. Κάθε επόμενη γραμμή υπολογίζεται από την προηγούμενη: αν το αντικείμενο δεν χωράει, αντιγράφουμε το κελί από πάνω· αλλιώς παίρνουμε το μεγαλύτερο ανάμεσα στο « έξω» και στο « μέσα».
Δες τον πίνακα να γεμίζει γραμμή-γραμμή. Σε κάθε γραμμή φωτίζεται το κελί και τα δύο κελιά της προηγούμενης γραμμής από τα οποία εξαρτάται:
Αντικείμενα (βάρος, αξία): 1:(2,3) · 2:(3,4) · 3:(4,5) · 4:(5,6)
Πολυπλοκότητα — μια λεπτή παγίδα
Ο αλγόριθμος γεμίζει έναν πίνακα , ένα κελί τη φορά, άρα τρέχει σε . Δεν έχει εκθέτες, δεν έχει — μοιάζει πολυωνυμικός. Δεν είναι.
Το δεν είναι «πλήθος αντικειμένων»· είναι ένας αριθμός που δίνεται στην είσοδο. Κι έναν αριθμό τιμής τον γράφεις με μόλις δυφία. Άρα το πραγματικό μέγεθος της εισόδου μεγαλώνει σαν , ενώ ο χρόνος μεγαλώνει σαν — δηλαδή σαν . Αυτό είναι εκθετικό ως προς το μέγεθος της εισόδου. Δοκίμασε να διπλασιάσεις το και μέτρα:
Κάθε διπλασιασμός του W προσθέτει ένα δυφίο στην είσοδο — αλλά διπλασιάζει τον χρόνο n·W. Δες το χάσμα.
Μέγιστη κοινή υπακολουθία (LCS)
Διατύπωση
Είσοδος: δύο συμβολοσειρές και .
Στόχος: το μέγιστο μήκος μιας ακολουθίας που είναι ταυτόχρονα υπακολουθία και των δύο.
Η διάκριση είναι λεπτή κι αξίζει να την «πιάσεις» πριν προχωρήσουμε — πάτησε γράμματα και δες:
Πάτησε γράμματα για να τα κρατήσεις. Δες τι μένει υπακολουθία και τι υποσυμβολοσειρά.
Η αναδρομή
Ίδιο μοτίβο με το L14 — αλλά τώρα έχουμε δύο ακολουθίες, άρα φυσικά δύο παραμέτρους. Ορίζουμε = το μέγιστο μήκος κοινής υπακολουθίας των προθεμάτων και . Για να σπάσουμε το πρόβλημα, κοιτάμε τους τελευταίους χαρακτήρες, και :
- . Έχουμε δύο ίδια γράμματα στις δύο άκρες — κι ένα ζευγάρι ίδιων γραμμάτων είναι «δωρεάν» μήκος για την κοινή υπακολουθία. Δεν χάνεις ποτέ τίποτα αν τα ζευγαρώσεις: υπάρχει πάντα μια βέλτιστη λύση που τα χρησιμοποιεί ως τελευταίο της στοιχείο. Άρα κερδίζουμε , και μένει η LCS των και → .
- . Δύο διαφορετικά γράμματα δεν γίνεται να είναι και τα δύο το τελευταίο στοιχείο μιας κοινής υπακολουθίας — άρα τουλάχιστον το ένα δεν χρησιμοποιείται. Πετάμε είτε το (μένει LCS των και ) είτε το (μένει LCS των και ). Δεν ξέρουμε ποιο — τα δοκιμάζουμε και τα δύο και κρατάμε το .
Ο αλγόριθμος
- Είσοδος:
- δύο συμβολοσειρές x (μήκος m) και y (μήκος n)
- Έξοδος:
- το μήκος της μέγιστης κοινής υπακολουθίας τους
Με λόγια. Πίνακας με γραμμές και στήλες· η γραμμή 0 και η στήλη 0 είναι μηδενικά (κενό προθέμα). Για κάθε κελί : αν , παίρνουμε το διαγώνιο κελί συν ένα· αλλιώς, το μεγαλύτερο ανάμεσα στο κελί «από πάνω» και σ' αυτό «από αριστερά».
Παράδειγμα. Δες τον πίνακα να γεμίζει γραμμή-γραμμή για και , και μετά το πέρασμα προς τα πίσω να ανακτά την ίδια την υπακολουθία:
Πράσινο κελί = τα γράμματα ταιριάζουν (διαγώνιο +1)· αλλιώς, το max από «πάνω»/«αριστερά».
Ο πίνακας έχει κελιά, κάθε ένα υπολογίζεται σε → πολυπλοκότητα . Το κάτω-δεξιά κελί δίνει το μήκος· το πέρασμα προς τα πίσω από εκεί δίνει μια συγκεκριμένη μέγιστη κοινή υπακολουθία (εδώ, το BCB).
Κλείδωσε τη γνώση
Βάλε στη σειρά τα βήματα του DP για το σακίδιο:
Και συμπλήρωσε τα κενά:
Μοτίβο σκέψης
Τι μάθαμε
Τι κρατάμε από αυτή τη διάλεξη
- Σακίδιο (0/1 knapsack) — μέγιστη αξία αντικειμένων που χωράνε σε χωρητικότητα . Ο άπληστος (λόγος ) αποτυγχάνει.
- Η μονοδιάστατη παραμετροποίηση δεν αρκεί — χρειάζεται δεύτερη μεταβλητή: .
- Αναδρομή: . Χρόνος — ψευδοπολυωνυμικός· το πρόβλημα απόφασης είναι NP-πλήρες.
- Μέγιστη κοινή υπακολουθία (LCS) — μέγιστο μήκος κοινής (όχι κατ' ανάγκη συνεχόμενης) υπακολουθίας δύο συμβολοσειρών.
- Αναδρομή: αν → διαγώνια · αλλιώς → από «πάνω» και «αριστερά». Χρόνος .
Ασκήσεις από εξετάσεις
Από τη θεωρία στην εξεταστική
4 άσκησεις που χρησιμοποιούν ως τελευταίο εργαλείο αυτή τη διάλεξη. Οι πρόσφατες εξεταστικές (2024/2025) φέρουν badge προτεραιότητας.
Σεπτέμβριος 2025 · Θέμα 1.8 — Φράγματα πολυπλοκότητας της LCS
Ποια από τα παρακάτω αποτελούν ορθά φράγματα στην πολυπλοκότητα της εύρεσης της μέγιστης κοινής υπακολουθίας δύο συμβολοσειρών με και χαρακτήρες;
(i) · (ii) · (iii) · (iv) .
Σεπτέμβριος 2025 · Θέμα 3 — Όνομα σκύλου (συντομότερη κοινή υπερακολουθία)
Ένα ζευγάρι με ονόματα και θέλει να ονομάσει τον σκύλο του με ένα όνομα που να περιέχει και τα δύο ονόματά τους ως υπακολουθίες, και να είναι το συντομότερο δυνατό. Π.χ. για ΓΑΒ και ΜΙΑΟΥ, το ΜΙΓΑΒΟΥ ή το ΓΜΙΑΟΥΒ είναι έγκυρα, αλλά όχι το ΓΑΒΜΙΑΟΥ (πολύ μακρύ). Σχεδίασε αλγόριθμο Δυναμικού Προγραμματισμού που βρίσκει το βέλτιστο μήκος για συμβολοσειρές μηκών .
Ορίζουμε = το μήκος της συντομότερης συμβολοσειράς που περιέχει ως υπακολουθίες τα πρώτα στοιχεία της και τα πρώτα στοιχεία της .
(i) Το βέλτιστο μήκος δίνεται από την τιμή . (ii) Γράψε την αναδρομική σχέση. (iii) Ποια η χρονική πολυπλοκότητα και γιατί;
Σεπτέμβριος 2024 · Θέμα 4 — Διαφημίσεις χορηγών (Σακίδιο)
Στην πρώτη μέρα ενός φεστιβάλ παρουσιάζονται δύο συγκροτήματα. Από το τέλος της συναυλίας του πρώτου μέχρι την έναρξη του δεύτερου μεσολαβεί χρόνος . Σε αυτό το διάστημα η διοργανώτρια εταιρεία θα προβάλει διαφημίσεις χορηγών (χωρίς επαναλήψεις). Έχουν καταθέσει προτάσεις εταιρείες· η διαφήμιση έχει διάρκεια και αποφέρει κέρδος (όλα θετικοί ακέραιοι). Ορίζουμε = το μέγιστο κέρδος από τις διαφημίσεις με συνολική διάρκεια το πολύ .
(α) Ποια τιμή δίνει το μέγιστο κέρδος; (β) Γράψε τον αναδρομικό τύπο του . (γ) Χρονική πολυπλοκότητα του υπολογισμού όλων των υποπροβλημάτων — αιτιολόγησε. (δ) Πολυπλοκότητα για τον εντοπισμό των διαφημίσεων που δίνουν το μέγιστο κέρδος. (ε) Σε ποιο γνωστό πρόβλημα αντιστοιχεί αν επιπλέον κάθε διαφήμιση πρέπει να προβληθεί σε σταθερό διάστημα εντός του ;
Ιούνιος 2022 · Θέμα 3 — 0/1 σακίδιο: άπληστος vs δυναμικός
Θεωρήστε το 0-1 πρόβλημα του σακιδίου: μεγιστοποίησε υπό τον περιορισμό , με , όπου τα είναι ακέραιοι.
i. Περιγράψτε σε φυσική γλώσσα έναν άπληστο αλγόριθμο που επιστρέφει μια εφικτή λύση. ii. Υπολογίστε την πολυπλοκότητά του. iii. Για το στιγμιότυπο , , , εφαρμόστε τον αλγόριθμο. iv. Μπορεί ο αλγόριθμος να επιστρέφει πάντα τη βέλτιστη λύση και να είναι πολυωνυμικός; v. Με δυναμικό προγραμματισμό, πόσα υποπροβλήματα χρειάζονται; Δώστε την αναδρομική σχέση.