Κοντινότεροι Κοινοί Πρόγονοι α βγ θ δεζ η π ν ι κλμ ρσ τ κκπ(λ,ι)=α, κκπ(τ,σ)=ν, κκπ(λ,π)=η κκπ(π,σ)=γ, κκπ(ξ,ο)=κ ξο κκπ(ι,ξ)=β, κκπ(τ,θ)=θ, κκπ(ο,μ)=α Μας δίνεται ένα δένδρο Τ με ρίζα και μια λίστα Λ από ζεύγη κόμβων. Θέλουμε να υπολογίσουμε τον κκπ(x,y ) για κάθε ζεύγος κόμβων {x,y} της Λ. Λ = { {ι,ξ}, {τ,θ}, {ο,μ}, {λ,ι}, {τ,σ}, {λ,π}, {π,σ}, {ξ,ο} }
Κοντινότεροι Κοινοί Πρόγονοι Στατικό δένδρο, γνωστά ζεύγη Μας δίνεται ένα δένδρο Τ και μια λίστα Λ από ζεύγη κόμβων. Θέλουμε να υπολογίσουμε τον κκπ(x,y ) για κάθε ζεύγος κόμβων {x,y} της Λ. Στατικό δένδρο, άγνωστα ζεύγη Μας δίνεται ένα δένδρο Τ το οποίο θέλουμε να επεξεργαστούμε ώστε να μπορούμε να υπολογίσουμε γρήγορα τον κκπ(x,y ) για οποιοδήποτε ζεύγος κόμβων {x,y}. Δυναμικό πρόβλημα Το δένδρο Τ μπορεί να μεταβάλλεται.
Κοντινότεροι Κοινοί Πρόγονοι α βγ θ δεζ η π ν ι κλμ ρσ τ κκπ(π,σ)=γ ξο Στατικό δένδρο, γνωστά ζεύγη Απλοϊκή λύση για υπολογισμό κκπ(x,y) Ανεβαίνουμε τα μονοπάτια από το x και το y προς τη ρίζα μέχρι να βρούμε τον πρώτο κοινό κόμβο. για ζεύγη
Κοντινότεροι Κοινοί Πρόγονοι α βγ θ δεζ η π ν ι κλμ ρσ τ ξο Στατικό δένδρο, γνωστά ζεύγη Ιδέα: Συρρικνώνουμε τα μονοπάτια που έχουμε ήδη επεξεργαστεί. Η επεξεργασία των κόμβων πρέπει να γίνει από τα φύλλα προς τη ρίζα α βγ θ δεζ η π ν κλμ ρσ τ ξο συρρίκνωση του ι στον δ κκπ(ι,ξ) = κκπ(δ,ξ)
Κοντινότεροι Κοινοί Πρόγονοι Στατικό δένδρο, γνωστά ζεύγη Σε κάθε κόμβο x του δένδρου αποθηκεύουμε μια λίστα κόμβων Επισκεπτόμαστε τους κόμβους σε σειρά μεταδιάταξης του Επεξεργασία κόμβου : Εξετάζουμε τη λίστα Για κάθε κόμβο που έχουμε ήδη επεξεργαστεί Θέτουμε κόμβος στον οποίο έχει συμπιεστεί ο Συρρικνώνουμε τον στον γονέα του στο
Κοντινότεροι Κοινοί Πρόγονοι α βγ θ δεζ η π ν ι κλμ ρσ τ ξο Λ(ι)={ξ,λ} Λ(ξ)={ι,ο}Λ(ο)={μ,ξ} Λ(λ)={ι,π} Λ(τ)={θ,σ} Λ(π)={λ,σ}Λ(σ)={τ,π} Λ(θ)={τ} Λ(μ)={ο}
Κοντινότεροι Κοινοί Πρόγονοι α βγ θ δεζ η π ν κλμ ρσ τ ξο {ι} Λ(ξ)={ι,ο}Λ(ο)={μ,ξ} Λ(λ)={ι,π} Λ(τ)={θ,σ} Λ(π)={λ,σ}Λ(σ)={τ,π} Λ(θ)={τ} Λ(μ)={ο}
Κοντινότεροι Κοινοί Πρόγονοι α βγ θ εζ η π ν κλμ ρσ τ ξο {ι,δ} Λ(ξ)={ι,ο}Λ(ο)={μ,ξ} Λ(λ)={ι,π} Λ(τ)={θ,σ} Λ(π)={λ,σ}Λ(σ)={τ,π} Λ(θ)={τ} Λ(μ)={ο} κκπ(ξ,ι)=β
Κοντινότεροι Κοινοί Πρόγονοι α βγ θ εζ η π ν κλμ ρσ τ 4 4 ο {ι,δ} Λ(ο)={μ,ξ} Λ(λ)={ι,π} Λ(τ)={θ,σ} Λ(π)={λ,σ}Λ(σ)={τ,π} Λ(θ)={τ} Λ(μ)={ο} {ξ} κκπ(ο,ξ)=κ
Κοντινότεροι Κοινοί Πρόγονοι α βγ θ εζ η π ν κλμ ρσ τ {ι,δ} Λ(λ)={ι,π} Λ(τ)={θ,σ} Λ(π)={λ,σ}Λ(σ)={τ,π} Λ(θ)={τ} Λ(μ)={ο} {ξ,ο}
Κοντινότεροι Κοινοί Πρόγονοι α βγ θ εζ η π ν λμ ρσ τ {ι,δ} Λ(λ)={ι,π} Λ(τ)={θ,σ} Λ(π)={λ,σ}Λ(σ)={τ,π} Λ(θ)={τ} Λ(μ)={ο} {ξ,ο,κ}
Κοντινότεροι Κοινοί Πρόγονοι α βγ θ ζ η π ν λμ ρσ τ {ι,δ,ξ,ο,κ,ε} Λ(λ)={ι,π} Λ(τ)={θ,σ} Λ(π)={λ,σ}Λ(σ)={τ,π} Λ(θ)={τ} Λ(μ)={ο}
Κοντινότεροι Κοινοί Πρόγονοι α γ θ ζ η π ν λμ ρσ τ {ι,δ,ξ,ο,κ,ε,β} Λ(λ)={ι,π} Λ(τ)={θ,σ} Λ(π)={λ,σ}Λ(σ)={τ,π} Λ(θ)={τ} Λ(μ)={ο}
Κοντινότεροι Κοινοί Πρόγονοι α γ θ {ζ} η π ν λμ ρσ τ {ι,δ,ξ,ο,κ,ε,β} Λ(λ)={ι,π} Λ(τ)={θ,σ} Λ(π)={λ,σ}Λ(σ)={τ,π} Λ(θ)={τ} Λ(μ)={ο} κκπ(λ,ι)=α
Κοντινότεροι Κοινοί Πρόγονοι α γ θ {ζ} η π ν μ ρσ τ {ι,δ,ξ,ο,κ,ε,β} {λ} Λ(τ)={θ,σ} Λ(π)={λ,σ}Λ(σ)={τ,π} Λ(θ)={τ} Λ(μ)={ο} κκπ(π,λ)=η
Κοντινότεροι Κοινοί Πρόγονοι α γ θ {ζ} η ν μ ρσ τ {ι,δ,ξ,ο,κ,ε,β} {λ} Λ(τ)={θ,σ} {π} Λ(σ)={τ,π} Λ(θ)={τ} Λ(μ)={ο} κκπ(μ,ο)=α
Κοντινότεροι Κοινοί Πρόγονοι α γ θ {ζ} η ν ρσ τ {ι,δ,ξ,ο,κ,ε,β} {λ,π,μ} Λ(τ)={θ,σ} Λ(σ)={τ,π} Λ(θ)={τ}
Κοντινότεροι Κοινοί Πρόγονοι α γ θ ν ρσ τ {ι,δ,ξ,ο,κ,ε,β} {λ,π,μ,ζ,η} Λ(τ)={θ,σ} Λ(σ)={τ,π} Λ(θ)={τ}
Κοντινότεροι Κοινοί Πρόγονοι α γ θ ν ρσ {ι,δ,ξ,ο,κ,ε,β} {λ,π,μ,ζ,η} {τ} Λ(σ)={τ,π} Λ(θ)={τ}
Κοντινότεροι Κοινοί Πρόγονοι α γ θ ν σ {ι,δ,ξ,ο,κ,ε,β} {λ,π,μ,ζ,η} {τ,ρ} Λ(σ)={τ,π} Λ(θ)={τ} κκπ(σ,τ)=ν κκπ(σ,π)=γ
Κοντινότεροι Κοινοί Πρόγονοι α γ θ ν {ι,δ,ξ,ο,κ,ε,β} {λ,π,μ,ζ,η} {τ,ρ,σ} Λ(θ)={τ}
Κοντινότεροι Κοινοί Πρόγονοι α γ θ {ι,δ,ξ,ο,κ,ε,β} {λ,π,μ,ζ,η} {τ,ρ,σ,ν} Λ(θ)={τ} κκπ(θ,τ)=θ
Κοντινότεροι Κοινοί Πρόγονοι α γ {ι,δ,ξ,ο,κ,ε,β} {λ,π,μ,ζ,η,τ,ρ,σ,ν,θ}
Κοντινότεροι Κοινοί Πρόγονοι 19 α {ι,δ,ξ,ο,κ,ε,β,λ,π,μ,ζ,η,τ,ρ,σ,ν,θ,γ}
Κοντινότεροι Κοινοί Πρόγονοι Η συρρίκνωση των κόμβων μπορεί να γίνει αποτελεσματικά με μια δομή ένωσης- εύρεσης σε ξένα σύνολα Υποστηρίζει τις παρακάτω λειτουργίες επί ενός συνόλου αντικειμένων : ένωση ( α, β ) : Αντικαθιστά τα σύνολα που περιέχουν τα α και β με την ένωση τους εύρεση ( α ) : Επιστρέφει το όνομα του συνόλου που περιέχει το αντικείμενο α ένωση ( α, β )
Δομή ένωσης-εύρεσης σε ξένα σύνολα Υποστηρίζει τις παρακάτω λειτουργίες επί ενός συνόλου αντικειμένων : ένωση ( α, β ) : Αντικαθιστά τα σύνολα που περιέχουν τα α και β με την ένωση τους εύρεση ( α ) : Επιστρέφει το όνομα του συνόλου που περιέχει το αντικείμενο α ένωση(3,6) εύρεση(2) Δομή «σταθμισμένης ένωσης με συμπίεση διαδρομής» όνομα συνόλου = ρίζα δένδρου
Δομή ένωσης-εύρεσης σε ξένα σύνολα Υποθέτουμε ότι τα αντικείμενα μας είναι ακέραιοι αριθμοί Αρχικά κάθε αντικείμενο αποτελεί ένα ξεχωριστό σύνολο μεγέθους Χρησιμοποιούμε πίνακες και μεγέθους για Αρχικοποίηση : Δομή «σταθμισμένης ένωσης» Κάθε σύνολο έχει ένα αντιπρόσωπο. Αν το αντικείμενο k είναι αντιπρόσωπος τότε ισχύει ότι και το σύνολο έχει αντικείμενα
Δομή ένωσης-εύρεσης σε ξένα σύνολα Υποθέτουμε ότι τα αντικείμενα μας είναι ακέραιοι αριθμοί δείκτης σε αντικείμενο του συνόλου που περιέχει το k ένωση ( i, j ) : Εκτελούμε p=εύρεση ( i ) και q=εύρεση ( j ). Αν το σύνολο του q έχει περισσότερα αντικείμενα από το σύνολο του p θέτουμε. Διαφορετικά θέτουμε. εύρεση ( i ) : Ξεκινώντας από το i ακολουθούμε τους δείκτες μέχρι να βρούμε αντικείμενο j τέτοιο ώστε. Επιστρέφουμε τo j. Χρησιμοποιούμε πίνακες και μεγέθους αριθμός αντικειμένων του συνόλου με αντιπρόσωπο k Δομή «σταθμισμένης ένωσης»
Δομή ένωσης-εύρεσης σε ξένα σύνολα void union(int i, int j) { int p = find(i); int q = find(j); if (p == q) return; if (size[q] > size[p]) { parent[p] = q; size[q] += size[p]; } else { parent[q] = p; size[p] += size[q]; } void find(int i) { int j = i; while (j != parent[j]) j = parent[j]; return j; } Δομή «σταθμισμένης ένωσης»
Δομή ένωσης-εύρεσης σε ξένα σύνολα Δομή «σταθμισμένης ένωσης» δάσος ένωσης-εύρεσης (1,2) (2,3) (1,3) (7,8) (4,6) (4,5) (6,7) (3,6) (5,7) (4,7) ακολουθία ενώσεων
Δομή ένωσης-εύρεσης σε ξένα σύνολα Δομή «σταθμισμένης ένωσης» δάσος ένωσης-εύρεσης (1,2) (2,3) (1,3) (7,8) (4,6) (4,5) (6,7) (3,6) (5,7) (4,7) ακολουθία ενώσεων
Δομή ένωσης-εύρεσης σε ξένα σύνολα Δομή «σταθμισμένης ένωσης» δάσος ένωσης-εύρεσης (1,2) (2,3) (1,3) (7,8) (4,6) (4,5) (6,7) (3,6) (5,7) (4,7) ακολουθία ενώσεων
Δομή ένωσης-εύρεσης σε ξένα σύνολα Δομή «σταθμισμένης ένωσης» δάσος ένωσης-εύρεσης (1,2) (2,3) (1,3) (7,8) (4,6) (4,5) (6,7) (3,6) (5,7) (4,7) ακολουθία ενώσεων
Δομή ένωσης-εύρεσης σε ξένα σύνολα Δομή «σταθμισμένης ένωσης» δάσος ένωσης-εύρεσης (1,2) (2,3) (1,3) (7,8) (4,6) (4,5) (6,7) (3,6) (5,7) (4,7) ακολουθία ενώσεων
Δομή ένωσης-εύρεσης σε ξένα σύνολα Δομή «σταθμισμένης ένωσης» δάσος ένωσης-εύρεσης (1,2) (2,3) (1,3) (7,8) (4,6) (4,5) (6,7) (3,6) (5,7) (4,7) ακολουθία ενώσεων
Δομή ένωσης-εύρεσης σε ξένα σύνολα Δομή «σταθμισμένης ένωσης» δάσος ένωσης-εύρεσης (1,2) (2,3) (1,3) (7,8) (4,6) (4,5) (6,7) (3,6) (5,7) (4,7) ακολουθία ενώσεων
Δομή ένωσης-εύρεσης σε ξένα σύνολα Δομή «σταθμισμένης ένωσης» δάσος ένωσης-εύρεσης (1,2) (2,3) (1,3) (7,8) (4,6) (4,5) (6,7) (3,6) (5,7) (4,7) ακολουθία ενώσεων
Δομή ένωσης-εύρεσης σε ξένα σύνολα Δομή «σταθμισμένης ένωσης» δάσος ένωσης-εύρεσης (1,2) (2,3) (1,3) (7,8) (4,6) (4,5) (6,7) (3,6) (5,7) (4,7) ακολουθία ενώσεων
Δομή ένωσης-εύρεσης σε ξένα σύνολα Δομή «σταθμισμένης ένωσης» δάσος ένωσης-εύρεσης (1,2) (2,3) (1,3) (7,8) (4,6) (4,5) (6,7) (3,6) (5,7) (4,7) ακολουθία ενώσεων
Δομή ένωσης-εύρεσης σε ξένα σύνολα Δομή «σταθμισμένης ένωσης» δάσος ένωσης-εύρεσης (1,2) (2,3) (1,3) (7,8) (4,6) (4,5) (6,7) (3,6) (5,7) (4,7) ακολουθία ενώσεων
Δομή ένωσης-εύρεσης σε ξένα σύνολα Ας θεωρήσουμε την ακολουθία ένωση(1,2), ένωση(3,4), ένωση(5,6), ένωση(7,8) Δομή «σταθμισμένης ένωσης»
Δομή ένωσης-εύρεσης σε ξένα σύνολα Ας θεωρήσουμε την ακολουθία ένωση(1,2), ένωση(3,4), ένωση(5,6), ένωση(7,8) ένωση(1,3), ένωση(5,7) Δομή «σταθμισμένης ένωσης»
Δομή ένωσης-εύρεσης σε ξένα σύνολα Ας θεωρήσουμε την ακολουθία ένωση(1,2), ένωση(3,4), ένωση(5,6), ένωση(7,8) ένωση(1,3), ένωση(5,7) ένωση(1,5) Δομή «σταθμισμένης ένωσης»
Δομή ένωσης-εύρεσης σε ξένα σύνολα Ομοίως, για ένωση(9,10), ένωση(11,12), ένωση(13,14), ένωση(15,16) ένωση(9,11), ένωση(13,15) ένωση(9,13) Δομή «σταθμισμένης ένωσης»
Δομή ένωσης-εύρεσης σε ξένα σύνολα ένωση(1,9) Δομή «σταθμισμένης ένωσης»
Δομή ένωσης-εύρεσης σε ξένα σύνολα ο μέγιστος αριθμός των δεικτών μέχρι τη ρίζα είναι Δομή «σταθμισμένης ένωσης»
Δομή ένωσης-εύρεσης σε ξένα σύνολα Ιδιότητα: Για αντικείμενα, ο αλγόριθμος σταθμισμένης ένωσης δημιουργεί δέντρα με ύψος το πολύ Δομή «σταθμισμένης ένωσης»
Δομή ένωσης-εύρεσης σε ξένα σύνολα Απόδειξη:Με επαγωγή.Για ισχύει αφού. Έστω ότι μια πράξη ένωσης συνδυάζει σύνολα Α και Β με μέγεθος Ο αριθμός των δεικτών έως τη ρίζα του δέντρου για τα στοιχεία του A είναι B A Δομή «σταθμισμένης ένωσης» Ιδιότητα: Για αντικείμενα, ο αλγόριθμος σταθμισμένης ένωσης δημιουργεί δέντρα με ύψος το πολύ
Δομή ένωσης-εύρεσης σε ξένα σύνολα Δομή «σταθμισμένης ένωσης με συμπίεση διαδρομής» εύρεση(16)
Δομή ένωσης-εύρεσης σε ξένα σύνολα Υποθέτουμε ότι τα αντικείμενα μας είναι ακέραιοι αριθμοί Δομή «σταθμισμένης ένωσης με συμπίεση διαδρομής» δείκτης σε αντικείμενο του συνόλου που περιέχει το k ένωση ( i, j ) : Εκτελούμε p=εύρεση ( i ) και q=εύρεση ( j ). Αν το σύνολο του q έχει περισσότερα αντικείμενα από το σύνολο του p θέτουμε. Διαφορετικά θέτουμε. εύρεση ( i ) : Ξεκινώντας από το i ακολουθούμε τους δείκτες μέχρι να βρούμε αντικείμενο j τέτοιο ώστε. Θέτουμε για κάθε αντικείμενο k που συναντήσαμε στη διαδρομή μέχρι το j. Επιστρέφουμε τo j. Χρησιμοποιούμε πίνακες και μεγέθους αριθμός αντικειμένων του συνόλου με αντιπρόσωπο k
Δομή ένωσης-εύρεσης σε ξένα σύνολα Δομή «σταθμισμένης ένωσης με συμπίεση διαδρομής» Χρόνος χειρότερης περίπτωσης για μία πράξη εύρεσης ή ένωσης = ύψος
Δομή ένωσης-εύρεσης σε ξένα σύνολα Δομή «σταθμισμένης ένωσης με συμπίεση διαδρομής» Χρόνος χειρότερης περίπτωσης για μία πράξη εύρεσης ή ένωσης = Συνολικός χρόνος εκτέλεσης m πράξεων εύρεσης-ένωσης = Μέσος χρόνος εκτέλεσης για μία πράξη εύρεσης ή ένωσης = Αλλά : σχεδόν σταθερός χρόνος ανά πράξη
Δομή ένωσης-εύρεσης σε ξένα σύνολα Η συνάρτηση Ackerman ορίζεται ως εξής Η συνάρτηση είναι αντίστροφη της αυξάνει με πάρα πολύ αργό ρυθμό! Π.χ. για Δομή «σταθμισμένης ένωσης με συμπίεση διαδρομής»
Κοντινότεροι Κοινοί Πρόγονοι Η συρρίκνωση των κόμβων μπορεί να γίνει αποτελεσματικά με μια δομή ένωσης- εύρεσης σε ξένα σύνολα Υποστηρίζει τις παρακάτω λειτουργίες επί ενός συνόλου αντικειμένων : ένωση ( α, β ) : Αντικαθιστά τα σύνολα που περιέχουν τα α και β με την ένωση τους εύρεση ( α ) : Επιστρέφει το όνομα του συνόλου που περιέχει το αντικείμενο α β δ {ι} β β δ δ ι ι β β δ δ ι ι ένωση(β,δ) Τ δάσος εύρεσης-ένωσης Στον αλγόριθμο υπολογισμού κοντινότερων κοινών προγόνων κάθε σύνολο αποτελείται από τους κόμβους ενός υποδένδρου του Τ. Πρέπει να γνωρίζουμε τη ρίζα κάθε τέτοιου υποδένδρου (αντιπρόσωπος του συνόλου), η οποία μπορεί να διαφέρει από τη ρίζα του δένδρου ένωσης-εύρεσης. ρίζα = δ, αντιπρόσωπος = β
Κοντινότεροι Κοινοί Πρόγονοι Υποστηρίζει τις παρακάτω λειτουργίες επί ενός συνόλου αντικειμένων : ένωση ( α, β ) : Αντικαθιστά τα σύνολα που περιέχουν τα α και β με την ένωση τους εύρεση ( α ) : Επιστρέφει το όνομα του συνόλου που περιέχει το αντικείμενο α Στον αλγόριθμο υπολογισμού κοντινότερων κοινών προγόνων κάθε σύνολο αποτελείται από τους κόμβους ενός υποδένδρου του Τ. Πρέπει να γνωρίζουμε τη ρίζα κάθε τέτοιου υποδένδρου (αντιπρόσωπος του συνόλου), η οποία μπορεί να διαφέρει από τη ρίζα του δένδρου ένωσης-εύρεσης. αντιπρόσωπος του συνόλου με ρίζα το k Χρησιμοποιούμε έναν ακόμα πίνακα που δίνει τον αντιπρόσωπο του κάθε συνόλου Η συρρίκνωση των κόμβων μπορεί να γίνει αποτελεσματικά με μια δομή ένωσης- εύρεσης σε ξένα σύνολα
Κοντινότεροι Κοινοί Πρόγονοι Στατικό δένδρο, γνωστά ζεύγη Σε κάθε κόμβο x του δένδρου αποθηκεύουμε μια λίστα κόμβων Επισκεπτόμαστε τους κόμβους σε σειρά μεταδιάταξης του Επεξεργασία κόμβου : Εξετάζουμε τη λίστα Για κάθε κόμβο που έχουμε ήδη επεξεργαστεί Θέτουμε κόμβος στον οποίο έχει συμπιεστεί ο Συρρικνώνουμε τον στον γονέα του στο εύρεση ένωση για ζεύγηΧρόνος εκτέλεσης = Αργότερα θα δούμε πως μπορεί να επιτευχθεί χρόνος ακόμα και στην περίπτωση όπου το Λ δεν είναι εξαρχής γνωστό