You are on page 1of 18

Άννα Κορφιάτη

Δυναμικός Προγραμματισμός

Μέγιστη κοινή υπακολουθία


Μια διαισθητική προσέγγιση

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Το πρόβλημα

Δίνονται δύο ακολουθίες συμβόλων 𝛸 = 𝑥1 𝑥2 … 𝑥𝑚 και 𝑌 = 𝑦1 𝑦2 … 𝑦𝑛 .

Θέλουμε να βρούμε μια κοινή υπακολουθία των 𝛸 και 𝑌 με το μέγιστο δυνατό μήκος.

Υπακολουθία της 𝛸 είναι κάθε ακολουθία που προκύπτει αν σβήσουμε αυθαίρετα


κάποια από τα 𝑥𝑖 (αλλά όσα παραμείνουν έχουν την αρχική σειρά).

Παράδειγμα
Η μέγιστη κοινή υπακολουθία των συμβολοσειρών «abcdaf» και «acbcf»
είναι η: abcf
αφού έχουμε «abcdaf» και «acbcf»

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Πως θα το λύσουμε:

Η προσέγγιση που θα ακολουθήσουμε είναι η εξής:

❑ Θα αποφασίσουμε τη μορφή του πίνακα μας

❑ Θα συμπληρώσουμε κάποια με το μάτι για ένα συγκεκριμένο στιγμιότυπο

❑ Και τέλος θα δώσουμε την τελική μορφή της αναδρομικής σχέσης.

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Η ιδέα

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

0 1 2 3 4 5 6
ε a b c d a f
0 ε
1 a
2 c
3 b
4 c
5 f

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Αρχικοποίηση

Όλα τα κελιά της πρώτης γραμμής θα είναι ίσα με το 0 όπως και τα κελιά της πρώτης
στήλης

Το μήκος της μέγιστης


κοινής υπακολουθίας
αν έχω την «a» και την 0 1 2 3 4 5 6
κενή συμβολοσειρά
ε a b c d a f
0 ε 0 0 0 0 0 0 0
1 a 0
2 c 0
Το μήκος της μέγιστης 3 b 0
κοινής υπακολουθίας αν
έχω την «acb» και την 4 c 0
κενή συμβολοσειρά
5 f 0

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Η συμπλήρωση του πίνακα

Αν είμαι στη 𝒊 γραμμή και την 𝒋 στήλη, αποθηκεύω στο κελί 𝜜[𝒊, 𝒋] το μήκος της μέγιστης
κοινής υπακολουθίας που προκύπτει αν κοιτάξω μέχρι το 𝒊 −οστό σύμβολο της μίας
λέξης και μέχρι το 𝒋 −οστό σύμβολο της άλλης λέξης
Το μήκος της μέγιστης
κοινής υπακολουθίας
Το μήκος της μέγιστης αν έχω την «abcda» και
0 1 2 3 4 5 6
κοινής υπακολουθίας την «a»
αν έχω την «a» και την ε a b c d a f
«a»
0 ε 0 0 0 0 0 0 0
1 a 0 1 1 1 1 1 1
2 c 0
3 b 0
4 c 0
5 f 0

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Η συμπλήρωση του πίνακα

Προχωράμε στην συμπλήρωση του πίνακα με το μάτι, μέχρι να καταλάβουμε τι πρέπει


να βάλουμε την αναδρομική μας σχέση να κάνει

Το μήκος της μέγιστης


κοινής υπακολουθίας
0 1 2 3 4 5 6 αν έχω την «ab» και την
«ac»
Το μήκος της μέγιστης
ε a b c d a f
κοινής υπακολουθίας
αν έχω την «a» και την 0 ε 0 0 0 0 0 0 0
«ac»
1 a 0 1 1 1 1 1 1
2 c 0 1 1
3 b 0
4 c 0
5 f 0

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Όταν η κατάσταση βελτιώνεται

Κοιτώντας την ab και την ac το μήκος της μέγιστης κοινής υπακολουθίας είναι 1
Τώρα που κοιτάμε τις abc και ac το μήκος της μέγιστης κοινής υπακολουθίας είναι 2

Το μήκος της μέγιστης


κοινής υπακολουθίας
αν έχω την «abc» και 0 1 2 3 4 5 6
Κοιτώντας μέχρι το c
την «ac» στην «κάθετη λέξη» η
ε a b c d a f
κατάσταση βελτιώνεται
0 ε 0 0 0 0 0 0 0
1 a 0 1 1 1 1 1 1
2 c 0 1 1 2
3 b 0
4 c 0
5 f 0

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Όταν η κατάσταση βελτιώνεται

Αν 𝒙𝒋 = 𝒚𝒊 τότε
𝒙𝒋−𝟏 𝒙𝒋 έχουμε άλλο ένα
κοινό σύμβολο, το
οποίο δεν το είχαμε
πριν.

𝒚𝒊−𝟏 A[i−1,j−1]

𝒚𝜾

Το καλύτερο που μπορούσαμε να


πετύχουμε κοιτώντας μέχρι το Άρα όταν 𝒙𝒋 = 𝒚𝒊 έχουμε
αμέσως προηγούμενο σύμβολο 𝜜[𝒊, 𝒋] = 𝑨[𝒊 − 𝟏, 𝒋 − 𝟏] + 𝟏
αποθηκεύεται στο Α[i-1,j-1]

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Συμπληρώνουμε με το μάτι τα κελιά της τρέχουσας γραμμής

0 1 2 3 4 5 6
ε a b c d a f
0 ε 0 0 0 0 0 0 0
1 a 0 1 1 1 1 1 1
2 c 0 1 1 2 2 2 2
3 b 0
4 c 0
5 f 0

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Συμπληρώνουμε άλλο ένα κελί με το μάτι

0 1 2 3 4 5 6
ε a b c d a f
0 ε 0 0 0 0 0 0 0
Το μήκος της μέγιστης
κοινής υπακολουθίας 1 a 0 1 1 1 1 1 1
αν έχω την «a» και την
«acb» είναι 1 2 c 0 1 1 2 2 2 2
3 b 0 1
4 c 0
5 f 0

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Όταν η κατάσταση βελτιώνεται

Εδώ έχουμε μια περίπτωση που η κατάσταση βελτιώνεται διότι έχουμε ένα ακόμη κοινό
σύμβολο: το b
Άρα προσθέτουμε 1 στο αριστερά διαγώνιο κελί 𝑋 3,2 = 𝑋 2,1 + 1 = 1 + 1 = 𝟐

0 1 2 3 4 5 6
ε a b c d a f
0 ε 0 0 0 0 0 0 0
Το μήκος της μέγιστης
κοινής υπακολουθίας 1 a 0 1 1 1 1 1 1
αν έχω την «ab» και την
«acb» είναι 2 2 c 0 1 1 2 2 2 2
3 b 0 1 2
4 c 0
5 f 0

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Συμπληρώνουμε μερικά ακόμα κελιά με το μάτι

0 1 2 3 4 5 6
ε a b c d a f
0 ε 0 0 0 0 0 0 0
1 a 0 1 1 1 1 1 1
2 c 0 1 1 2 2 2 2
3 b 0 1 2 2 2 2 2
4 c 0 1
5 f 0

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Όταν η κατάσταση δεν βελτιώνεται

Όταν το 𝒊-οστό στοιχείο της μίας λέξης είναι διαφορετικό από το 𝒋-οστό στοιχείο της
άλλης, τότε κρατάμε το καλύτερο μήκος που έχουμε πετύχει έως τώρα.
Που βρίσκεται όμως αυτό το μήκος;

0 1 2 3 4 5 6
Το μήκος της μέγιστης
κοινής υπακολουθίας ε a b c d a f
αν έχω την «ab» και την
«acbc» είναι 2. 0 ε 0 0 0 0 0 0 0
1 a 0 1 1 1 1 1 1
Από που θα πάρει η
2 c 0 1 1 2 2 2 2 αναδρομική μας αυτό
το 2;
3 b 0 1 2 2 2 2 2
4 c 0 1 2
5 f 0

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Όταν η κατάσταση δεν βελτιώνεται

Θα κρατήσουμε το καλύτερο που έχουμε πετύχει ως τώρα.


Δηλαδή το σύμβολο που αύξησε το μήκος σε προηγούμενο βήμα ήταν είτε το τελευταίο
σύμβολο της y (το c)είτε το τελευταίο σύμβολο της x (το b).

0 1 2 3 4 5 6 0 1 2 3 4 5 6

ε a b c d a f ε a b c d a f
0 ε 0 0 0 0 0 0 0 0 ε 0 0 0 0 0 0 0
1 a 0 1 1 1 1 1 1 1 a 0 1 1 1 1 1 1
2 c 0 1 1 2 2 2 2 2 c 0 1 1 2 2 2 2
3 b 0 1 2 2 2 2 2 3 b 0 1 2 2 2 2 2
4 c 0 1 4 c 0 1
5 f 0 5 f 0

Κρατάμε το max του


πάνω και του αριστερά

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Όταν η κατάσταση δεν βελτιώνεται

Όταν 𝒙𝒊 ≠ 𝒚𝒋

𝒙𝒋−𝟏 𝒙𝒋

𝒚𝒊−𝟏 A[i−1,j]

𝒚𝜾 A[i,j−1]

Άρα όταν 𝒙𝒋 ≠ 𝒚𝒊 έχουμε


𝜜 𝒊, 𝒋 = 𝒎𝒂𝒙{𝑨 𝒊, 𝒋 − 𝟏 , 𝑨 𝒊 − 𝟏, 𝒋 }

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
Δυναμικός Προγραμματισμός Μέγιστη κοινή υπακολουθία Άννα Κορφιάτη

Η αναδρομική σχέση

Δίνονται δύο ακολουθίες συμβόλων 𝛸 = 𝑥1 𝑥2 … 𝑥𝑚 και 𝑌 = 𝑦1 𝑦2 … 𝑦𝑛 .


Θέλουμε να βρούμε μια κοινή υπακολουθία των 𝛸 και 𝑌 με το μέγιστο δυνατό μήκος.

Κατασκευάζουμε πίνακα Α 𝑖, 𝑗 με 𝑛 + 1 γραμμές και 𝑚 + 1 στήλες.


Οι τιμές του Α 𝑖, 𝑗 συμπληρώνονται ως εξής:

Αρχικοποίηση 𝚨 0, j = 0 και 𝚨 𝑖, 0 = 0

Αν 𝒙𝒋 = 𝒚𝒊 έχουμε
Όταν η κατάσταση βελτιώνεται 𝜜[𝒊, 𝒋] = 𝑨[𝒊 − 𝟏, 𝒋 − 𝟏] + 𝟏

Αν 𝒙𝒋 ≠ 𝒚𝒊 έχουμε
Όταν η κατάσταση δεν βελτιώνεται
𝜜 𝒊, 𝒋 = 𝒎𝒂𝒙{𝑨 𝒊, 𝒋 − 𝟏 , 𝑨 𝒊 − 𝟏, 𝒋 }

https://www.facebook.com/math.tutor.ak 69 74 12 97 30 korfiati.an@gmail.com
https://www.facebook.com/math.tutor.ak

korfiati.an@gmail.com

69 74 12 97 30

You might also like