210 likes | 362 Views
Lab 6: AVL Trees. EPL231 – Data Structures and Algorithms. AVL Δέντρα. AVL ( G.M. A delson- V elskii , E.M. L andis) δέντρο: Είναι Δυαδικό Δέντρο Αναζήτησης Τα υποδέντρα ενός οποιουδήποτε κόμβου έχουν ύψος το οποίο διαφέρει το πολύ κατά ένα Χρόνοι: Εισαγωγή Διαγραφή Αναζήτηση. 2. 2.
E N D
Lab 6: AVL Trees EPL231 – Data Structures and Algorithms ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
AVL Δέντρα • AVL ( G.M. Adelson-Velskii , E.M. Landis) δέντρο: • Είναι Δυαδικό Δέντρο Αναζήτησης • Τα υποδέντρα ενός οποιουδήποτε κόμβου έχουν ύψος το οποίο διαφέρει το πολύ κατά ένα • Χρόνοι: • Εισαγωγή • Διαγραφή • Αναζήτηση ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
2 2 1 3 3 4 2 2 1 3 1 4 Παραδείγματα AVL Δέντρων 2 ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
Παραδείγματα Εκτέλεσης ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
Παράδειγμα • Εισαγωγή των στοιχείων {72, 26, 9} Εισαγωγή 72: ΠΕΡΙΣΤΡΟΦΗ Εισαγωγή 26: 72 ΑΝΙΣΟΖΥΓΙΑ Εισαγωγή 9: 26 9 ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
h h h+1 h+1 Αριστερή Περιστροφή • Πριν την εισαγωγή: τα δένδρα R, S, T έχουν το ίδιο ύψος, h. • Μετά την εισαγωγή: έστω ότι ο κόμβος εισάγεται στο δένδρο R με αποτέλεσμα το ύψος του να γίνει h+1. • Η αριστερή περιστροφή υλοποιεί το εξής: B Α A περιστροφή Β A C h C T R h h S R S T ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
Διαδικασία Α-περιστροφής • Αριστερή περιστροφή του (A,B) σημαίνει • Α.left = Β.right • Β.right = Α • Α.height =C.height+1 • Β.height = C.height + 2 • Πριν την περιστροφή ο Α ήταν ο πατέρας του Β, και μετά, ο Β είναι ο πατέρας του Α. • Το δένδρο παραμένει δυαδικό δένδρο αναζήτησης: • Κάθε τιμή του Υ είναι μικρότερη από την τιμή του u, • η τιμή του u είναι μεγαλύτερη από την τιμή του v. • Μετά την περιστροφή το δένδρο είναι AVL: Α.height = h + 1 = ύψος του R. ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
50 42 72 99 46 61 5 43 58 65 51 Παράδειγμα Α-περιστροφής ΑΝΙΣΟΖΥΓΙΑ Α-ΠΕΡΙΣΤΡΟΦΗ ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
h h Δεξιά Περιστροφή • Συμμετρική ως προς την αριστερή περιστροφή. • Πριν την εισαγωγή: τα δένδρα R, S, T έχουν το ίδιο ύψος, h. • Μετά την εισαγωγή: έστω ότι ο κόμβος εισάγεται στο δένδρο Τ με αποτέλεσμα το ύψος του Τ να γίνει h+1. Α C Β C A Δ περιστροφή h+1 B R h+1 T S h h+1 S R T ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
Διαδικασία Δ-περιστροφής • Δεξιά περιστροφή του (A,C) σημαίνει • Α.right = C.left • C.left = Α • Α.height =B.height+1 • C.height = B.height + 2 • Πριν την περιστροφή ο Α ήταν ο πατέρας του C, και μετά, ο C είναι ο πατέρας του Α. • Το δένδρο παραμένει δυαδικό δένδρο αναζήτησης. ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
h h ΑΔ-Περιστροφή • Τα δένδρα Χ και W έχουν ύψος h. Μετά από κάποια εισαγωγή, το w έχει ύψος h+1, προκαλώντας ανισοζυγία στο u. u w AΔ περιστροφή v v u W h+1 h+1 w Z W X Y X h h+1 Y Z ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
72 9 2 21 25 Παράδειγμα ΑΔ-περιστροφής • Με την εισαγωγή των στοιχείων 72, 26, 9, 2, 21, 25 σε ένα ΑVL-δένδρο, δημιουργείται ανισοζυγία στον κόμβο 26. • Με εφαρμογή ΑΔ περιστροφής έχουμε: ΑΝΙΣΟΖΥΓΙΑ ΑΔ ΠΕΡΙΣΤΡΟΦΗ 26 ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
h ΔA-Περιστροφή • Τα δένδρα Χ και W έχουν ύψος h. Μετά από κάποια εισαγωγή, το w έχει ύψος h+1, προκαλώντας ανισοζυγία στο u. u w ΔΑ περιστροφή u v v h+1 X h+1 Z W X Y w h W h h+1 Y Z ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
4 2 3 1 5 14 15 7 13 Παράδειγμα ΔΑ περιστροφής ΔΑ ΠΕΡΙΣΤΡΟΦΗ ΑΝΙΣΟΖΥΓΙΑ 6 ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
Διαδικασίες ΑΔ και ΔΑ-περιστροφής • ΑΔ περιστροφή του (u,v,w) υλοποιείται ως εξής: • v.right = w.left, • u.left = w.right, • w.left = v, • w.right = u, • v.height, u.height, w.height = … • ΔΑ περιστροφή του (u,v,w) υλοποιείται ως εξής: • v.left = w.right, • u.right = w.left, • w.left = u, • w.right = v, και • v.height, u.height, w.height = …. • H περιστροφές δεν παραβιάζουν τη ΔΔΑ συνθήκη. • Το δένδρο που δημιουργείται είναι AVL-δένδρο (οι κόμβοι v και u έχουν ύψος h+1). ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
Πως αποφασίζουμε το είδος της περιστροφής • Στην θεωρία είναι εύκολο. • Βλέπουμε τις κατευθύνσεις που ακολουθήσαμε για να εισάξουμε τον κόμβο • Ανάλογα με τις κατευθύνσεις, επιλέγουμε το είδος της περιστροφής. • Τι γίνεται τώρα που πρέπει να γράψουμε κώδικα? ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
Εφαρμογή περιστροφών • Εισάγουμε το στοιχείο στο κατάλληλο φύλλο όπως ακριβώς σε ένα δυαδικό δένδρο αναζήτησης. Καταγράφουμε τη διαδρομή που ακολουθήσαμε, δηλαδή αν r είναι η ρίζα και u είναι το φύλλο που προσθέσαμε τότε παίρνουμε διαδρομή με μορφή: • Ακολουθούμε τη διαδρομή προς τα πίσω και δίνουμε στα πεδία height των κόμβων τις νέες τους τιμές. • Αν σε κάποιο σημείο αυτό προκαλέσει ανισοζυγία, και μόλις συμβεί αυτό, (δηλ. αν έχει σαν αποτέλεσμα κάποιοι κόμβοι να έχουν παιδιά που το ύψος τους διαφέρει κατά τιμή >1), τότε εφαρμόζουμε στον κόμβο αυτό, έστω vi , την κατάλληλη περιστροφή. Επιλέγουμε την περιστροφή ως εξής: ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
Εφαρμογή περιστροφών • αν ο vi-1 είναι αριστερό παιδί του vi και ο vi-2 αριστερό παιδί του vi-1 τότε εφαρμόζουμε την A-περιστροφή, • αν ο vi-1 είναι δεξιό παιδί του vi και ο vi-2 δεξιό παιδί του vi-1 τότε εφαρμόζουμε τη Δ-περιστροφή, • αν ο vi-1 είναι αριστερό παιδί του vi και ο vi-2 δεξιό παιδί του vi-1 τότε εφαρμόζουμε την AΔ-περιστροφή, • αν ο vi-1 είναι δεξιό παιδί του vi και ο vi-2 αριστερό παιδί του vi-1 τότε εφαρμόζουμε τη ΔA-περιστροφή. ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
Πως αποφασίζουμε το είδος της περιστροφής • Περιστροφή αριστερά: • Κάναμε εισαγωγή αριστερά δύο φορές Αριστερή Περιστροφή singleRotationLeft() • Κάναμε εισαγωγή αριστερά και μετά δεξία ΑΔ περιστροφήdoubleRotationLeftRight() • Περιστροφή δεξιά: • Κάναμε εισαγωγή δεξιά δύο φορές Δεξιά ΠεριστροφήsingleRotationRight() • Κάναμε εισαγωγή δεξιά και μετά αριστερά ΔΑ περιστροφήdoubleRotationRightLeft() ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
Δομές – Συναρτήσεις • Βρίσκονται στα αρχεία • AVLTree.h • AVLTree.cpp • Συμπληρώστε την: • insertNode() • Υλοποίηστε: • singleRotationLeft() • singleRotationRight() • doubleRotationLeftRight() • doubleRotationRightLeft() ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι
The End ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι