Εκτενείς Δομές Δεδομένων
Ειδικά Δυαδικά Δένδρα Δυαδικά Δένδρα Αναζήτησης Το αριστερό υποδένδρο κάθε κόμβου έχει τιμές μικρότερες από την τιμή του κόμβου. Το δεξιό υποδένδρο κάθε κόμβου έχει τιμές μεγαλύτερες από την τιμή του κόμβου. Χρησιμοποιούνται στην αναζήτηση στοιχείων, όπου ενδέχεται να βελτιώσουν σημαντικά το χρόνο (αντίστοιχα με τη δυαδική αναζήτηση σε ταξινομημένο πίνακα). Η δυαδική αναζήτηση σε ταξινομημένο πίνακα παίρνει Ο(log n) χρόνο και αυτό επιτυγχάνεται και στα ισοζυγισμένα δυαδικά δένδρα αναζήτησης. Με ενδοδιατεταγμένη διαπέραση παίρνουμε τα στοιχεία ταξινομημένα κατά αύξουσα σειρά Δένδρα - Σωροί Πλήρη δυαδικά δένδρα. Στο σωρό ελαχίστων (μεγίστων) η τιμή κάθε κόμβου είναι μικρότερη (μεγαλύτερη) από τις τιμές των παιδιών του. 2
Πράξεις σε φυλλοπροσανατολισμένα SEARCH(x) v<-ρίζα wile (v!=φυλλο) { Εντόπισε υποδέντρο: Η i-1 (v)<x<=h i (v) v<- i-οστός γιος του v } if (πληροφορία(v)=x) ten βρεθηκε else δεν βρέθηκε INSERT(x) min(x,cont(v)) v<-φύλλο που τελειώνει η Searc(x) if (πληροφορία(v)=x) ten μη κάνεις τίποτα αλλιώς αντικατέστησε το v με min(x,cont(v)) max(x,cont(v)) 3
DELETE(x) v<-το φύλλο στο οποίο τελειώνει η Searc(x) if (πληροφορία(v)!=x) ten μη κάνεις τίποτα else u<-o κοντινότερος πρόγονος του v με βαθμό >=2 Σβήσε την i-οστή πλευρά του u και ένα από τα Η i-1 (v),h i (v) if degree(u)=1 ten αντικατέστησε τον δείκτη από τον πατέρα του u προς τον u, με δείκτη στο γιο του u τον 4
Εισαγωγή Δομές που βασίζονται σε συγκρίσεις : Ισοζυγισμένα δέντρα εύρεσης ( δέντρα τα φύλλα των οποίων απέχουν της ίδιας τάξεως μεγέθους, απόσταση απο τη ρίζα) Υψοζυγισμένα δέντρα ( κριτήριο ζύγισης κάθε κόμβου αποτελεί το ύψος των υποδέντρων του) : AVL ( a,b ) TREES B - TREES RED BLACK TREE Βαροζυγισμένα δέντρα (κριτήριο ζύγισης κάθε κόμβου αποτελεί το βάρος των υποδέντρων του) : BB[a] TREES SKIP LISTS INTERPOLATION SEARCH TREES ΒΑΡΟΖΥΓΙΣΜΕΝΑ B - TREES
AVL tree (Adelson-Velsk and Landis) Δυαδικό ισοζυγισμένο δέντρο σε κάθε κόμβο τα ύψη των υποδέντρων του διαφέρουν το πολύ κατά ένα. Υψοζύγιση του u: b(u) = ύψος( R(u) ) ύψος( L(u)), b(u) { +1, 0, - 1 } Το ύψος ενός δένδρου AVL με n στοιχεία είναι Ο( logn ).
F 4 F 0 F 1 F +1 F F 2 Το F έχει Fib(+1) φύλλα F 3
8
Απλή Περιστροφή (1) +2 x 0 +2 A B +1 C +1 Χ 0 Α Β C +1
Απλή Περιστροφή (2) -2 0 x +1 Χ Α -1 Β C +1 A B 0 C
Διπλή Περιστροφή (1) +2 A +2-1 x z -1 B 1 B 2-2 C +1 +2 A +2 B 1 x +1 B 2-2 z +1 C +1 A x 0 B 1 0 z B 2-2 +1 C
Διπλή Περιστροφή (2) A +2 A +1-1 -2 +1 z B 1 B 2 x z C A -1-2 x C B 2 B 1 +2 +1 A x -1 B 1-2 0 z B 2 0 C -2-2
AVL tree Access(x) Ξεκινάμε απο τη ρίζα και ελέγχουμε σε κάθε κόμβο u : αν x <= val(u) συνεχίζουμε αριστερά αν x > val(u) συνεχίζουμε δεξιά ε ως ότου βρούμε το x Ο χρόνος της Access(x) είναι Θ( logn )
AVL tree Insert(x, T) Ο πρώτος κόμβος στο μονοπάτι από τον κόμβο v (που εισήχθη στο δένδρο) προς τη ρίζα, του οποίου το balance ήταν +1 ή 1 (πριν την εισαγωγή) ονομάζεται κρίσιμος κόμβος ( κρίσιμο μονοπάτι αντίστοιχα). Αν ο κόμβος αυτός αποκτά balance +2 ή 2 μετά την εισαγωγή, τότε είναι ο πρώτος κόμβος στο μονοπάτι από τον v στη ρίζα για τον οποίο θα πρέπει να γίνουν κατάλληλες ενέργειες ώστε να διορθωθεί το balance του. Διακρίνουμε περιπτώσεις ανάλογα με το είδος των δύο πρώτων ακμών του μονοπατιού από τον κρίσιμο κόμβο w προς τον εισαχθέντα κόμβο v ( απλή περιστροφή / διπλή περιστροφή)
AVL tree Insert(x, T) Περίπτωση RR (Rigt - Rigt): Και οι δύο ακμές οδηγούν δεξιά. Εκτελούμε μια αριστερή περιστροφή γύρω από τον κρίσιμο κόμβο. Περίπτωση LL (Left - Left): Και οι δύο ακμές οδηγούν αριστερά. Είναι συμμετρική της περίπτωσης RR! Μία δεξιά περιστροφή γύρω από τον κρίσιμο κόμβο αρκεί για να επιλυθεί το πρόβλημα με το balance του!
AVL tree Insert(x, T) Περίπτωση RL ( Rigt - Left): Η πρώτη ακμή οδηγεί δεξιά και η δεύτερη αριστερά. Απαιτούνται δύο περιστροφές, μια δεξιά περιστροφή γύρω από τον επόμενο του κρίσιμου κόμβου στο μονοπάτι του οδηγεί στον v και μια αριστερή περιστροφή γύρω από τον κρίσιμο κόμβο. Περίπτωση LR ( Left - Rigt): Η πρώτη ακμή οδηγεί αριστερά και η δεύτερη δεξιά. Είναι συμμετρική της περιπτώσεως RL. Απαιτούνται δύο περιστροφές, μια αριστερή περιστροφή γύρω από τον επόμενο του κρίσιμου κόμβου στο μονοπάτι που οδηγεί στον v και μια δεξιά περιστροφή γύρω από τον κρίσιμο κόμβο.
+1 ΚΚΕ +2 ΚΚΕ 0-1 +1 0-1 0 +1 0 0
x -+1 A B C Μορφή του υποδένδρου με ρίζα τον ΚΚΕ x, πριν την ένθεση.
Περίπτωση (i) +2 x 0 +2 A B +1 C +1 Χ 0 Α Β C +1
Περίπτωση (ii) +2 A +2-1 x z -1 B 1 B 2-2 C +1 +2 A +2 B 1 x +1 B 2-2 z +1 C +1 A x 0 B 1 0 z B 2-2 +1
AVL tree Delete(x, T)
Αποσβέσεις
Αποσβέσεις -1 ΚΚA ii) -1 iii) 0/ +1 ΚΚA i) 0 ΚΚA +1 +1 0 0-1 0-1 0
Διαγραφή x -+1 A B C Μορφή του υποδένδρου με ρίζα τον ΚΚΕ x, πριν την aπόσβεση στο Α
Περίπτωση (i)-τερματική +2 x -1 +1 A -2 0 B C Χ +1 Α Β -2 C +1
Περίπτωση (ii) μη τερματική +2 x 0 +1 A -2 +1 B C -2 Χ 0 Α Β -2-2 C
Περίπτωση (iii) μη τερματική +1 A +2-2 +1 x z -1 B 1 B 2-3 -2 C -2 +2 A +2 B 1-3 x +2 B 2-2 z 0 C -2 A x -2-1 B 1-3 0 z B 2-2 0 C -2
Περίπτωση (iv) - απορρόφηση 0 x -1 x A B A B
(a,b)-tree Έστω a, b ακέραιοι τέτοιοι ώστε a 2 και b 2a-1. Ένα δέντρο Τ είναι (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 10 12 v 2 7 10 12 1 3 7 9 10 11 15 1 3 7 9 10 11 15
Sare(v) 4 9 u 4 9 u 4 10 u v 2 7 10 12 v 2 10 12 v 2 9 11 1 3 7 9 10 11 15 1 3 9 10 11 15 1 3 9 10 11 15
Fuse(v) 4 10 4 10 u 10 v u 2 9 11 9 v 11 4 9 11 1 3 9 10 11 15 1 9 10 11 15 1 9 10 11 15
Παράδειγμα (α,b) δέντρου
Δέντρο Δακτυλοδοτούμενης Εύρεσης