Εκτενείς Δομές Δεδομένων
Εισαγωγή Δομές που βασίζονται σε συγκρίσεις : Ισοζυγισμένα δέντρα εύρεσης ( δέντρα τα φύλλα των οποίων απέχουν της ίδιας τάξεως μεγέθους, απόσταση απο τη ρίζα) Υψοζυγισμένα δέντρα ( κριτήριο ζύγισης κάθε κόμβου αποτελεί το ύψος των υποδέντρων του) : VL ( a,b ) TREES B - TREES RED BLK TREE Βαροζυγισμένα δέντρα (κριτήριο ζύγισης κάθε κόμβου αποτελεί το βάρος των υποδέντρων του) : BB[a] TREES SKIP LISTS INTERPOLTION SERH TREES ΒΑΡΟΖΥΓΙΣΜΕΝΑ B - TREES
VL tree (delson-velsk and Landis) Δυαδικό ισοζυγισμένο δέντρο σε κάθε κόμβο τα ύψη των υποδέντρων του διαφέρουν το πολύ κατά ένα. Υψοζύγιση του u: b(u) = ύψος( R(u) ) ύψος( L(u) ), b(u) { +1,, - 1 } Το ύψος ενός δένδρου VL με n στοιχεία είναι Ο( logn ).
F 4 F F 1 F +1 F F 2 F 3
5
Απλή Περιστροφή (1) +2 +2 B +1 +1 Χ Α Β +1
Απλή Περιστροφή (2) -2 +1 Χ Α Β +1 B
Διπλή Περιστροφή (1) +2 +2 z B 1 B 2-2 +1 +2 +2 B 1 +1 B 2-2 z +1 +1 B 1 z B 2-2 +1
Διπλή Περιστροφή (2) +2 +1-2 +1 z B 1 B 2 z -2 B 2 B 1 +2 +1 B 1-2 z B 2-2 -2
VL tree ccess() Ξεκινάμε απο τη ρίζα και ελέγχουμε σε κάθε κόμβο u : αν < val(u) συνεχίζουμε αριστερά αν > val(u) συνεχίζουμε δεξιά ε ως ότου βρούμε το Ο χρόνος της ccess() είναι Θ( logn )
VL tree Insert(, T) Ο πρώτος κόμβος στο μονοπάτι από τον κόμβο v (που εισήχθη στο δένδρο) προς τη ρίζα, του οποίου το balance ήταν +1 ή 1 (πριν την εισαγωγή) ονομάζεται κρίσιμος κόμβος ( κρίσιμο μονοπάτι αντίστοιχα). Αν ο κόμβος αυτός αποκτά balance +2 ή 2 μετά την εισαγωγή, τότε είναι ο πρώτος κόμβος στο μονοπάτι από τον v στη ρίζα για τον οποίο θα πρέπει να γίνουν κατάλληλες ενέργειες ώστε να διορθωθεί το balance του. Διακρίνουμε περιπτώσεις ανάλογα με το είδος των δύο πρώτων ακμών του μονοπατιού από τον κρίσιμο κόμβο w προς τον εισαχθέντα κόμβο v ( απλή περιστροφή / διπλή περιστροφή)
VL tree Insert(, T) Περίπτωση RR (Rigt - Rigt): Και οι δύο ακμές οδηγούν δεξιά. Εκτελούμε μια αριστερή περιστροφή γύρω από τον κρίσιμο κόμβο. Περίπτωση LL (Left - Left): Και οι δύο ακμές οδηγούν αριστερά. Είναι συμμετρική της περίπτωσης RR! Μία δεξιά περιστροφή γύρω από τον κρίσιμο κόμβο αρκεί για να επιλυθεί το πρόβλημα με το balance του!
VL tree Insert(, T) Περίπτωση RL ( Rigt - Left): Η πρώτη ακμή οδηγεί δεξιά και η δεύτερη αριστερά. Απαιτούνται δύο περιστροφές, μια δεξιά περιστροφή γύρω από τον επόμενο του κρίσιμου κόμβου στο μονοπάτι του οδηγεί στον v και μια αριστερή περιστροφή γύρω από τον κρίσιμο κόμβο. Περίπτωση LR ( Left - Rigt): Η πρώτη ακμή οδηγεί αριστερά και η δεύτερη δεξιά. Είναι συμμετρική της περιπτώσεως RL. Απαιτούνται δύο περιστροφές, μια αριστερή περιστροφή γύρω από τον επόμενο του κρίσιμου κόμβου στο μονοπάτι που οδηγεί στον v και μια δεξιά περιστροφή γύρω από τον κρίσιμο κόμβο.
VL tree Delete(, T) κολουθούμε τον αλγόριθμο διαγραφής σε δυαδικό δένδρο: ccess() Διαγραφή του ίδιου του κόμβου αν είναι φύλλο. Αντικατάστασή του από το παιδί του αν έχει μόνο ένα παιδί. Αντικατάστασή του από τον επόμενό του στην ενδοδιατεταγμένη διάταξη αν έχει δύο παιδιά. Balance
+1 ΚΚΕ +2 ΚΚΕ +1 +1
-+1 B Μορφή του υποδένδρου με ρίζα τον ΚΚΕ, πριν την ένθεση
Περίπτωση (i) +2 +2 B +1 +1 Χ Α Β +1
Περίπτωση (ii) +2 +2 z B 1 B 2-2 +1 +2 +2 B 1 +1 B 2-2 z +1 +1 B 1 z B 2-2 +1
Αποσβέσεις ΚΚ ii) iii) / +1 ΚΚ i) ΚΚ +1 +1
Διαγραφή -+1 B Μορφή του υποδένδρου με ρίζα τον ΚΚΕ, πριν την aπόσβεση στο Α
Περίπτωση (i) +2 +2-2 B Χ +1 Α Β -2 +1
Περίπτωση (ii) μη τερματική +2 +1-2 +1 B -2 Χ Α Β -2-2
Περίπτωση (iii) μη τερματική +1 +2-2 +1 z B 1 B 2-3 -2-2 +2 +2 B 1-3 +2 B 2-2 z -2-2 B 1-3 z B 2-2 -2
Περίπτωση (iv) - απορρόφηση B B
(a,b)-tree Έστω a, b ακέραιοι τέτοιοι ώστε a 2 και b 2a. Ένα δέντρο Τ είναι (a, b) αν Όλα τα φύλλα του Τ έχουν το ίδιο βάθος(δηλαδή το δέντρο είναι πλήρως ζυγισμένο) Για κάθε κόμβο u του Τ, ισχύει p(u) b {p(u) = αριθμός των παιδιών του u} Για κάθε κόμβο u του Τ, με εξαίρεση τη ρίζα, ισχύει p(u) a Για τη ρίζα r,ισχύει p(r) 2 Όταν b = 2a 1 τότε το (a,b) tree ονομάζεται B-tree.
Split(v) 1. Διαχωρισμός του v σε δύο τμήματα ένα που περιέχει τα (b+1)/2 αριστερότερα και ένα που περιέχει τα (b+1)/2 δεξιότερα παιδιά 2. Δημιουργία ενός καινούριου κόμβου v αριστερά του v 3. Ta δεξιότερα (b+1)/2 παιδιά τοποθετούνται στον v μαζί με τα κλειδιά k (b+1)/2 +1,,k p(v) 4. Έστω u ο πατέρας του v. Το κλειδί k (b+1)/2 τοποθετείται στον u ανάμεσα στους δείκτες στα υποδέντρα με ρίζες τους κόμβους v και v
Split(v) 4 u 4 9 u v 2 7 9 1 12 v 2 7 1 12 1 3 7 9 1 11 15 1 3 7 9 1 11 15
Sare(v) 4 9 u 4 9 u 4 1 u v 2 7 1 12 v 2 7 1 12 v 2 9 11 1 3 7 9 1 11 15 1 3 9 1 11 15 1 3 9 1 11 15
Fuse(v) 4 1 4 1 u 1 v u 2 9 11 9 v 11 4 9 11 1 3 9 1 11 15 1 9 1 11 15 1 9 1 11 15