Greedy αλγόριθμοι

2
Τμήμα Ηλεκτρονικών Μηχ. & Μηχ. Υπολογιστών
ΣΕΛ 402: Παράλληλοι Αλγόριθμοι και Software
Greedy Algorithms
Φθινόπωρο 2001
Διδάσκων: Τάσος Δημητρίου
Η Greedy Μέθοδος
Η μέθοδος greedy είναι ίσως η πιο απλή σχεδιαστική τεχνική η οποία μπορεί να εφαρμοστεί σε παρά πολλά
προβλήματα βελτιστοποίησης. Σε πολλά από αυτά τα προβλήματα η είσοδος αποτελείται από n αντικείμενα,
από τα οποία πρέπει να επιλεγεί ένα υποσύνολό τους που ικανοποιεί κάποιους περιορισμούς. Οποιοδήποτε
υποσύνολο ικανοποιεί αυτούς τους περιορισμούς ονομάζεται εφικτή λύση (feasible solution) ή απλά λύση.
Κάθε τέτοια λύση έχει μία τιμή και συνήθως μας ζητείται να βρεθεί εκείνη η λύση που μεγιστοποιεί ή
ελαχιστοποιεί κάποια συνάρτηση πάνω στα αντικείμενα της εισόδου. Η λύση αυτή ονομάζεται βέλτιστη
λύση.
Ένας greedy αλγόριθμος συνήθως δουλεύει σε στάδια, θεωρώντας ένα αντικείμενο τη φορά. Σε κάθε
στάδιο αποφασίζει αν το αντικείμενο ανήκει ή όχι στη βέλτιστη λύση. Αυτό γίνεται εξετάζοντας τα
αντικείμενα με μια σειρά που καθορίζεται από κάποια διαδικασία επιλογής. Αν η προσθήκη του αντικειμένου
έχει σαν αποτέλεσμα τη δημιουργία μιας μη εφικτής λύσης, το αντικείμενο απορρίπτεται και εξετάζεται το
επόμενο. Η διαδικασία της επιλογής εξαρτάται και αυτή από κάποιο κριτήριο βελτιστοποίησης, το οποίο
μπορεί να διαφέρει από τη συνάρτηση βελτιστοποίησης. Η συνάρτηση βελτιστοποίησης είναι μοναδική,
ενώ τα κριτήρια όχι. Κάθε τέτοιο κριτήριο μπορεί να οδηγεί και σε ένα διαφορετικό greedy αλγόριθμο, που
όμως δε θα είναι απαραίτητα βέλτιστος. Το πρόβλημα λοιπόν είναι η επιλογή του κατάλληλου κριτηρίου
(αν υπάρχει) που θα οδηγήσει σε κάποιο optimal greedy αλγόριθμο.
Οι παραπάνω παρατηρήσεις μπορούν να περιγραφούν με τη βοήθεια του ακόλουθου αφηρημένου αλγόριθμου.
Greedy(A1 ; : : : ; An )
Solution = ;
for i = 1 to n do
x = Select(A1 ; : : : ; An )
if Feasible(Solution, x)
then Update(Solution, x)
end
return Solution
// Τα A1 ; : : : ; An είναι τα n αντικείμενα
// Αρχικά η λύση είναι κενή
// Διάλεξε το επόμενο αντικείμενο
// Αν το x μπορεί να προστεθεί στη λύση,
// Ενημέρωσε τρέχουσα λύση
Ένας greedy αλγόριθμος φτάνει στη βέλτιστη λύση κάνοντας κάποιες επιλογές. Κάθε φορά επιλέγεται
εκείνο το αντικείμενο που χρονικά (τοπικά) φαίνεται το καλύτερο. Πως όμως μπορούμε να ξέρουμε ότι
το πρόβλημά μας μπορεί να λυθεί από κάποιο τέτοιο αλγόριθμο; Αν και δεν υπάρχει γενικός κανόνας, το
πρόβλημα θα πρέπει να εμφανίζει τα δύο παρακάτω χαρακτηριστικά:
1. Ιδιότητα Greedy Επιλογής
Ύπαρξη αυτής της ιδιότητας σημαίνει ότι ο αλγόριθμος μπορεί να φτάσει στη βέλτιστη λύση κάνοντας
τοπικά βέλτιστες επιλογές. Από τη στιγμή που έχουμε επιλέξει κάποιο κριτήριο βελτιστοποίησης, ο
αλγόριθμος διαλέγει τα αντικείμενα που θα προστεθούν στη λύση με ένα τρόπο που βελτιστοποιεί το
κριτήριο εκείνη τη στιγμή.
Στην περίπτωση του Δυναμικού Προγραμματισμού η επιλογή εξαρτάται από τις λύσεις των διαφόρων
υποπροβλημάτων. Αντίθετα, ένας greedy αλγόριθμος κάνει την επιλογή που φαίνεται καλύτερη τη
δεδομένη στιγμή και στη συνέχεια προχωρά στην επίλυση των υποπροβλημάτων που προκύπτουν από
την επιλογή αυτή. Η επιλογή αυτή δεν εξαρτάται ξανά από τις λύσεις μελλοντικών υποπροβλημάτων.
Φυσικά, το πρόβλημα είναι να δείξουμε ότι η greedy επιλογή οδηγεί σε βέλτιστες λύσεις. Η τεχνική
που συνήθως χρησιμοποιείται είναι να ξεκινά κανείς από μία βέλτιστη λύση και με κατάλληλους
μετασχηματισμούς να την τροποποιεί σε μία που έχει τη μορφή της greedy. Αυτό αποδεικνύει την
optimality της greedy λύσης καθώς και την ορθότητα του αλγορίθμου.
1
Greedy Algorithms
2. Βέλτιστη Υποδομή
Όπως και στην περίπτωση του Δυναμικού Προγραμματισμού, ύπαρξη βέλτιστης υποδομής σημαίνει ότι
η καλύτερη λύση περιέχει βέλτιστες λύσεις σε υποπροβλήματα. Και εδώ εμφανίζεται αυτή η ιδιότητα
αφού μετά την επιλογή (ή απόρριψη) κάθε αντικειμένου, τα αντικείμενα που παραμένουν αποτελούν
ένα υποπρόβλημα που θα πρέπει να λυθεί και αυτό κατά έναν optimal τρόπο. Στην αντίθετη περίπτωση
η συνδυασμένη τελική λύση δε θα είναι βέλτιστη!
Το Πρόβλημα του Σακκιδίου (Knapsack Problem)
Φανταστείτε ότι μπαίνετε σε ένα μαγαζί που περιέχει n αντικείμενα, καθένα από τα οποία έχει αξία vi και
βάρος wi . Μαζί σας έχετε και ένα σακκίδιο το οποίο έχει χωρητικότητα (ή μπορεί να αντέξει μέχρι βάρος)
W . Σκοπός είναι να βάλετε στο σακκίδιό σας όσα περισσότερα αντικείμενα μπορείτε ώστε να μεγιστοποιηθεί
η αξία τους, χωρίς όμως να υπερβείτε το βάρος W . Αν κάποιο κλάσμα xi , 0 ∙ xi ∙ 1, του αντικειμένου i
τοποθετηθεί στο σακκίδιο τότε το κέρδος είναι xi vi . Το πρόβλημα λοιπόν μπορεί να εκφραστεί σαν:
maximize
X
(1)
xi vi
1∙i∙n
Σύμφωνα με τον περιορισμό
X
1∙i∙n
xi wi ∙ W
(2)
όπου κάθε xi παίρνει τιμές μεταξύ 0 και 1.
Παρατήρηση: Όπως ορίσαμε το πρόβλημα θεωρούμε ότι τα αντικείμενα είναι ουσιαστικά κάποιο είδος
πολύτιμης σκόνης, από τα οποία μπορούμε να πάρουμε όση ποσότητα θέλουμε. Σύντομα θα δώσουμε ένα
greedy αλγόριθμο γι' αυτό το πρόβλημα. Αν όμως τα αντικείμενα δεν είναι κλασματικά, δηλαδή πρέπει να
βάλουμε στο σακκίδιο όλο το αντικείμενο και όχι μέρος του, τότε ο καλύτερος αλγόριθμος που γνωρίζουμε
είναι εκθετικός. Αποτελεί μάλιστα ένα από τα σημαντικότερα ανοικτά ερωτήματα στην Επιστήμη των
Υπολογιστών αν μπορεί να υπάρξει καλύτερος αλγόριθμος.
Μία feasible λύση είναι οποιαδήποτε λύση (x1 ; x2 ; : : : ; xn ) η οποία ικανοποιεί την (2). Optimal όμως
είναι η λύση που μεγιστοποιεί την ποσότητα στην (1). Για να γίνει το πρόβλημα πιο ενδιαφέρον θα
θεωρήσουμε ότι το άθροισμα των βαρών όλων των αντικειμένων ξεπερνά τη χωρητικότητα W . Αλλιώς
θα μπορούσαμε να πάρουμε xi = 1 και να καταλήξουμε εύκολα σε μια optimal λύση.
Μία άλλη παρατήρηση είναι ότι όλες οι optimal λύσεις γεμίζουν το σακκίδιο ακριβώς. Στην αντίθετη
περίπτωση μπορούμε πάντα να αυξήσουμε τη συνεισφορά κάποιου αντικειμένου μέχρι το συνολικό βάρος
να γίνει W .
Παράδειγμα 1 Έστω ότι το σακκίδιό μας έχει χωρητικότητα W = 20 και ότι υπάρχουν n = 3 αντικείμενα
των οποίων οι αξίες είνα (v1 ; v2 ; v3 ) = (25; 24; 15) και τα βάρη τους (w1 ; w2 ; w3 ) = (18; 15; 10), αντίστοιχα.
Μερικές feasible λύσεις φαίνονται παρακάτω:
(x1 ; x2 ; x3 )
2
(1; 15
; 0)
P
i
xi vi
20
P
i
xi wi
28:2
(0; 23 ; 1)
20
31
(0; 1; 12 )
20
31:5
Υπάρχουν πολλές greedy στρατηγικές με τις οποίες μπορούμε να πάρουμε διάφορες feasible λύσεις.
1. Μία πρώτη προσέγγιση θα ήταν να είμαστε πραγματικά άπληστοι. Προσπαθούμε λοιπόν να γεμίσουμε το
σακκίδιο πρώτα με το αντικείμενο μεγαλύτερης αξίας, έπειτα με το αντικείμενο της αμέσως μικρότερης,
Διδάσκων: Τάσος Δημητρίου
3
κοκ. Η επιλογή μας λοιπόν βασίζεται στην αξία των αντικειμένων, η οποία αποτελεί το πρώτο μας
κριτήριο βελτιστοποίησης.
Αυτή η στρατηγική χρησιμοποιήθηκε στην πρώτη λύση του παραδείγματος. Τη μεγαλύτερη αξία έχει το
1ο αντικείμενο, το οποίο μπαίνει στο σακκίδιο (x1 = 1). Εφόσον αυτό έχει βάρος 18, περισσεύουν
2
). Το
άλλες δύο μονάδες βάρους οι οποίες συμπληρώνονται με το δεύτερο σε αξία αντικείμενο (x2 = 15
2
¢ 24 + 0 ¢ 15 = 28:2, το οποίο όμως δεν είναι βέλτιστο. Το
συνολικό κέρδος είναι λοιπόν 1 ¢ 25 + 15
συμπέρασμα; Δεν αρκεί να είναι κανείς greedy. Χρειάζεται και κάτι παραπάνω.
2. Το πρόβλημα με την προηγούμενη στρατηγική ήταν ότι αν και η συνάρτηση βελτιστοποίησης (το κέρδος
μας) αύξανε με γρήγορους ρυθμούς, ωστόσο και η χωρητικότητα αύξανε επίσης γρήγορα. Ας προσπαθήσουμε λοιπόν να χρησιμοποιήσουμε το σακκίδιο μας όσο πιο συνετά μπορούμε. Έτσι το δεύτερο κριτήριο
επιλογής αντικειμένων θα είναι η προσθήκη του αντικειμένου με το μικρότερο βάρος.
Ελαφρύτερο είναι το αντικείμενο 3, με βάρος w3 = 10, οπότε το συμπεριλαμβάνουμε στο σακκίδιο
(x3 = 1) και περισσεύουν 10 μονάδες βάρους. Επόμενο, είναι το αντικείμενο 2, με βάρος w2 = 15
αλλά δυστυχώς το σακκίδιο μπορεί να χωρέσει μόνο τα 10=15 αυτού, επομένως x2 = 23 . Σε αυτό το
σημείο το σακκίδιο έχει γεμίσει πλήρως, οπότε αναγκαστικά επιλέγουμε x1 = 0. Το κέρδος μας τώρα
είναι 0 ¢ 25 + 23 ¢ 24 + 1 ¢ 15 = 31, αρκετά βελτιωμένο σε σχέση με την πρώτη στρατηγική, αλλά πάλι όχι
καλύτερο, όπως φαίνεται και από τον πίνακα των λύσεων.
3. Η παραπάνω στρατηγική δεν ήταν optimal, επειδή αν και το βάρος αύξανε με αργούς ρυθμούς ωστόσο
και το κέρδος δεν αύξανε γρήγορα. Ας προσπαθήσουμε λοιπόν να πετύχουμε μία ισορροπία μεταξύ
του ρυθμού αύξησης του κέρδους και του ρυθμού μείωσης της χωρητικότητας του σακκιδίου. Έτσι σε
κάθε βήμα θα βάζουμε στο σακκίδιο το αντικείμενο που πετυχαίνει το μεγαλύτερο κέρδος ανά μονάδα
χωρητικότητας.
Ταξινομούμε λοιπόν τα αντικείμενα με βάση το λόγο wvii . Οι λόγοι αυτοί για τα αντικείμενα 1, 2 και
24
15
3 είναι 25
18 = 1:39, 15 = 1:6 και 10 = 1:5. Άρα πρώτο θα θεωρήσουμε το αντικείμενο 2, έπειτα το
αντικείμενο 3 και στο τέλος το αντικείμενο 1. Θα έχουμε λοιπόν (x1 ; x2 ; x3 ) = (0; 1; 12 ) με συνολικό
κέρδος 31:5. Απομένει τώρα να δούμε γιατί η στρατηγική αυτή είναι βέλτιστη.
Το παραπάνω παράδειγμα φανερώνει ότι η επιλογή του κριτηρίου βελτιστοποίησης (στρατηγική επιλογής
των αντικειμένων) δεν είναι πάντα προφανής. Από τη στιγμή όμως που επιλεγεί το κατάλληλο κριτήριο ο
αλγόριθμος είναι συνήθως πολύ απλός στην υλοποίησή του: Τα αντικείμενα επιλέγονται ένα-ένα με βάση
το κριτήριο. Θα δείξουμε τώρα ότι η τρίτη στρατηγική δίνει optimal λύσεις.
Θεώρημα 1 Ας είναι wv11 ¸ wv22 ¸ ¢ ¢ ¢ ¸ wvnn . Τότε ο greedy αλγόριθμος που επιλέγει τα αντικείμενα με βάση
το μεγαλύτερο λόγο wvii δίνει την optimal λύση στο knapsack πρόβλημα.
Απόδειξη: Για την απόδειξη θα χρησιμοποιήσουμε την τεχνική που αναφέρουμε στα εισαγωγικά των
σημειώσεων: θα δείξουμε ότι κάθε βέλτιστη λύση μπορεί, με κατάλληλες αλλαγές, να μετασχηματιστεί σε
μία που θα έχει τη μορφή της greedy.
Ας είναι λοιπόν X = (x1 ; x2 ; : : : ; xn ) η λύση που παράγεται από τον greedy αλγόριθμο. Αν όλα τα xi
είναι ίσα με 1, τότε προφανώς η λύση είναι βέλτιστη αφού όλα τα αντικείμενα χωράνε στο σακκίδιο. Έστω
= 1. Η λύση θα έχει τη μορφή X = (1; 1; : : : ; 1; xj ; 0; : : : ; 0),
λοιπόν j ο πρώτος δείκτης για τον οποίο xj 6
όπου xj < 1 και όλα τα xi , με i > j, είναι ίσα με 0 (Γιατί;).
Έστω επίσης Y = (y1 ; y2 ; : : : ; yn ) μία optimal λύση, και ας είναι k ο πρώτος δείκτης για τον οποίο
yk 6
; : : : ; xk¡1 ; yk ; : : : ; yn ). Μία απλή ανάλυση περιπτώσεων, η οποία
= xk . Θα είναι λοιπόν YP= (x1 ; x2P
χρησιμοποιεί το γεγονός ότι
xi wi = yi wi = W και αφήνεται σαν άσκηση, δείχνει ότι yk < xk .
Αφού σκοπός μας είναι να μεταμορφώσουμε σταδιακά τη Y σε X, ας αυξήσουμε το yk σε xk και ας
μειώσουμε όσα από τα (yk+1 ; : : : ; yn ) είναι απαραίτητο ώστε το βάρος να είναι πάλι W . Παίρνουμε έτσι
μία νέα λύση Z = (z1 ; z2 ; : : : ; zk ; : : : ; zn ) με zi = xi , για 1 ∙ i ∙ k, για την οποία ισχύει
X
i>k
yi wi ¡
X
i>k
zi wi = wk zk ¡ wk yk
(3)
4
Greedy Algorithms
Ας υπολογίσουμε λοιπόν την αξία (ή το κέρδος) της Z.
P
P
P
=
i zi vi
i<k zi vi + zk vk +
i>k zi vi
P
P
P
P
=
i<k zi vi + zk vk +
i>k zi vi +
i yi vi ¡
i yi vi
P
P
=
i yi vi + (zk ¡ yk )vk ¡
i>k (yi ¡ zi )vi
P
P
vk
vi
=
i yi vi + (zk ¡ yk )wk wk ¡
i>k (yi ¡ zi )wi wi
P
P
vk
vk
¸
i yi vi + (zk ¡ yk )wk wk ¡
i>k (yi ¡ zi )wi wk
P
P
vk
y
v
+
[(z
¡
y
)w
¡
(y
¡
z
)w
]
=
k
k
k
i
i wk
i i i
i>k i
P
=
i yi vi
γιατί
vk
wk
¸
vi
wi ; i
>k
από τη σχέση (3)
P
P ΕφόσονPη Y είναι optimal, η αξία της i yi vi θα είναι η καλύτερη δυνατή. Όμως μόλις δείξαμε ότι
i zi v i ¸
i yi vi , άρα και η Z θα είναι βέλτιστη. Καταφέραμε λοιπόν να μετατρέψουμε τη Y σε μία λύση
που μοιάζει περισσότερο με τη X, και η οποία παραμένει βέλτιστη. Επαναλαμβάνοντας τα παραπάνω όσες
φορές χρειάζεται, καταλήγουμε ακριβώς στη X αποδεικνύοντας έτσι ότι ο greedy αλγόριθμος είναι optimal.
Πόσος είναι ο χρόνος του αλγορίθμου; Χρειάζεται χρόνος O(n log n) για την ταξινόμηση των λόγων
}
vi =wi σύν χρόνος O(n) για την επιλογή των αντικειμένων. Άρα συνολικά O(n log n).
Βέλτιστη Ακολουθία Συγχώνευσης Αρχείων
Στο πρόβλημα αυτό μας δίνονται n ταξινομημένα αρχεία και μας ζητείται να βρούμε μία ακολουθία
συγχωνεύσεων των αρχείων ανά δύο, ώστε στο τέλος να μας μείνει μόνο ένα αρχείο. Το πρόβλημα
φυσικά είναι ότι δύο αρχεία με p και q αριθμούς αντίστοιχα, χρειάζονται περίπου p + q μετακινήσεις ή
συγκρίσεις αριθμών. Ορίζουμε λοιπόν το κόστος μίας συγχώνευσης να είναι p + q. Έτσι διαφορετικές
ακολουθίες συγχωνεύσεων μπορεί να οδηγούν σε διαφορετικό συνολικό κόστος. Στόχος λοιπόν είναι να
βρεθεί μία ακολουθία συγχωνεύσεων των αρχείων ανά δύο που να έχει τον ελάχιστο συνολικό κόστος
(αριθμό συγκρίσεων, κλπ.).
Παράδειγμα 2 Θεωρείστε τέσσερα ταξινομημένα αρχεία F1 ; F2 ; F3 ; F4 με αντίστοιχα μεγέθη (πλήθος αριθμών
που περιέχουν) 10; 20; 5; 30. Ύπάρχουν πολλοί διαφορετικοί τρόποι συγχώνευσης, οι οποίοι αποτελούν τις
feasible λύσεις του προβλήματος.
1. Έστω ότι πρώτα συγχωνεύουμε τα F1 ; F2 , με κόστος 10 + 20 = 30, δημιουργώντας ένα αρχείο F12
μεγέθους 30. Στη συνέχεια συγχωνεύουμε τα F3 ; F4 , με κόστος 5 + 30 = 35, για να πάρουμε ένα
αρχείο F34 . Και τέλος τα F12 και F34 για να πάρουμε το τελικό αρχείο, κάνοντας άλλες 30 + 35 = 65
συγκρίσεις. Το συνολικό κόστος της συγχώνευσης είναι 30 + 35 + 65 = 130.
2. Θεωρείστε τώρα την εξής ακολουθία: Πρώτα συγχωνεύουμε τα F1 ; F3 με κόστος 10 + 5 = 15. Έπειτα
το αποτέλεσμα με το F2 , κάνοντας άλλες 15 + 20 = 35 κινήσεις, και τέλος το αποτέλεσμα με το F4 ,
με κόστος 35 + 30 = 65. Ο συνολικός αριθμός συγκρίσεων είναι τώρα 15 + 35 + 65 = 115, αρκετά
μικρότερος από αυτόν της πρώτης λύσης.
Όπως και στην περίπτωση της πολλαπλασιασμού ακολουθίας πινάκων, η διαδικασία των συγχωνεύσεων
μπορεί να αναπαρασταθεί από ένα δέντρο, όπως φαίνεται και στο Σχήμα 1.
Τα φύλλα του δέντρου αναπαριστούν τα αρχεία που θέλουμε να συγχωνεύσουμε. Οι υπόλοιποι κόμβοι
είναι εσωτερικοί, καθένας από αυτούς έχει δύο παιδιά και αναπαριστά το αρχείο που προκύπτει από τη
συγχώνευση των αρχείων που αντιστοιχούν στα παιδιά του. Το κόστος κάθε μερικής συγχώνευσης είναι ο
αριθμός στο κέντρο του εσωτερικού κόμβου. Το άθροισμα των αριθμών αυτών αναπαριστά το συνολικό
κόστος των συγχωνεύσεων.
Τα δύο δέντρα που φαίνονται στο Σχήμα 1 αντιστοιχούν στις δύο feasible λύσεις του Παραδείγματος
2. Παρατηρείστε ότι αν di είναι η απόσταση του φύλλου (αρχείου) Fi από τη ρίζα και fi το μέγεθος του
Διδάσκων: Τάσος Δημητρίου
5
65
30
35
35
F4
20
5
30
F1
F2
F3
F4
Μία άλλη εφαρμογή των δυαδικών δέντρων είναι για κωδικοποίηση μηνυμάτων με τη μέθοδο Huffman.
Η εφαρμογή αυτή υπάρχει στο βιβλίο και μπορείτε να τη διαβάσετε από εκεί.
20
15
10
Greedy Algorithms
Αν τώρα αντικαταστήσουμε αυτόν τον εσωτερικό κόμβο με ένα εξωτερικό μεγέθους f1 +f2 (προσποιούμαστε δηλαδή ότι αντί για δύο αρχεία μεγέθους f1 ; f2 , έχουμε ένα αρχείο μεγέθους f1 + f2 ) το αποτέλεσμα
θα είναι πάλι ένα optimal δέντρο, αυτή τη φορά όμως για n ¡ 1 αρχεία με μεγέθη f1 + f2 ; f3 ; : : : ; fn . Από
την επαγωγική όμως υπόθεση ο greedy κατασκευάζει optimal δέντρα για n ¡ 1 αρχεία. Άρα, σε συνδυασμό
με το πρώτο βήμα, συμπεραίνουμε ότι ο greedy δουλεύει σωστά και για n αρχεία.
}
65
30
6
F2
(α)
10
5
F1
F3
(β)
Σχήμα 1: Δέντρα Συγχώνευσης
αρχείου, τότε τα στοιχεία του Fi πρέπει να μετακινηθούν di φορές μέχρι να φτάσουν στη ρίζα του δέντρου.
Για παράδειγμα θεωρείστε το αρχείο F1 . Στο πρώτο δέντρο τα στοιχεία του πρέπει να μετακινηθούν 2
φορές (d1 = 2), ενώ στο δεύτερο 3 (d1 = 3) μέχρι να φτάσουν στη ρίζα. Άρα, δοθέντος κάποιου δέντρου
συγχώνευσης, ο συνολικός αριθμός μετακινήσεων στοιχείων (το κόστος της συγχώνευσης) είναι
C=
n
X
d i fi :
(4)
i=1
Ο τύπος αυτός για το δέντρο (α) δίνει κόστος 2 ¢ 10 + 2 ¢ 20 + 2 ¢ 5 + 2 ¢ 30 = 130, ενώ για το δέντρο
(β), 3 ¢ 10 + 2 ¢ 20 + 3 ¢ 5 + 1 ¢ 30 = 115. Αρκεί λοιπόν να βρούμε ένα κριτήριο βελτιστοποίησης που
να ελαχιστοποιεί την ποσότητα C. Για το συγκεκριμένο πρόβλημα το κριτήριο προκύπτει σχετικά εύκολα.
Αφού η συγχώνευση ενός αρχείου p στοιχείων με ένα άλλο q στοιχείων έχει κόστος p + q, το κριτήριο είναι
σε κάθε βήμα να συγχωνεύουμε τα αρχεία με τα δύο μικρότερα μεγέθη.
Το δέντρο στο Σχήμα 1(β) προέκυψε με αυτό τον τρόπο. Στο πρώτο βήμα, τα δύο μικρότερα αρχεία
είναι τα F1 ; F3 , τα οποία συγχωνεύονται σε ένα αρχείο F13 μεγέθους 5 + 10 = 15. Απομένουν τώρα 3
αρχεία, με μεγέθη 15, 20 και 30, οπότε στο δεύτερο βήμα επιλέγονται τα F13 και F2 . Δημιουργείται έτσι
ένα αρχείο μεγέθους 15 + 20 = 35, το οποίο με τη σειρά του στο τελευταίο βήμα συγχωνεύεται με το F4 .
Θα αποδείξουμε στη συνέχεια ότι η παραπάνω στρατηγική είναι βέλτιστη.
Θεώρημα 2 Ο greedy αλγόριθμος επιστρέφει το optimal δέντρο συγχώνευσης n αρχείων μεγέθους f1 ; f2 ; : : : ; fn .
:-)
Απόδειξη: Θα αποδείξουμε το θεώρημα χρησιμοποιώντας επαγωγή στον αριθμό των αρχείων. Για n = 1; 2
ο greedy προφανώς επιστρέφει το βέλτιστο δέντρο. Έστω λοιπόν ότι αλγόριθμος δουλεύει σωστά για κάθε
m-άδα αρχείων, όπου 1 ∙ m < n. Θα δείξουμε ότι ο αλγόριθμος επιστρέφει το optimal δέντρο και για
m = n.
Ας είναι f1 ∙ f2 ∙ ¢ ¢ ¢ ∙ fn , οπότε f1 ; f2 είναι τα μεγέθη των αρχείων που συγχωνεύονται στο πρώτο
βήμα του αλγόριθμου. Δημιουργείται έτσι ένα υποδέντρο T , με μία ρίζα και δύο παιδιά, του οποίου το κόστος
είναι φυσικά f1 + f2 . Ας θεωρήσουμε τώρα ένα άλλο optimal δέντρο T 0 συγχώνευσης των n παραπάνω
αρχείων. Έστω x ένας εσωτερικός κόμβος του T 0 με τη μεγαλύτερη απόσταση από τη ρίζα. Αν τα f1 ; f2 δεν
είναι τα παιδιά του x, τότε μπορούμε να τα ανταλλάξουμε με τα παιδιά του χωρίς να αυξηθεί το συνολικό
κόστος του δέντρου, μιας και τα f1 ; f2 έχουν τις μικρότερες τιμές. Επειδή όμως το T 0 ήταν optimal, και το
νέο δέντρο T 00 που προκύπτει θα είναι optimal. Συμπεραίνουμε λοιπόν ότι κάθε optimal δέντρο μπορεί να
μετατραπεί σε ένα που περιέχει το υποδέντρο T , δηλαδή περιέχει ένα εσωτερικό κόμβο με φύλλα τα f1 ; f2 .
Ïé óçìåéþóåéò áõôÝò áðïôåëïýí ôìÞìá âéâëßïõ. Äåí
åðéôñÝðåôáé ç ÷ñÞóç ôïõò ãéá ðáñáãùãÞ äéäáêôéêïý
Þ Üëëïõ õëéêïý ÷ùñßò ôçí Üäåéá ôïõ óõããñáöÝá.