ιάλεξη : λάχιστα εννητορικά ένδρα Αλγόριθμος Kruskal Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Ο αλγόριθμος του Kruskal για εύρεση σε γράφους Παράδειγμα κτέλεσης ιδάσκων: Κωνσταντίνος Κώστα ιαφάνειες: ημήτρης εϊναλιπούρ ΠΛ 35 ομές εδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. -
Ο αλγόριθμος του Kruskal Ακόμα ένας άπληστος (greedy) αλγόριθμος που υπολογίζει το λάχιστο εννητορικό ένδρο (). νώ ο αλγόριθμος του Prim επεξεργάζεται μια-μια τις κορυφές, ο αλγόριθμος του Kruskal επεξεργάζεται μια-μια τις ακμές του γράφου. πίσης, ενώ σε κάθε βήμα του αλγόριθμου του Prim οι επιλεγμένες ακμές σχηματίζουν ένα δένδρο, στην περίπτωση του αλγόριθμου Kruskal, σχηματίζουν ένα δάσος (ένα σύνολο από δένδρα). Κεντρική ιδέα. Αρχικά το δάσος Τ είναι άδειο. πεξεργαζόμαστε μια-μια τις ακμές, σε αύξουσα σειρά βάρους. ν η εισαγωγή της e στο Τ δεν προκαλεί κύκλο, τότε προσθέτουμε την e στο Τ, δηλαδή Τ := Τ {e}. ΠΛ 35 ομές εδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. -
Παράδειγμα κτέλεσης Αρχική Κατάσταση ράφος G Μετά από επιλογή της πρώτης ακμής (Β,) 6 Β Β -E = - = Β- = - = Β- = 5 - = 6 Α-Β = 7 Α- = ΠΛ 35 ομές εδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. -3
Παράδειγμα κτέλεσης Μετά από επιλογή της δεύτερης ακμής (,) Μετά από επιλογή της τρίτης ακμής (Β,) 6 -E = - = Β- = - = Β- = 5 - = 6 Α-Β = 7 ΠΛ 35 ομές εδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. Α- = -4
Παράδειγμα κτέλεσης Μετά από επιλογή της τέταρτης ακμής (Β,) Μετά από επιλογή της πέμπτης ακμής (Α,Β) 7 5 5 ράφος G 6 -E = - = Β- = - = Β- = 5 - = 6 Α-Β = 7 Α- = (Κύκλος) (Κύκλος) Τέλος -5
Αποδοτική ξάλειψη Κύκλων H ταξινόμηση των Άκμων είναι απλή, δηλαδή ταξινομούμε μια φορά όλες τις ακμές με κάποιο αλγόριθμο ταξινόμησης. Βασικό Πρόβλημα: Το πρόβλημα που απομένει είναι πως θα βρίσκουμε αποδοτικά εάν μια ακμή μπορεί να δημιουργήσει κύκλο Λύση Θα χρησιμοποιήσουμε ένα πίνακα [n] (TreeID) ο οποίος μας υποδεικνύει για κάθε κορυφή v σε πιο δένδρο ανήκει η v. Π.χ. εάν θέλω να προσθέσω μια ακμή (u,v) και u & v ανήκουν στο ίδιο δένδρο ([u]==τid[v]), τότε αυτή η ακμή θα δημιουργήσει κύκλο. πομένως δε θα προσθέσω την (u,v) u v To (u,v) θα δημιουργήσει κύκλο γιατί και τα δυο ανήκουν στο ίδιο (i.e., ) To (u,w) δεν θα δημιουργήσει κύκλο γιατί οι δυο κόμβο ανήκουν σε διαφορετικά ΤΙD (i.e., και ) w -6
Υλοποίηση του Αλγορίθμου Kruskal Kruskal(graph G(V,E)){ Tree = {}; // Το : Ένα σύνολο ακμών (αρχικά κενό) [ V ] = {} // Πίνακας που κρατά το TreeID του κάθε κόμβου Count = ; // Μετρητής που κρατά από πόσες κορυφές πέρασα sortedges(e); // Ταξινόμηση Άκμων σε χρόνο O( E.log E ) // ημιουργούμε ένα δάσος από δένδρα μεγέθους for (i=; i< V ; i++) // χρόνο Θ( V ) [i] = i; for (i=; i< E ; i++) { // χρόνο O( E ) // ανάκτηση επόμενης (μικρότερης) ακμής (u,v) = nextedge(); // χρόνο Θ() If ([u]!= [v]) { Tree = Tree {(u,v)}; // Αν ανήκουν σε διαφορετικά δένδρα // Προσθήκη Ακμής } } // Μετρούμε ποιος από τους u,v εμφανίζεται περισσότερο στο // και επιστρέφουμε τον μεγαλύτερο σαν TreeID x x = occurence(, u, v); // χρόνο O( V ) // Ανάθεση TreeID x σε όλους που έχουν [u] ή [v] count = merge([u],[v],x); } if (count == V ) break; 3 4 5 Συνολικός χρόνος: O( E.log E + V + E * V ) -7 V
κτέλεση της Υλοποίησης Kruskal 6 3 4 5 { -E =, - =, Β- =, - =, Β- = 5, - = 6, Α-Β = 7, Α- = }. Nextedge => (,E). []!= [E]? => YES, πομένως Tree = {} {(Β,)}; 3. Merge([],[E],); 3 5 4. Nextedge => (,) 5. []!= [E]? => YES, πομένως Tree={(Β,)} {(,)}; 6. Merge([],[E],); 5 ΠΛ 35 ομές εδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. -8
κτέλεση της Υλοποίησης Kruskal 6 5 { -E =, - =, Β- =, - =, Β- = 5, - = 6, Α-Β = 7, Α- = } 7. Nextedge => (,) 8. []!= []? => YES,πομένως Tree = {(Β,),(,)} {(Β,)};. Merge([],[],);. Nextedge => (,). []!= []? => ΝΟ, πομένως δεν χρησιμοποιούμε το (,); ΠΛ 35 ομές εδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. -
κτέλεση της Υλοποίησης Kruskal 6 { -E =, - =, Β- =, - =, Β- = 5, - = 6, Α-Β = 7, Α- = }. Nextedge => (,) 3. []!=[]? => YES,πομένως Tree = {(Β,),(,), (Β,)} {(Β,)}; 4. Merge([],[],); 5. Nextedge => (,) 6. []!= []? => ΝΟ, πομένως δεν χρησιμοποιούμε το (,); 7. Nextedge => (Α,Β) 8. [Α]!= [Β]? => YES, πομένως Tree = {(Β,),(,), (Β,), (Β,)} {(Α,Β)}; δώ βρήκαμε V vertices, επομένως διακόπτουμε την αναζήτηση. TO είναι το Τree = {(Β,),(,), (Β,), (Β,),(Α,Β)}; ΠΛ 35 ομές εδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ. -