Δυναμικός προγραμματισμός - Μέγιστη Κοινή Υπακολουθία

You might also like

Download as pdf or txt
Download as pdf or txt
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