Διάλεξη 3: Ελάχιστα Γεννητορικά Δέντρα Ο λγόριθμος Kruskal Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: -Ο αλγόριθμος του Kruskalγια εύρεση ΕΓΔ σε γράφους - Παράδειγμα Εκτέλεσης Διδάσκων: Παναγιώτης νδρέου ΕΠΛ03 Δομές Δεδομένων και λγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.
Ο αλγόριθμος του Kruskal κόμα ένας άπληστος (greedy)αλγόριθμος που υπολογίζει το Ελάχιστο Γεννητορικό Δένδρο (ΕΓΔ). Ενώ ο αλγόριθμος του Primεπεξεργάζεται μια-μια τιςκορυφές, ο αλγόριθμος του Kruskalεπεξεργάζεται μια-μια τις ακμέςτου γράφου. Επίσης, ενώ σε κάθε βήμα του αλγόριθμου του Primοι επιλεγμένες ακμές σχηματίζουν ένα δένδρο, στην περίπτωση του αλγόριθμου Kruskal, σχηματίζουν ένα δάσος(ένα σύνολο από δένδρα). Κεντρική ιδέα. ρχικά τοδάσος Τ είναι άδειο. Επεξεργαζόμαστε μια-μια τις ακμές, σε αύξουσα σειρά βάρους. Aν η εισαγωγή της e στο Τ δεν προκαλεί κύκλο,τότε προσθέτουμε την eστο Τ, δηλαδή Τ := Τ {e}. ΕΠΛ03 Δομές Δεδομένων και λγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.
Παράδειγμα Εκτέλεσης Ταξινομημένες κμές με το Βάρος ΕΠΛ03 Δομές Δεδομένων και λγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 3 3 4 8
Παράδειγμα Εκτέλεσης ρχική Κατάσταση Μετά από επιλογή της πρώτης ακμής (Β,Ε) Ταξινομημένες κμές 3 4 8 ΕΠΛ03 Δομές Δεδομένων και λγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 4
Παράδειγμα Εκτέλεσης ΕΠΛ03 Δομές Δεδομένων και λγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 4 8 3 Ταξινομημένες κμές Μετά από επιλογή της πρώτης ακμής (,Ε)
Παράδειγμα Εκτέλεσης ΕΠΛ03 Δομές Δεδομένων και λγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 4 8 3 Ταξινομημένες κμές Μετά από επιλογή της τρίτης ακμής (Β,)
Παράδειγμα Εκτέλεσης ΕΠΛ03 Δομές Δεδομένων και λγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 4 8 3 Ταξινομημένες κμές Μετά από επιλογή της τέταρτης ακμής (Β,)
Παράδειγμα Εκτέλεσης ΕΠΛ03 Δομές Δεδομένων και λγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 8 4 8 3 Ταξινομημένες κμές Μετά από επιλογή της τέταρτης ακμής (Β,)
ποδοτική Εξάλειψη Κύκλων H ταξινόμηση των Άκμων είναι απλή, δηλαδή ταξινομούμε μια φορά όλες τις ακμές με κάποιο αλγόριθμο ταξινόμησης. Βασικό Πρόβλημα:Το πρόβλημα που απομένει είναι πως θα βρίσκουμε αποδοτικά εάν μια ακμή μπορεί να δημιουργήσει κύκλο Λύση Θα χρησιμοποιήσουμε ένα πίνακαti[n](treei)ο οποίος μας υποδεικνύει για κάθε κορυφή v σε πιο δένδρο ανήκειη v. Π.χ. εάνθέλω να προσθέσω μια ακμή (u,v)και u & v ανήκουν στο ίδιο δένδρο (TI[u]==ΤI[v]), τότε αυτή η ακμή θα δημιουργήσει κύκλο. Επομένως δε θα προσθέσω την (u,v) w u To (u,v) θα δημιουργήσει κύκλο γιατί και τα δυο ανήκουν στο ίδιο TI (i.e., ) To (u,w) δεν θα δημιουργήσει κύκλο γιατί οι δυο κόμβο ανήκουν σε διαφορετικά ΤΙ (i.e., και ) ΕΠΛ03 Δομές Δεδομένων και λγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.
Υλοποίηση του λγορίθμου Kruskal Kruskal(graph G(V,)){ Tree = {}; // Το ΕΓ : Ένα σύνολο ακµών (αρχικά κενό) TI[ V ] = {} // Πίνακας που κρατά το TreeI του κάθε κόµβου ount = 0; // Μετρητής που κρατά από πόσες κορυφές πέρασα sortdges(); // Ταξινόµηση Άκµων σε χρόνο O(.log ) // ηµιουργούµε ένα δάσος από δένδρα µεγέθους for (i=0; i< V ; i++) // χρόνο Θ( V ) TI[i] = i; for (i=0; i< ; i++) { // χρόνο O( ) // ανάκτηση επόµενης (µικρότερης) ακµής (u,v) = nextdge(); // χρόνο Θ() If (TI[u]!= TI[v]) { // ν ανήκουν σε διαφορετικά δένδρα Tree = Tree {(u,v)}; // Προσθήκη κµής // Μετρούµε ποιος από τους u,v εµφανίζεται περισσότερο στο TI // και επιστρέφουµε τον µεγαλύτερο σαν TreeI x x = occurence(ti, u, v); // χρόνο O( V ) } } // νάθεση TreeI x σε όλους που έχουν TI[u] ή TI[v] count = merge(ti[u],ti[v],x); } if (count == V ) break; Συνολικός χρόνος: O(.log + V + * V ) ΕΠΛ03 Δομές Δεδομένων και λγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 0
Εκτέλεση της Υλοποίησης Kruskal. Nextedge => (,). TI[]!= TI[]?=> YS, ΕπομένωςTree = {} {(Β,Ε)}; 3. Merge(TI[],TI[],); 4. Nextedge => (,Ε). TI[]!= TI[]? => YS, Επομένως Tree={(Β,Ε)} {(,Ε)};. Merge(TI[],TI[],); Ταξινομημένες κμές { -=, -Ε=, Β-=, Ε-=, Β-=, -=, -Β=, -= } TI TI TI 0 3 4 A 0 3 A 0 A ΕΠΛ03 Δομές Δεδομένων και λγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.
Εκτέλεση της Υλοποίησης Kruskal. Nextedge => (,) 8. TI[]!= TI[]?=> YS,ΕπομένωςTree = {(Β,Ε),(,Ε)} {(Β,)};. Merge(TI[],TI[],); 0. Nextedge => (Ε,) Ταξινομημένες κμές { -=,-Ε=, Β-=, Ε-=, Β-=, -=, -Β=, -= }. TI[Ε]!= TI[]? => ΝΟ, Επομένως δεν χρησιμοποιούμε το (Ε,); TI TI TI 0 A 0 A 0 A ΕΠΛ03 Δομές Δεδομένων και λγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.
Εκτέλεση της Υλοποίησης Kruskal. Nextedge => (,) 3.TI[]!=TI[]?=> YS,ΕπομένωςTree = {(Β,Ε),(,Ε), (Β,)} {(Β,)}; 4. Merge(TI[],TI[],);. Nextedge => (,) Ταξινομημένες κμές { -=, -Ε=, Β-=, Ε-=, Β-=, -=, -Β=, -= }. TI[Ε]!= TI[]? => ΝΟ, Επομένως δεν χρησιμοποιούμε το (,); TI TI TI 0 A 0 A 0 A ΕΠΛ03 Δομές Δεδομένων και λγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 3
Εκτέλεση της Υλοποίησης Kruskal. Nextedge => (,Β) 8. TI[]!= TI[Β]? => YS, ΕπομένωςTree = {(Β,Ε),(Δ,Ε), (Β,Ζ), (Β,Γ)} {(,Β)}; Ταξινομημένες κμές { -=, -Ε=, Β-=, Ε-=, Β-=, -=, -Β=, -= } TI 0 A TI A Εδώ βρήκαμε V vertices, επομένως διακόπτουμε την αναζήτηση. TO ΕΓΔ είναι το {(Β,Ε),(Δ,Ε), (Β,Ζ), (Β,Γ),(,Β)}; ΕΠΛ03 Δομές Δεδομένων και λγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ. 4
Παράδειγμα Εκτέλεσης ρχική Κατάσταση Ταξινομημένες κμές { A-=, -=, Β-=, Ε-=, Β-=, -=, -Β=, -= } 0. TI 0 3 4 A TI. {A-} TI. {-} TI 3. {-} TI 4. {-}. {-} = τίποτα TI. {-}. break 0 0 4 A 0 0 4 A 0 0 4 A 0 0 A A ΕΠΛ03 Δομές Δεδομένων και λγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.