1 / 31

B- Δένδρα

B- Δένδρα. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: 2-3 Δένδρα, Υλοποίηση και πράξεις Β-δένδρα. k 1. 2-3 Δένδρα. Γενίκευση των δυαδικών δένδρων αναζήτησης. Ορισμός : Κάθε κόμβος περιέχει ένα ή δύο κλειδιά. Ένας εσωτερικός κόμβος u με ένα κλειδί , k 1

padma
Download Presentation

B- Δένδρα

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. B-Δένδρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: 2-3 Δένδρα, Υλοποίηση και πράξεις Β-δένδρα ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  2. k1 2-3 Δένδρα • Γενίκευση των δυαδικών δένδρων αναζήτησης. • Ορισμός: • Κάθε κόμβος περιέχει ένα ή δύο κλειδιά. • Ένας εσωτερικός κόμβος u με ένα κλειδί , k1 έχει δύο παιδιά (υπόδενδρα): το αριστερό, u.left, το οποίο περιέχει κλειδιά < k1, και το μεσαίο, u.center, το οποίο περιέχει κλειδιά > k1. • Ένας εσωτερικός κόμβος u με δύο κλειδιά, k1 < k2 , έχει τρία παιδιά, το αριστερό, u.left, το μεσαίο, u.center, και το δεξί, u.right. Όλα τα κλειδιά του υποδένδρου u.left είναι < k1, όλα τα κλειδιά του u.center είναι > k1 και < k2 και όλα τα κλειδιά του u.right είναι > k2. • Όλα τα φύλλα βρίσκονται στο ίδιο επίπεδο. < k1 > k1 k1 k2 > k2 < k1 k1 < x< k2 ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  3. 23 30 12 18 33 48 10 15 20 21 24 45 47 31 50 52 Παράδειγμα 2-3 Δένδρου ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  4. Υλοποίηση 2-3Δένδρων • Ένας κόμβος 2-3 Δένδρου μπορεί να παρασταθεί ως μια εγγραφή με 6 πεδία: • numkeys, τύπου int, που δηλώνει τον αριθμό των κλειδιών που περιέχει ο κόμβος, • key1, όπου αποθηκεύεται το πρώτο κλειδί, • key2, όπου αποθηκεύεται το δεύτερο κλειδί, αν υπάρχει, • left, τύπου δείκτη, που δείχνει στο αριστερό παιδί του κόμβου, • center, τύπου δείκτη, που δείχνει στο μεσαίο παιδί του κόμβου, • right, τύπου δείκτη, που δείχνει στο δεξί παιδί του κόμβου αν υπάρχει. • Ένα δένδρο αναπαρίσταται ως ένας δείκτης σε κόμβο 2-3 δένδρου (που δείχνει στη ρίζα) και επιτρέπει τις πράξεις εισαγωγής, διαγραφή και αναζήτησης. ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  5. Ιδιότητες 2-3 δένδρου • Αν Ν(h) είναι ο μικρότερος αριθμός κλειδιών ενός 2-3 δένδρου ύψους h, τότε  Ν(0) = 1, Ν(h) = 1 + 2N(h-1) • Αν M(h) είναι ο μεγαλύτερος αριθμός κλειδιών ενός 2-3 δένδρου ύψους h, τότε M(0) = 2, M(h) = 2 + 3M(h-1) • Ο αριθμός κλειδιών ενός 2-3 δένδρου ύψους h είναι το πολύ 3h+1 – 1 και το λιγότερο 2h+1 – 1. • Επομένως, το ύψος ενός 2-3 δένδρου με n κόμβους είναι O(logn). • Η διαδικασία εύρεσης στοιχείου σε ένα 2-3 δένδρο είναι εύκολη (παρόμοια με αυτή ενός ΔΔΑ). Ο χρόνος εκτέλεσης της είναι τάξης . O(lg n) ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  6. Εισαγωγή κόμβουσε ένα 2-3 δένδρο Η εισαγωγή κάποιου κλειδιού k σε ένα 2-3 Δένδρο μπορεί να χωριστεί στις ακόλουθες 3 λογικές φάσεις 1. Καθοδική Φάση (Downward Phase) Σε αυτή την φάση διανύουμε αναδρομικά το δένδρο μέχρι να φθάσουμε σε τερματικό κόμβο (δηλαδή κάποιο φύλλο). Δηλαδή: • αν k<u.key1 τότε προχώρα στον κόμβο u.left • αν k>u.key2 τότε προχώρα στον κόμβο u.right • αν u.key1 < k < u.key2 τότε προχώρα στον κόμβο u.center. • Τερματική Φάση (Terminal Phase) • Όταν φτάσουμε σε φύλλο τότε προσπαθούμε να κάνουμε την εισαγωγή • Αν δεν έχει αρκετό χώρο τότε διασπάτε το φύλλο και «ανασηκώνουμε» (kick up) αναδρομικά το μεσαίο στοιχείο στον πατέρα) • Ανοδική Φάση (Upward Phase) • Σε αυτή την φάση κάνουμε την εισαγωγή αν δεν πετύχαμε εισαγωγή στην τερματική φάση.

  7. Περιγραφή Κάποιων Συμβολισμών Στις επόμενες διαφάνειες θα χρησιμοποιήσουμε τους ακόλουθους συμβολισμούς Το στοιχείο το οποίο θέλουμε να εισάγουμε Ο κόμβος Χ Το υπόδενδρο r Τερματικός Κόμβος με 2 κενούς δείκτες

  8. 1) Καθοδική Φάση (Downward Phase) Εισαγωγή του στοιχείου v – Η ρίζα περιέχει 1 στοιχείο Εισαγωγή του στοιχείου v – η ρίζα περιέχει 2 στοιχεία insert insert Προσοχή: Σε αυτή την φάση απλά ζητάμε σε ένα από τα υποδένδρα να χειριστεί την εισαγωγή αλλα δεν κανουμε την εισαγωγη

  9. 2) Τερματική Φάση (Terminal Phase) Όταν φτάσουμε σε τερματικό κόμβο και υπάρχει χώρος τότε μπορούμε να κάνουμε την εισαγωγή κατευθείαν. Δηλαδή: Αν δεν υπάρχει χώρος τότε διασπάτε (split) ο τερματικός κόμβος και προάγετε (kick-up) το μεσαίο στοιχείο στον πατέρα (δες επόμενη διαφάνεια)

  10. 2) Τερματική Φάση (Terminal Phase) συνέχεια Αναλυτικά οι υπό-φάσεις της Διάσπασης (Split)και Προαγωγής (Kick-up) Kick up Kick up insert split split Kick up insert split

  11. 3: Ανοδική Φάση (Upward Phase) Όταν φτάσουμε στον πατέρα και υπάρχει χώρος τότε μπορούμε να κάνουμε την εισαγωγή κατευθείαν. Δηλαδή: Αν δεν υπάρχει χώρος τότε πρέπει να διασπαστεί ο πατέρας και να προαχθεί (kick-up) το μεσαίο στοιχείο στον πατέρα του πατέρα (δες επόμενη διαφάνεια) Kick up Kick up

  12. 3: Ανοδική Φάση (Upward Phase) συνέχεια Όταν φτάσουμε στον πατέρα και δεν υπάρχει χώρος τότε αναδρομικά διασπάμε τον πατέρα μέχρι να εισαχθεί το στοιχείο. Αν διασπαστεί η ρίζα τότε αυξάνεται και το ύψος του δένδρουκατά 1! : w <= X < Y X <= w < Y X <= Y < w

  13. Ολοκληρωμένο Παράδειγμα Εισαγωγής Παράδειγμα εισαγωγής της λέξης “A L G O R I T H M S” (γράμμα-γράμμα) σε ένα κενό 2-3 δένδρο. συνέχεια στην επόμενη διαφάνεια…

  14. Ολοκληρωμένο Παράδειγμα Εισαγωγής (συνέχεια)

  15. Εισαγωγή κόμβου Για την εισαγωγή κλειδιού k σε ένα 2-3 Δένδρο ακολουθούμε το μονοπάτι από τη ρίζα του δένδρου μέχρι το κατάλληλο φύλλοu. Υπάρχουν δύο περιπτώσεις • Αν ο u περιέχει μόνο 1 κλειδί, τότε προσθέτουμε το k στον u. • Αν ο u περιέχει 2 κλειδιάέστω k1 και k2, τότε δημιουργούμε ένα καινούριο κόμβο v, και διαμοιράζουμε τα κλειδιά του u, και το καινούριο κλειδί k έτσι ώστε: ο u να πάρει το μικρότερο των κλειδιών και ο v το μεγαλύτερο. Ο δείκτης προς τον v και το μεσαίο κλειδί, m, μεταβιβάζεται στον πατέρα w του u. • Αν ο w έχει μόνο ένα κλειδί, τότε προσθέτουμε το ζεύγος (m,v) στον κόμβο w. Διαφορετικά, δημιουργούμε ένα καινούριο κόμβο και επαναλαμβάνουμε το βήμα 2. • Αυτή η διαδικασία μπορεί να συνεχιστεί μέχρι τη ρίζα του δένδρου με αποτέλεσμα τη διάσπαση της ρίζας και την αύξηση του ύψους του δένδρου κατά 1. ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  16. Αναλυτική Περιγραφή – Φάση 1 • Ξεκινώντας από τη ρίζα, εφάρμοσε τον πιο κάτω αλγόριθμο σε κάθε κόμβο u μέχρι να φτάσεις σε κάποιο φύλλο, καταγράφοντας τη διαδρομή που ακολούθησες: • Αν u.numkeys = 1, τότε • αν k<u.key1 τότε προχώρα στον κόμβο u.left • αν k>u.key1 τότε προχώρα στον κόμβο u.center • αν k=u.key1 τότε σταμάτα. • Αν u.numkeys = 2, τότε • αν k<u.key1 τότε προχώρα στον κόμβο u.left • αν k>u.key2 τότε προχώρα στον κόμβο u.right • αν u.key1 < k < u.key2 τότε προχώρα στον κόμβο u.center. • διαφορετικά, σταμάτα. ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  17. 24 50 52 31 45 47 20 21 10 15 12 23 30 48 Τρέχον παράδειγμα – εισαγωγή του 19 (1) Ξεκινώντας από τη ρίζα, p0, ακολουθούμε και καταγράφουμε τη διαδρομή p0, p2, p4. p0 18 33 p3 p1 p2 p4 p6 p5 ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  18. Φάση 2(α) – Περίπτωση Φύλλου • Έστω ότι προσθέτουμε το κλειδί k στο φύλλο u. • Αν u.numkeys = 1, k1= u.key1, τότε • u.key1 = min (k1, k), • u.key2 = max (k1, k), • u.numkeys = 2 • Αν u.numkeys = 2, k1 = u.key1, k2 =u.key2, τότε • u.key1 = min (k1, k2, k), • u.numkeys = 1, • p = (NODE *)malloc(sizeof(NODE)), • p.numkeys = 1, • p.key1 = max(k1, k2 ,k). • προχώρα στη φάση 2(β) με παραμέτρους p, mid(k1, k2 ,k) ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  19. 31 50 52 19 24 15 10 45 47 12 23 30 48 21 20 21 Τρέχον παράδειγμα – εισαγωγή του 19 (2) p0 18 33 p3 p1 p2 p4 p6 p5 (20, q1) q1 ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  20. Φάση 2(β) – Περίπτωση Εσωτερικού κόμβου • Έστω ότι προσθέτουμε το κλειδί k και τον δείκτη p στον κόμβο u. • Αν u.numkeys = 1, k1= u.key1, τότε • αν k >k1 , u.key2 = k, u.right = p, • αν k <k1 , u.key1 = k, u.key2 = k1, u.right = u.center, u.center = p. • u.nunkeys = 2. • Αν u.numkeys = 2, k1= u.key1, k2= u.key2, u.left = p1, u.center = p2 , u.right = p3, τότε υπάρχουν 3 περιπτώσεις που εξαρτώνται από τη σχέση των κλειδιών k, k1, k2. Aς ασχοληθούμε με την περίπτωση k < k1 (οι άλλες δύο είναι παρόμοιες). Τότε • u.key1 = k, u.center = p, u.numkeys = 1, • q= (NODE *)malloc(sizeof(NODE)), q.numkeys = 1, q.key1 = k2, q.left = p2, q.center = p3. • αν ο u είναι η ρίζα τότε προχώρα στη φάση 3, διαφορετικά επανάλαβε τη φάση 2(β) με παραμέτρους (q, k1 ) στον πατέρα του u. ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  21. 50 52 19 21 30 31 45 47 24 15 20 48 12 23 30 10 Τρέχον παράδειγμα – εισαγωγή του 19 (3) • Eισαγωγή του ζεύγους (20,q1) στον κόμβο p2. p0 18 33 p3 p1 p2 q2 (23, q2) (20, q1) p6 p4 p5 q1 q1 ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  22. 45 47 30 20 33 50 52 31 19 24 21 10 48 12 15 Τρέχον παράδειγμα – εισαγωγή του 19 (4) • Eισαγωγή του ζεύγους (23,q2) στον κόμβο p0. q3 18 33 (23, q3) 18 p0 (23, q2) p1 p2 q2 p3 q2 p6 p4 p5 q1 ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  23. 18 33 23 Φάση 3: Νέα ρίζα • Αν η ρίζα r διασπαστεί και ζητήσει την εισαγωγή ζεύγους (p,k) στον “ανύπαρκτο” πρόγονο της στο δένδρο, τότε • Δημιούργησε ένα καινούριο κόμβο v με ένα κλειδί k και v.left = r, v.center = p. • O καινούριος κόμβος v θα είναι η νέα ρίζα του δένδρου. • Έτσι, στο παράδειγμα, εισαγωγή του (q3, 23) έχει σαν αποτέλεσμα: Root p0 q3 (23,q3) p1 p2 p3 q2 ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  24. 20 21 1415 15 50 52 31 24 45 47 10 48 18 33 12 23 30 15 Εισαγωγή του κλειδιού 14 14 14 ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  25. 20 21 48 50 52 55 50 31 24 45 47 10 48 52 18 33 12 23 30 14 15 Εισαγωγή του κλειδιού 55 55 55 ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  26. 20 21 55 12 10 14 15 24 48 52 45 47 23 50 33 23 30 18 33 19 21 20 30 18 31 Εισαγωγή του κλειδιού 19 19 19 ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  27. Διαδικασία Εισαγωγής Κόμβου • Η αναδρομική διαδικασία εισαγωγής κόμβου, παίρνει παραμέτρους: • το δείκτη στον κόμβο όπου θα γίνει η εισαγωγή, • το κλειδί που θέλουμε να προσθέσουμε (κατά την κάθοδο στο δένδρο), • το ζεύγος (δείκτη σε παιδί, κλειδί) που θέλουμε να προσθέσουμε (κατά την άνοδο στο δένδρο). • Η διαδικασία εξαγωγής κλειδιών χρησιμοποιεί παρόμοιες ιδέες. Σ’αυτή όμως την περίπτωση, αντί διάσπαση κόμβου έχουμε συγχώνευση κόμβων. • Όλες οι διαδικασίες έχουν χρόνο εκτέλεσης ανάλογο με το ύψος του δένδρου. Άρα είναι τάξης Θ(logn). ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  28. 18 16 25 32 32 39 9 12 25 27 16 17 18 22 Παραλλαγή • Οι πληροφορίες αποθηκεύονται μόνο στα φύλλα. • Τα κλειδιά εσωτερικών κόμβων χρησιμεύουν μόνο για την αναζήτηση στο δένδρο. Δηλαδή, για κάποιο κόμβο u, το u.key1 δηλώνει το μικρότερο κλειδί σε φύλλο του u.center, και το u.key2 (αν υπάρχει) δηλώνει το μικρότερο κλειδί σε φύλλο του u.right. ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  29. Β-δένδρα • Γενίκευση του 2-3 δένδρου: μπορεί να αποθηκεύει περισσότερα από 2 κλειδιά σε κάθε κόμβο. • Ένα δένδρο τάξης m ικανοποιεί τις πιο κάτω ιδιότητες: • Έχει μια ρίζα η οποία είτε είναι φύλλο, είτε έχει 2 μέχρι m παιδιά. • Όλοι οι εσωτερικοί κόμβοι (εκτός τη ρίζα) έχουν από m/2 μέχρι m παιδιά. • Όλα τα φύλλα βρίσκονται στο ίδιο επίπεδο. • Τα δεδομένα φυλάσσονται στα φύλλα. Κάθε φύλλο περιέχει από m/2- 1 μέχρι m – 1 κλειδιά. • Ένας εσωτερικός κόμβός με δείκτες p0, p1, …, pn, έχει κλειδιά k1,…,kn, όπου ki είναι το μικρότερο κλειδί του υποδένδρου που δείχνεται από τον δείκτη pi. • Ένα 2-3 δένδρο, είναι Β-δένδρο, τάξης 3. ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  30. Παράδειγμα Β-δένδρου τάξης 4 18 25 32 43 3 8 43 47 1 2 32 39 25 27 8 12 3 4 5 18 22 23 ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

  31. Ένα Β-δένδρο … • τάξης m με n κλειδιά έχει ύψος • Έχει διαδικασίες παρόμοιες με αυτές ενός 2-3 δένδρου, οι οποίες επίσης μπορεί να προκαλέσουν διάσπαση ή συγχώνευση της ρίζας. • Έχει το πλεονέκτημα έναντι των 2-3 δένδρων … • Έχει το μειονέκτημα … • Το κόστος των διαδικασιών είναι ανάλογο του (ύψος του δένδρου)(κόστος επεξεργασίας ενός κόμβου) • Το κόστος επεξεργασίας ενός κόμβου Ο(m) μπορεί να γίνει O(logm) αν κάθε κόμβος οργανωθεί ως AVL-δένδρο. • Σε βάσεις δεδομένων οι κόμβοι αποθηκεύονται σε δευτερεύουσα μνήμη του υπολογιστή. Το κόστος πρόσβασης ενός κόμβου είναι πολύ μεγαλύτερο απ’αυτό της επεξεργασίας του. • Η τιμή του m επιλέγεται βάσει του πόσα κλειδιά μπορούν να αποθηκευτούν σε ένα καταχώρημα (block) μνήμης. ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι

More Related