Δομή B+ δέντρου | Αναζήτηση | Εισαγωγή | Applet | Τάξη | Links | Δομές Δεδομένων |
|
Εικόνα 1:Αναζήτηση στοιχείου Κ=10 |
Έστω οτι αναζητούμε μία εγγραφή με τιμή πεδίου κλειδιού αναζήτησης Κ=10. Η διαδρομή που ακολουθούμε σκιαγραφείται με κόκκινο χρώμα. Ξεκινάμε από τη ρίζα η οποία έχει το στοιχείο 74. Ο δείκτης αριστερά του 74 δείχνει σε υποδέντρο των οποίων οι κόμβοι έχουν τιμές μικρότερες του 74.Επειδή 10<74 πηγαίνουμε στον αριστερό κόμβο που δείχνει η ρίζα. Ακολουθώντας την ίδια λογική ο δείκτης μεταξύ του 3 και του 50 θα δείχνει σε φύλλο των οποίων τα στοιχεία θα είναι μεταξύ 3 και 50. Επειδή 3<10<50 ακολουθούμε αυτόν τον δείκτη. Τώρα βρισκόμαστε σε ένα φύλλο που πιθανώς θα έχει το στοιχείο K=10 που ζητάμε. Κάνουμε διαδοχική αναζήτηση στα στοιχεία του φύλλου και πράγματι βρίσκουμε ότι το στοιχείο 10 υπάρχει. Δεξιά του 10 υπάρχει δείκτης προς την εγγραφή η οποία περιέχει το στοιχείο 10.
Ο χρόνος εύρεσης στοιχείου Κ σε ένα
B+
δέντρο είναι h, όπου h το ύψος του δέντρου. Κάτι τέτοιο είναι
φανερό μια που το B+ δέντρο είναι ισοζυγισμένο και όλα τα
στοιχεία βρίσκονται στα φύλλα, στο ίδιο επίπεδο, σε βάθος
h.
Σε ένα
πραγματικό σύστημα βάσης δεδομένων μας ενδιαφέρει ο αριθμός των σελίδων που θα
προσπελάσουμε στο δίσκο μέχρι να φέρουμε στη
RAM την εγγραφή που μας
ενδιαφέρει. Δεδομένου ότι ο κάθε κόμβος του B+
δέντρου
αποτελεί και μια σελίδα στο δίσκο και με την παραδοχή
ότι η ρίζα
κρατείται στην κύρια μνήμη, η προσπέλαση οποιασδήποτε εγγραφής στο κύριο αρχείο
γίνεται με κόστος ανάγνωσης h σελίδων. Φορτώνουμε δηλαδή αρχικά
h σελίδες για να βρούμε το φύλλο που περιέχει τόσο την τιμή
Κ
όσο και τον δείκτη Pri προς την εγγραφή. Στη συνέχεια κάνουμε
ακόμα μια ανάγνωση σελίδας φορτώνοντας τη διεύθυνση που δείχνει ο
Pri και περιέχει την εγγραφή που θέλουμε.
Ο παρακάτω αλγόριθμος σκιαγραφεί τη διαδικασία αναζήτησης μια εγγραφής με χρήση B+ δέντρου ως δομή προσπέλασης. Η εγγραφή που ζητάμε έχει τιμή πεδίου κλειδιού K. Ο αλγόριθμός μπορεί να τερματίσει πληροφορώντας μας πως δεν υπάρχει εγγραφή με τιμή πεδίου κλειδιού Κ. Διαφορετικά χρησιμοποιώντας την διεύθυνση Pri που βρήκε από το B+ δέντρο ανακτά τη συγκεκριμένη εγγραφή .
n το μπλοκ που περιέχει τον κόμβο-ρίζα του
B+
δέντρου;
read το μπλόκ n;
while( το n δέν
είναι κόμβος-φύλλο του B+ δέντρου) do
begin
q ¬ το πλήθος των δεικτών
δέντρου στον κόμβο n
if K.<
n.K1 (* n.Ki είναι η τιμή του
i-οστού πεδίου αναζήτησης στον κόμβο n*)
then n ¬
n.P1(* n.Pi είναι η τιμή του i-οστού
δείκτη δέντρου στον κόμβο n*)
else if
K³n.Kq-1
then n ¬ n.Pq
else
begin
αναζήτηση στον κόμβο n για μια καταχώριση
i τέτοια ώστε
n.Ki-1£K<n.Ki;
n ¬ n.Pi
end;
read το μπλοκ n
end;//(while)
αναζήτηση στο μπλοκ n για καταχώρηση
(Ki,Pri) με
K=Ki;(*αναζήτηση κόμβου-φύλλου*)
if
found
then read το μπλοκ δεδομένων με διεύθυνση
Pri και ανάκτηση εγγραφής
else δεν βρίσκεται στο
αρχείο δεδομένων εγγραφή με τιμή πεδίου αναζήτησης Κ;