Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεΝάρκισσος Αρβανίτης Τροποποιήθηκε πριν 6 χρόνια
1
19η Διάλεξη Εξωτερική Αναζήτηση και Β-δέντρα Ε. Μαρκάκης
Δομές Δεδομένων 19η Διάλεξη Εξωτερική Αναζήτηση και Β-δέντρα Ε. Μαρκάκης
2
Περίληψη Ακολουθιακή πρόσβαση Β-δέντρα
Υλοποίηση πίνακα συμβόλων με Β-δέντρα Αναζήτηση Εισαγωγή Δομές Δεδομένων
3
Εισαγωγή Εσωτερική και εξωτερική αναζήτηση
Εσωτερική: τα (περισσότερα) δεδομένα βρίσκονται στη μνήμη Κυριαρχεί το κόστος των πράξεων Εξωτερική: τα (περισσότερα) δεδομένα δεν βρίσκονται στη μνήμη αλλά σε εξωτερική συσκευή (π.χ. σκληρός δίσκος) Κυριαρχεί το κόστος μεταφοράς δεδομένων από/προς τη μνήμη Εφαρμογές εξωτερικής αναζήτησης Αναζήτηση σε αρχεία στο δίσκο Μεταφορά δεδομένων από/προς το δίσκο Αναζήτηση στην εικονική μνήμη Μεταφορά δεδομένων από/προς τη φυσική μνήμη Αναζήτηση σε βάσεις δεδομένων Μια βάση δεδομένων αποτελείται από πολλά αρχεία Οι ερωτήσεις στις βάσεις ανάγονται σε αναζητήσεις στα αρχεία Δομές Δεδομένων
4
Οι κανόνες του παιχνιδιού
Μοντέλο κόστους Η συσκευή μνήμης αποτελείται από σελίδες (μπλοκ πληροφοριών) Σελίδες μνήμης: μεταφέρονται από/προς την κρυφή μνήμη (cache) Σελίδες (μπλοκ) δίσκου: μεταφέρονται από/προς την κύρια μνήμη Κάθε σελίδα περιέχει πολλά συνεχόμενα δεδομένα Ο χρόνος ανάγνωσης/εγγραφής των σελίδων κυριαρχεί Ο χρόνος επεξεργασίας σελίδων είναι φορές μικρότερος Η πρώτη πρόσβαση σε μία σελίδα ονομάζεται διερεύνηση Δεδομένα και ευρετήρια Τα δεδομένα είναι αποθηκευμένα σε ένα αρχείο Ο εντοπισμός των δεδομένων γίνεται μέσω ενός ευρετηρίου Μπορούμε να έχουμε πολλά ευρετήρια ανά αρχείο (με βάση διαφορετικό κλειδί) Κάθε κλειδί μπορεί να παρέχει άλλου είδους επεξεργασία Τα ευρετήρια περιέχουν μόνο κλειδιά και όχι δεδομένα Διατηρούμε αναφορές στα πραγματικά δεδομένα αντι να κρατάμε αντίγραφα σε κάθε ευρετήριο Δομές Δεδομένων
5
Ακολουθιακή πρόσβαση Βασική ιδέα: ταξινομημένος πίνακας
Πίνακας με κλειδιά και αναφορές σε δεδομένα Δυαδική αναζήτηση για εντοπισμό κλειδιών 1η βελτίωση: ισορροπημένο δέντρο Κατάτμηση του ευρετηρίου σε σελίδες Εσωτερικοί κόμβοι: αναφέρονται στο ευρετήριο Εξωτερικοί κόμβοι (φύλλα): αναφέρονται στα δεδομένα 2η βελτίωση: χρήση Μ-αδικού δέντρου Το βασικό κόστος είναι η ανάγνωση σελίδων Γεμίζουμε τη σελίδα με Μ κλειδιά / αναφορές Φτάνουμε στη βάση με logMN διερευνήσεις Αν Μ=1000, logMN < 5 για N = 1 τρισεκατομμύριο! Αυτή είναι η ακολουθιακή πρόσβαση με ευρετήριο (indexed sequential access) Δομές Δεδομένων
6
Ακολουθιακή πρόσβαση Παράδειγμα: αναπαράσταση με 5-αδικό δέντρο
Τριψήφια οκταδικά κλειδιά (9 bits) Κάθε σελίδα είναι ένας κόμβος Εσωτερικοί κόμβοι: δείχνουν σε κλειδιά (στο μικρότερο κλειδί της σελίδας) Εξωτερικοί κόμβοι: δείχνουν σε δεδομένα Δομές Δεδομένων
7
Ακολουθιακή πρόσβαση Απόδοση ευρετηρίου
Αναζήτηση: σταθερό πλήθος διερευνήσεων Στην πράξη το logMN είναι σταθερό Παράδειγμα: έστω 1030 αντικείμενα (!!!) log = 10 αφού (103)10 = 1030 Εισαγωγή: αν δεν είμαστε προσεκτικοί κοστίζει πολύ Πιθανή ανακατασκευή ολόκληρου του ευρετηρίου μετά από 1 εισαγωγή Σε παλιότερα συστήματα χρησιμοποιούσαμε σελίδες υπερχείλισης Στα σύγχρονα συστήματα χρησιμοποιούμε B-δέντρα Δομές Δεδομένων
8
Β-δέντρα Β-δέντρα: γενίκευση των δέντρων 2-3-4
Μ-αδικά δέντρα με περιορισμούς στο πλήθος συνδέσμων κάθε κόμβου Επιλέγουμε άρτιο M τέτοιο ώστε κάθε κόμβος να χωράει σε μία σελίδα Κάθε κόμβος πρέπει να έχει M/2 έως M συνδέσμους Η ρίζα (μόνο) επιτρέπεται να έχει 2 έως M συνδέσμους Τα δέντρα είναι B-δέντρα με M=4 Προτάθηκαν από τους Bayer, McCreight 1970 δέντρο = Β-δέντρο με Μ = 8 Δομές Δεδομένων
9
Β-δέντρα Υλοποίηση B-δέντρων
Κάθε κόμβος είναι ένας πίνακας στοιχείων/συνδέσμων Αναζήτηση: ξεκινάμε από τη ρίζα, τελέιώνουμε πάντα στο τελευταίο επίπεδο Δεν κρατάμε δεδομένα σε εσωτερικούς κόμβους Σε κάθε επίπεδο κάνουμε δυαδική αναζήτηση για το κλειδί Αν το κλειδί υπάρχει θα βρεθεί στο τελευταίο επίπεδο Εισαγωγή: ξεκινάμε όπως στην αναζήτηση Εισάγουμε το κλειδί στο τελευταίο επίπεδο Αν δεν χωράει, σπάμε τον κόμβο σε δύο ίσα μέρη (αναδρομικά) Ανοδική εισαγωγή Μπορούμε να υλοποιήσουμε και καθοδική εισαγωγή όπως στα δέντρα Δομές Δεδομένων
10
Β-δέντρα Παράδειγμα εισαγωγής
Οι εσωτερικοί κόμβοι δεν δείχνουν σε δεδομένα αλλά σε κλειδιά Δομές Δεδομένων
11
Β-δέντρα Παράδειγμα εισαγωγής Η ρίζα μπορεί να έχει μόνο 2 στοιχεία
Δομές Δεδομένων
12
Β-δέντρα Πρακτική υλοποίηση B-δέντρων
Οι εξωτερικές σελίδες περιέχουν τα ίδια τα κλειδιά Κάθε καταχώριση δείχνει σε ένα στοιχείο στο δίσκο Οι εσωτερικές σελίδες περιέχουν αντίγραφα των κλειδιών Κάθε καταχώριση k δείχνει σε μία άλλη σελίδα Η σελίδα περιέχει κλειδιά που ξεκινάνε από k Περιεχόμενα κόμβου Πίνακας καταχωρίσεων Πλήθος ενεργών καταχωρίσεων (M/2 ως Μ εκτός από τη ρίζα) Κάθε καταχώριση στον κόμβο περιέχει Κλειδί: χρησιμοποιείται σε όλους τους κόμβους Δείκτης προς κόμβο: μόνο για εσωτερικούς κόμβους Δείκτης προς στοιχείο: μόνο για εξωτερικούς κόμβους Θα μπορούσαμε να έχουμε και διαφορετικούς τύπους κόμβων Δομές Δεδομένων
13
Β-δέντρα Τάξη B-δέντρου: το HT δείχνει το επίπεδο της ρίζας class ST {
private class entry { // κλάση καταχώρισης KEY key; ITEM item; Node next; entry(KEY v, ITEM x) { key = v; item = x; } entry(KEY v, Node u) { key = v; next = u; } } private class Node { int m; // πλήθος ενεργών καταχωρίσεων entry[] b; // πίνακας καταχωρίσεων Node(int k){b = new entry[M]; m = k; } } private Node head; private int HT; //επίπεδο ρίζας ST(int maxN) { HT = 0; head = new Node(0); } ITEM search(KEY key) void insert(ITEM x)} Δομές Δεδομένων
14
Β-δέντρα Αναζήτηση σε B-δέντρο
Στο επίπεδο 0 ψάχνουμε για το ίδιο το κλειδί Στα άλλα επίπεδα ψάχνουμε για τον κατάλληλο κόμβο private ITEM searchR(Node h, KEY v, int ht) { if (ht == 0) for (int j = 0; j < h.m; j++) { entry e = h.b[j]; if (equals(v, e.key)) return e.item; } else for (int j = 0; j < h.m; j++) if ((j+1 == h.m) || less(v, h.b[j+1].key)) return searchR(h.b[j].next, v, ht-1); return null; } ITEM search(KEY key) {return searchR(head, key, HT);} Δομές Δεδομένων
15
Β-δέντρα Εισαγωγή σε B-δέντρο
Αρχικά εισάγουμε αναδρομικά το στοιχείο (θα εισαχθεί τελικά στο τελευταίο επίπεδο, πιθανό να χριεαστεί διάσπαση κόμβου στα 2) Αν επιστραφεί null δεν χρειάζεται να σπάσει η ρίζα Αλλιώς, φτιάχνουμε νέα ρίζα με 2 στοιχεία Το πρώτο δείχνει στην παλιά ρίζα και έχει το πρώτο κλειδί της Το δεύτερο δείχνει στον νέο κόμβο και έχει το πρώτο κλειδί του Αυξάνουμε το ύψος του δέντρου void insert(ITEM x) { Node u = insertR(head, x, HT); if (u == null) return; Node t = new Node(2); t.b[0] = new entry((head.b[0]).key, head); t.b[1] = new entry((u.b[0]).key, u); head = t; HT++; } Δομές Δεδομένων
16
Β-δέντρα Αναδρομική εισαγωγή σε B-δέντρο: 1ο μέρος
Στο τέλος το j δείχνει στο επόμενο στοιχείο Αν δεν χρειάζεται αλλαγή στον κόμβο επιστρέφουμε private Node insertR(Node h, ITEM x, int ht) { int i, j; KEY v = x.key(); Node u; entry t = new entry(v, x); if (ht == 0) for (j = 0; j < h.m; j++) { if (less(v, (h.b[j]).key)) break; } else for (j = 0; j < h.m; j++) if ((j+1 == h.m) || less(v, (h.b[j+1]).key)) { u = insertR(h.b[j++].next, x, ht-1); if (u == null) return null; t.key = (u.b[0]).key; t.next = u; break; } Δομές Δεδομένων
17
Β-δέντρα Αναδρομική εισαγωγή σε B-δέντρο: 2ο μέρος
Εισάγουμε το στοιχείο t πριν το j Αν έχουμε M στοιχεία χρειάζεται διάσπαση for (i = h.m; i > j; i--) h.b[i] = h.b[i-1]; h.b[j] = t; h.m++; if (h.m < M) return null; else return split(h); } Διάσπαση κόμβου σε B-δέντρο Αντιγράφουμε τα M/2 μεγαλύτερα κλειδιά στον νέο κόμβο private Node split(Node h) { Node t = new Node(M/2); h.m = M/2; for (int j = 0; j < M/2; j++) t.b[j] = h.b[M/2+j]; return t; } Δομές Δεδομένων
18
Β-δέντρα Απόδοση B-δέντρων Αφαίρεση στοιχείων
Υποθέτουμε ότι οι κόμβοι χωράνε M κλειδιά Στην παραπάνω υλοποίηση σπάνε πάντα όταν έχουν M κλειδιά Η απόκλιση είναι ελάχιστη για πρακτικές τιμές του M Η αναζήτηση/εισαγωγή απαιτεί logMN ως logM/2N διερευνήσεις Στην πράξη είναι ένας μικρός σταθερός αριθμός Η εισαγωγή μπορεί να οδηγήσει στο ίδιο πλήθος διασπάσεων Ο απαιτούμενος χώρος είναι 1,44N/M σελίδες κατά μέσο όρο Αφαίρεση στοιχείων Τι γίνεται όταν ένας κόμβος έχει λιγότερα από M/2 στοιχεία; Απαιτείται ανακατανομή στοιχείων με τα αδέλφια Μεταφορά ορισμένων δεικτών από τον διπλανό κόμβο Αναδρομική τροποποιήση των δεικτών του πατέρα Δομές Δεδομένων
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.