Δομή 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 δεν βρίσκεται στο αρχείο δεδομένων εγγραφή με τιμή πεδίου αναζήτησης Κ;