B- Δένδρα

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

description

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

Transcript of B- Δένδρα

Page 1: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-1

Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

2-3 Δένδρα, Υλοποίηση και πράξεις

Β-δένδρα

B-Δένδρα

Page 2: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-2

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

k1 k2

< k1> k2

k1 < x< k2

Page 3: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-3

Παράδειγμα 2-3 Δένδρου

23 3012

18 33

48

10 15

20 21 24

45 47

31

50 52

Page 4: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-4

Υλοποίηση 2-3 Δένδρων • Ένας κόμβος 2-3 Δένδρου μπορεί να παρασταθεί ως μια εγγραφή με 6

πεδία:1. numkeys, τύπου int, που δηλώνει τον αριθμό των κλειδιών που περιέχει

ο κόμβος,2. key1, όπου αποθηκεύεται το πρώτο κλειδί,3. key2, όπου αποθηκεύεται το δεύτερο κλειδί, αν υπάρχει,4. left, τύπου δείκτη, που δείχνει στο αριστερό παιδί του κόμβου,5. center, τύπου δείκτη, που δείχνει στο μεσαίο παιδί του κόμβου,6. right, τύπου δείκτη, που δείχνει στο δεξί παιδί του κόμβου αν υπάρχει.

• Ένα δένδρο αναπαρίσταται ως ένας δείκτης σε κόμβο 2-3 δένδρου (που δείχνει στη ρίζα) και επιτρέπει τις πράξεις εισαγωγής, διαγραφή και αναζήτησης.

Page 5: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-5

Ιδιότητες 2-3 δένδρου• Αν Ν(h) είναι ο μικρότερος αριθμός κλειδιών ενός 2-3 δένδρου ύψους

h, τότε Ν(0) = 1, Ν(h) = 1 + 2N(h-1)

• Αν M(h) είναι ο μεγαλύτερος αριθμός κλειδιών ενός 2-3 δένδρου ύψους h, τότε

M(0) = 2, M(h) = 2 + 3M(h-1)

• Ο αριθμός κλειδιών ενός 2-3 δένδρου ύψους h είναι το πολύ 3h+1 – 1 και το λιγότερο 2h+1 – 1.

• Επομένως, το ύψος ενός 2-3 δένδρου με n κόμβους είναι O(log n).

• Η διαδικασία εύρεσης στοιχείου σε ένα 2-3 δένδρο είναι εύκολη (παρόμοια με αυτή ενός ΔΔΑ). Ο χρόνος εκτέλεσης της είναι τάξης .O(lg n)

Page 6: B- Δένδρα

Εισαγωγή κόμβου σε ένα 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.

2. Τερματική Φάση (Terminal Phase)– Όταν φτάσουμε σε φύλλο τότε προσπαθούμε να κάνουμε την εισαγωγή– Αν δεν έχει αρκετό χώρο τότε διασπάτε το φύλλο και «ανασηκώνουμε»

(kick up) αναδρομικά το μεσαίο στοιχείο στον πατέρα) 3. Ανοδική Φάση (Upward Phase)

– Σε αυτή την φάση κάνουμε την εισαγωγή αν δεν πετύχαμε εισαγωγή στην τερματική φάση.

Page 7: B- Δένδρα

Περιγραφή Κάποιων ΣυμβολισμώνΣτις επόμενες διαφάνειες θα χρησιμοποιήσουμε τους ακόλουθους συμβολισμούς

Ο κόμβος Χ

Το στοιχείο το οποίο θέλουμε να εισάγουμε

Το υπόδενδρο rΤερματικός Κόμβος με 2 κενούς δείκτες

Page 8: B- Δένδρα

1) Καθοδική Φάση (Downward Phase)Εισαγωγή του στοιχείου v – Η ρίζα περιέχει 1 στοιχείο

Εισαγωγή του στοιχείου v – η ρίζα περιέχει 2 στοιχεία

Προσοχή: Σε αυτή την φάση απλά ζητάμε σε ένα από τα υποδένδρα να χειριστεί την εισαγωγή αλλα δεν κανουμε την εισαγωγη

insertinsert

Page 9: B- Δένδρα

2) Τερματική Φάση (Terminal Phase)

Όταν φτάσουμε σε τερματικό κόμβο και υπάρχει χώρος τότε μπορούμε να κάνουμε την εισαγωγή κατευθείαν. Δηλαδή:

Αν δεν υπάρχει χώρος τότε διασπάτε (split) ο τερματικός κόμβος και προάγετε (kick-up) το μεσαίο στοιχείο στον πατέρα (δες επόμενη διαφάνεια)

Page 10: B- Δένδρα

2) Τερματική Φάση (Terminal Phase) συνέχεια

Αναλυτικά οι υπό-φάσεις της Διάσπασης (Split) και Προαγωγής (Kick-up)

Kick up

insert

Kick up

split split

split

Kick up

insert

Page 11: B- Δένδρα

3: Ανοδική Φάση (Upward Phase)

Kick up

Όταν φτάσουμε στον πατέρα και υπάρχει χώρος τότε μπορούμε να κάνουμε την εισαγωγή κατευθείαν. Δηλαδή:

Αν δεν υπάρχει χώρος τότε πρέπει να διασπαστεί ο πατέρας και να προαχθεί (kick-up) το μεσαίο στοιχείο στον πατέρα του πατέρα (δες επόμενη διαφάνεια)

Kick up

Page 12: B- Δένδρα

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

X <= Y < w

X <= w < Y

w <= X < Y

Page 13: B- Δένδρα

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

συνέχεια στην επόμενη διαφάνεια…

Page 14: B- Δένδρα

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

Page 15: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-15

Εισαγωγή κόμβου Για την εισαγωγή κλειδιού k σε ένα 2-3 Δένδρο ακολουθούμε το μονοπάτι από τη ρίζα του δένδρου μέχρι το κατάλληλο φύλλο u.Υπάρχουν δύο περιπτώσεις

1. Αν ο u περιέχει μόνο 1 κλειδί, τότε προσθέτουμε το k στον u.

2. Αν ο u περιέχει 2 κλειδιά έστω k1 και k2, τότε δημιουργούμε ένα καινούριο κόμβο v, και διαμοιράζουμε τα κλειδιά του u, και το καινούριο κλειδί k έτσι ώστε: ο u να πάρει το μικρότερο των κλειδιών και ο v το μεγαλύτερο. Ο δείκτης προς τον v και το μεσαίο κλειδί, m, μεταβιβάζεται στον πατέρα w του u.– Αν ο w έχει μόνο ένα κλειδί, τότε προσθέτουμε το ζεύγος (m,v) στον

κόμβο w. Διαφορετικά, δημιουργούμε ένα καινούριο κόμβο και επαναλαμβάνουμε το βήμα 2.

– Αυτή η διαδικασία μπορεί να συνεχιστεί μέχρι τη ρίζα του δένδρου με αποτέλεσμα τη διάσπαση της ρίζας και την αύξηση του ύψους του δένδρου κατά 1.

Page 16: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-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.– διαφορετικά, σταμάτα.

Page 17: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-17

Τρέχον παράδειγμα – εισαγωγή του 19 (1)Ξεκινώντας από τη ρίζα, p0, ακολουθούμε και καταγράφουμε τη διαδρομή p0,

p2, p4.

23 3012

18 33

48

10 15

20 21 24

45 47

31

50 52

p0

p1 p2p3

p4 p5p6

Page 18: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-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)

Page 19: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-19

Τρέχον παράδειγμα – εισαγωγή του 19 (2)

23 3012

18 33

48

10 15

20 21

24

45 47

31

50 52

p0

p1 p2p3

p4 p5p6

2119

q1

(20, q1)

Page 20: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-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.

Page 21: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-21

Τρέχον παράδειγμα – εισαγωγή του 19 (3)• Eισαγωγή του ζεύγους (20,q1) στον κόμβο p2.

23 3012

18 33

48

10 15

24

45 47

31

50 52

p0

p1 p2

p3

p4 p5

p6

2119

q1

(20, q1)

3020

q2(23, q2)

q1

Page 22: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-22

Τρέχον παράδειγμα – εισαγωγή του 19 (4)• Eισαγωγή του ζεύγους (23,q2) στον κόμβο p0.

12

18 33

48

10 15

24

45 47

31

50 52

p1 p2 p3

p4 p5

p6

2119

3020

q2

(23, q2)

q1

33 p0q3

q2

(23, q3)18

Page 23: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-23

Φάση 3: Νέα ρίζα• Αν η ρίζα r διασπαστεί και ζητήσει την εισαγωγή ζεύγους (p,k) στον

“ανύπαρκτο” πρόγονο της στο δένδρο, τότε– Δημιούργησε ένα καινούριο κόμβο v με ένα κλειδί k και v.left = r,

v.center = p.

• O καινούριος κόμβος v θα είναι η νέα ρίζα του δένδρου.

• Έτσι, στο παράδειγμα, εισαγωγή του (q3, 23) έχει σαν αποτέλεσμα:

18

p0

p1 q2 p3p2

33

q3

23 Root

(23,q3)

Page 24: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-24

Εισαγωγή του κλειδιού 14

23 3012

18 33

48

10 15

20 21 24

45 47

31

50 52 15 14 15

14

14

Page 25: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-25

Εισαγωγή του κλειδιού 55

23 3012

18 33

48 52

10 14 15

20 21 24

45 47

31

5055

50 52

48

55

55

Page 26: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-26

Εισαγωγή του κλειδιού 19

12

10 14 15

24

48 52

45 47 5055

3120 21

23 30

18 33

19

19

19 21

20 30

18 33

23

Page 27: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-27

Διαδικασία Εισαγωγής Κόμβου• Η αναδρομική διαδικασία εισαγωγής κόμβου, παίρνει παραμέτρους:

1. το δείκτη στον κόμβο όπου θα γίνει η εισαγωγή, 2. το κλειδί που θέλουμε να προσθέσουμε (κατά την κάθοδο στο δένδρο),3. το ζεύγος (δείκτη σε παιδί, κλειδί) που θέλουμε να προσθέσουμε (κατά

την άνοδο στο δένδρο).

• Η διαδικασία εξαγωγής κλειδιών χρησιμοποιεί παρόμοιες ιδέες. Σ’αυτή όμως την περίπτωση, αντί διάσπαση κόμβου έχουμε συγχώνευση κόμβων.

• Όλες οι διαδικασίες έχουν χρόνο εκτέλεσης ανάλογο με το ύψος του δένδρου. Άρα είναι τάξης Θ(log n).

Page 28: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-28

Παραλλαγή• Οι πληροφορίες αποθηκεύονται μόνο στα φύλλα.

• Τα κλειδιά εσωτερικών κόμβων χρησιμεύουν μόνο για την αναζήτηση στο δένδρο. Δηλαδή, για κάποιο κόμβο u, το u.key1 δηλώνει το μικρότερο κλειδί σε φύλλο του u.center, και το u.key2 (αν υπάρχει) δηλώνει το μικρότερο κλειδί σε φύλλο του u.right.

18

25 32

9 12

16

16 17 18 22 25 27 32 39

Page 29: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-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.

Page 30: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-30

Παράδειγμα Β-δένδρου τάξης 4

18

25 32 43

1 2

3 8

3 4 5

18 22 23 25 27 32 39

8 12

43 47

Page 31: B- Δένδρα

ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 8-31

Ένα Β-δένδρο …• τάξης m με n κλειδιά έχει ύψος

• Έχει διαδικασίες παρόμοιες με αυτές ενός 2-3 δένδρου, οι οποίες επίσης μπορεί να προκαλέσουν διάσπαση ή συγχώνευση της ρίζας.

• Έχει το πλεονέκτημα έναντι των 2-3 δένδρων …

• Έχει το μειονέκτημα …

• Το κόστος των διαδικασιών είναι ανάλογο του (ύψος του δένδρου) (κόστος επεξεργασίας ενός κόμβου)

• Το κόστος επεξεργασίας ενός κόμβου Ο(m) μπορεί να γίνει O(log m) αν κάθε κόμβος οργανωθεί ως AVL-δένδρο.

• Σε βάσεις δεδομένων οι κόμβοι αποθηκεύονται σε δευτερεύουσα μνήμη του υπολογιστή. Το κόστος πρόσβασης ενός κόμβου είναι πολύ μεγαλύτερο απ’αυτό της επεξεργασίας του.

• Η τιμή του m επιλέγεται βάσει του πόσα κλειδιά μπορούν να αποθηκευτούν σε ένα καταχώρημα (block) μνήμης.

)(log nO m