Ισοζυγισμένα υαδικά έντρα Αναζήτησης ομές εδομένων 3ο εξάμηνο ιδάσκων: Χρήστος ουλκερίδης ιαφάνειες προσαρμοσμένες από το υλικό της Μαρίας Χαλκίδη
Ισοζυγισμένα υαδικά έντρα Αναζήτησης Ισοζυγισμένα Α είναι δυαδικά δέντρα αναζήτησης με την εξής ιδιότητα Για κάθε κόμβο το ύψος του δεξιού και αριστερού υποδέντρου είναι περίπου το ίδιο Ισοζυγισμένα Α εξασφαλίζουν γενικά αποδοτικότητα O(logN) σε όλες τις περιπτώσεις Του απλού Α είναι O(N) στη χειρότερη περίπτωση
AVL δέντρα - Ορισμός Ένα δυαδικό δέντρο είναι ένα ισοζυγισμένο κατά ύψος p-δέντρο αν για κάθε κόμβο του δέντρου η διαφορά του ύψους των δύο υποδέντρων του είναι το πολύ p το ίδιο ισχύει για κάθε υποδέντρο του AVL-δέντρο είναι ένα ισοζυγισμένο κατά ύψος 1-δέντρο h L h R <=1, h L, h R τα ύψη του αριστερού και δεξιού υποδέντρου αντίστοιχα
AVL δέντρο Μη AVL δέντρο
AVL δέντρα Η αναζήτηση, διαγραφή, εισαγωγή ενός κόμβου σε ένα AVL-δέντρο με n κόμβους μπορεί να πραγματοποιηθεί σε χρόνο ανάλογο του O(logn) στη χειρότερη περίπτωση. Σε κάθε κόμβο ενός AVL δέντρου αντιστοιχεί ο παράγοντας ισοζύγισης (balance factor), οποίος είναι αριστερά υψηλός, ίσος ή δεξιά υψηλός ανάλογα με το αν το αριστερό υποδέντρο έχει μεγαλύτερο, ίσο ή μικρότερο ύψος από το δεξί υποδέντρο αντίστοιχα.
AVL-δέντρα - : πλήρως ισοζυγισμένο δέντρο / : το αριστερό υποδέντρο είναι κατά 1 υψηλότερο \ :το δεξί υποδέντρο είναι κατά 1 υψηλότερο
Μη AVL-δέντρα // : το αριστερό υποδέντρο είναι κατά 2 υψηλότερο \\ :το δεξί υποδέντρο είναι κατά 2 υψηλότερο
Εισαγωγή AVL δέντρου Η εισαγωγή σ ένα AVL δέντρο μπορεί να οδηγήσει στο γίνει ένα μη ισοζυγισμένο δέντρο Πρέπει συνεπώς να ισοζυγιστεί πριν ολοκληρωθεί η λειτουργία της εισαγωγής Μόνο η ισοζύγιση των κόμβων στο μονοπάτι από τη ρίζα προς το σημείο εισαγωγής μπορεί να μεταβληθεί
Ισοζύγιση AVL δέντρου Έστω Χ ο κόμβος προς ισοζύγιση Κάθε κόμβος μπορεί να έχει το πολύ δύο παιδιά Το δέντρο είναι μη ισοζυγισμένο, άρα το ύψος των δύο υποδέντρων του Χ θα διαφέρει κατά 2
Ισοζύγιση AVL δέντρου (συνέχεια...) Παραβίαση ισοζύγισης θα μπορούσε να συμβεί σε μία από τις παρακάτω περιπτώσεις: Εισαγωγή στο αριστερό υποδέντρο του αριστερού παιδιού του Χ (LL) Εισαγωγή στο δεξί υποδέντρο του αριστερού παιδιού του Χ (RL) Εισαγωγή στο αριστερό υποδέντρο του δεξιού παιδιού του Χ (LR) Εισαγωγή στο δεξί υποδέντρο του δεξιού παιδιού του Χ (RR)
Μονή περιστροφή (Ι) Στην περίπτωση εισαγωγής εξωτερικά Αριστερό υποδέντρο αριστερό παιδί εξί υποδέντρο δεξί παιδί η ισορροπία αποκαθίσταται με απλή (μονή) περιστροφή του δέντρου Η μονή περιστροφή αλλάζει τους ρόλους του πατέρα και του παιδιού ενώ διατηρεί τη σειρά αναζήτησης
Μονή περιστροφή (ΙΙ) static BinaryNode rotatewithleftchild(binarynode k2) { BinaryNode k1 = k2.leftchild; k2.leftchild = k1.rightchild; k1.rightchild = k2; return k1; }
Απλή περιστροφή ενός AVL δέντρου μετά την εισαγωγή του 1
Περιστροφή για αποκατάσταση του AVL δέντρου μετά από εισαγωγή σε δεξί παιδί, δεξιού υποδέντρου static BinaryNode rotatewithrightchild(binarynode k1) { BinaryNode k2 = k1.rightchild; k1.rightchild = k2.leftchild; k2.leftchild = k1; return k2; }
ιπλή περιστροφή Η μονή περιστροφή δεν αντιμετωπίζει τις περιπτώσεις που η μη ισοζύγιση προέρχεται από Εισαγωγή στο δεξί υποδέντρο του αριστερού παιδιού Εισαγωγή στο αριστερό υποδέντρο του δεξιού παιδιού Οι περιπτώσεις αυτές απαιτούν διπλή περιστροφή
Εισαγωγή στο δεξί υποδέντρο του αριστερού παιδιού Το υποδέντρο Q είναι πολύ βαθύ και μία απλή περιστροφή δεν μπορεί να το κάνει λιγότερο βαθύ Το Q δεν είναι κενό καθώς έχει εισαχθεί σε αυτό τουλάχιστον ένας κόμβος
Εισαγωγή στο δεξί υποδέντρο του αριστερού παιδιού Μπορούμε να το δούμε το δέντρο σαν τέσσερα υποδέντρα συνδεδεμένα με τρεις κόμβους Το υποδέντρο B ή το C είναι δύο επίπεδα βαθύτερο από από το υποδέντρο D Η περιστροφή μεταξύ του k1 και του k3 δεν δουλεύει Η μόνη εναλλακτική είναι να τοποθετήσουμε το k2 σαν νέο κόμβο
Εισαγωγή στο δεξί υποδέντρο του αριστερού παιδιού
Περιστροφή αριστερό παιδί με το δεξί παιδί του k3 με το νέο αριστερό παιδί static BinaryNode doublerotatewithleftchild(binarynode k3) { k3.left = rotatewithrightchild(k3.left); return rotatewithleftchild(k3); }
Εισαγωγή στο αριστερό υποδέντρο του δεξιού παιδιού Περιστροφή δεξί παιδί με το αριστερό παιδί του k1 με το νέο δεξί παιδί static BinaryNode doublerotatewithrightchild( BinaryNode k1) { k1.right = rotatewithleftchild(k1.right); return rotatewithrightchild(k1); }
ιπλή περιστροφή == δύο απλές περιστροφές X ο κόμβος που τα δύο υποδέντρα του διαφέρουν κατά 2 επίπεδα Περιστροφή μεταξύ του παιδιού του Χ και του απογόνου του Περιστροφή μεταξύ του Χ και του νέου παιδιού X k1 k1 k2 k3 k2 k1 k3 Α k2 Α k3 D B Α B C D Β C C D
Παράδειγμα(I)
Παράδειγμα (ΙΙ)
Παράδειγμα (ΙΙΙ)
Παράδειγμα (ΙV)
Παράδειγμα (V)
Σύνοψη Πράξεων Περιστροφής Εισάγουμε κόμβο με κλειδί q Ακολουθούμε το μονοπάτι από το σημείο εισαγωγής προς τη ρίζα Βρίσκουμε τον πρώτο κόμβο που παραβιάζει τη συνθήκη AVL, με κλειδί k Έστω τα κλειδιά των παιδιών του «προβληματικού» κόμβου με κλειδί k kl το κλειδί του αριστερού παιδιού kr το κλειδί του δεξιού παιδιού
Σύνοψη Πράξεων Περιστροφής Αν q < kl, k τότε χρειάζεται περιστροφή L Εισαγωγή σε αριστερό υποδέντρο αριστερού παιδιού του k Αν q > kr, k τότε χρειάζεται περιστροφή R Εισαγωγή σε δεξιό υποδέντρο δεξιού παιδιού του k Αν kl < q < k τότε χρειάζεται περιστροφή LR Εισαγωγή σε δεξιό υποδέντρο αριστερού παιδιού του k Αν k < q < kr τότε χρειάζεται περιστροφή RL Εισαγωγή σε αριστερό υποδέντρο δεξιού παιδιού του k
Άσκηση Υλικό από τις διαφάνειες του Ορέστη Τελέλη
Λύση (1/8) Υλικό από τις διαφάνειες του Ορέστη Τελέλη
Λύση (2/8) Υλικό από τις διαφάνειες του Ορέστη Τελέλη
Λύση (3/8) Υλικό από τις διαφάνειες του Ορέστη Τελέλη
Λύση (4/8) Υλικό από τις διαφάνειες του Ορέστη Τελέλη
Λύση (5/8) Υλικό από τις διαφάνειες του Ορέστη Τελέλη
Λύση (6/8) Υλικό από τις διαφάνειες του Ορέστη Τελέλη
Λύση (7/8) Υλικό από τις διαφάνειες του Ορέστη Τελέλη
Λύση (8/8) Υλικό από τις διαφάνειες του Ορέστη Τελέλη
Απόδειξη: Τα Α AVL έχουν ύψος O(logn) Υλικό από τις διαφάνειες του Ορέστη Τελέλη
Ταξινόμηση AVL Υλικό από τις διαφάνειες του Ορέστη Τελέλη
Ταξινόμηση AVL Υλικό από τις διαφάνειες του Ορέστη Τελέλη