Download - EPL231 – Data Structures and Algorithms

Transcript
Page 1: EPL231 – Data Structures and Algorithms

Lab 6: AVL Trees

29/10/2010 1ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 2: EPL231 – Data Structures and Algorithms

29/10/2010

AVL ( G.M. Adelson-Velskii , E.M. Landis) δέντρο: Είναι Δυαδικό Δέντρο Αναζήτησης Τα υποδέντρα ενός οποιουδήποτε κόμβου

έχουν ύψος το οποίο διαφέρει το πολύ κατά ένα

Χρόνοι: Εισαγωγή Διαγραφή Αναζήτηση

logO N

2ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 3: EPL231 – Data Structures and Algorithms

29/10/2010

2

1 3

2

1 3

4

2

2

1

2

3

4

3ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 4: EPL231 – Data Structures and Algorithms

29/10/2010 4ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 5: EPL231 – Data Structures and Algorithms

29/10/2010

Εισαγωγή 72:Εισαγωγή 26:Εισαγωγή 9:

72

26

9

ΑΝΙΣΟΖΥΓΙΑ

ΠΕΡΙΣΤΡΟΦΗ

Εισαγωγή των στοιχείων {72, 26, 9}

5ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 6: EPL231 – Data Structures and Algorithms

29/10/2010

Πριν την εισαγωγή: τα δένδρα R, S, T έχουν το ίδιο ύψος, h.

Μετά την εισαγωγή: έστω ότι ο κόμβος εισάγεται στο δένδρο R με αποτέλεσμα το ύψος του να γίνει h+1.

Η αριστερή περιστροφή υλοποιεί το εξής:

A περιστροφήΑ

Β C

R S

T

h h

h

h+1

B

A

CR

S T

h+1

hh

6ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 7: EPL231 – Data Structures and Algorithms

Αριστερή περιστροφή του (A,B) σημαίνει1. Α.left = Β.right2. Β.right = Α3. Α.height = C.height+1

4. Β.height = C.height + 2

Πριν την περιστροφή ο Α ήταν ο πατέρας του Β, και μετά, ο Β είναι ο πατέρας του Α.

Το δένδρο παραμένει δυαδικό δένδρο αναζήτησης: Κάθε τιμή του Υ είναι μικρότερη από την τιμή του u, η τιμή του u είναι μεγαλύτερη από την τιμή του v.

 

Μετά την περιστροφή το δένδρο είναι AVL:Α.height = h + 1 = ύψος του R.

29/10/2010 7ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 8: EPL231 – Data Structures and Algorithms

29/10/2010

50

42

5 46

43

61

65

72

99

58

51

ΑΝΙΣΟΖΥΓΙΑΑ-ΠΕΡΙΣΤΡΟΦΗ

8ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 9: EPL231 – Data Structures and Algorithms

29/10/2010

Συμμετρική ως προς την αριστερή περιστροφή. Πριν την εισαγωγή: τα δένδρα R, S, T έχουν το ίδιο

ύψος, h. Μετά την εισαγωγή: έστω ότι ο κόμβος εισάγεται στο

δένδρο Τ με αποτέλεσμα το ύψος του Τ να γίνει h+1.

Α

Β C

R

S

T

C

A

R S

T

B

Δ περιστροφή

h

hhh+1

h+1

h+1

9ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 10: EPL231 – Data Structures and Algorithms

29/10/2010

Δεξιά περιστροφή του (A,C) σημαίνει1.Α.right = C.left2.C.left = Α3.Α.height = B.height+14.C.height = B.height + 2

Πριν την περιστροφή ο Α ήταν ο πατέρας του C, και μετά, ο C είναι ο πατέρας του Α.

Το δένδρο παραμένει δυαδικό δένδρο αναζήτησης.

10ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 11: EPL231 – Data Structures and Algorithms

29/10/2010

Τα δένδρα Χ και W έχουν ύψος h. Μετά από κάποια εισαγωγή, το w έχει ύψος h+1, προκαλώντας ανισοζυγία στο u.

u

v

wX

Y Z

W

w

v u

X Y Z W

AΔ περιστροφή

h

h

hh+1

h+1h+1

11ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 12: EPL231 – Data Structures and Algorithms

29/10/2010

Με την εισαγωγή των στοιχείων 72, 26, 9, 2, 21, 25 σε ένα ΑVL-δένδρο, δημιουργείται ανισοζυγία στον κόμβο 26. 

Με εφαρμογή ΑΔ περιστροφής έχουμε:

26

72 9

2 21

25

ΑΝΙΣΟΖΥΓΙΑΑΔ ΠΕΡΙΣΤΡΟΦΗ

12ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 13: EPL231 – Data Structures and Algorithms

29/10/2010

Τα δένδρα Χ και W έχουν ύψος h. Μετά από κάποια εισαγωγή, το w έχει ύψος h+1, προκαλώντας ανισοζυγία στο u.

u

v

w

X

YZ

W

w

u v

X Y Z W

ΔΑ περιστροφή

h

hhh+1

h+1h+1

13ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 14: EPL231 – Data Structures and Algorithms

29/10/2010

4

2

3 1

6

5 14

15 7

13

ΑΝΙΣΟΖΥΓΙΑΔΑ ΠΕΡΙΣΤΡΟΦΗ

14ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 15: EPL231 – Data Structures and Algorithms

29/10/2010

ΑΔ περιστροφή του (u,v,w) υλοποιείται ως εξής:1. v.right = w.left,2. u.left = w.right,3. w.left = v,4. w.right = u,5. v.height, u.height, w.height = …

ΔΑ περιστροφή του (u,v,w) υλοποιείται ως εξής:1. v.left = w.right,2. u.right = w.left,3. w.left = u, 4. w.right = v, και5. v.height, u.height, w.height = ….

H περιστροφές δεν παραβιάζουν τη ΔΔΑ συνθήκη. Το δένδρο που δημιουργείται είναι AVL-δένδρο (οι κόμβοι v και

u έχουν ύψος h+1).

15ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 16: EPL231 – Data Structures and Algorithms

29/10/2010

Στην θεωρία είναι εύκολο. Βλέπουμε τις κατευθύνσεις που

ακολουθήσαμε για να εισάξουμε τον κόμβο

Ανάλογα με τις κατευθύνσεις, επιλέγουμε το είδος της περιστροφής.

Τι γίνεται τώρα που πρέπει να γράψουμε κώδικα?

16ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 17: EPL231 – Data Structures and Algorithms

1. Εισάγουμε το στοιχείο στο κατάλληλο φύλλο όπως ακριβώς σε ένα δυαδικό δένδρο αναζήτησης. Καταγράφουμε τη διαδρομή που ακολουθήσαμε, δηλαδή αν r είναι η ρίζα και u είναι το φύλλο που προσθέσαμε τότε παίρνουμε διαδρομή με μορφή:

2. Ακολουθούμε τη διαδρομή προς τα πίσω και δίνουμε στα πεδία height των κόμβων τις νέες τους τιμές.

3. Αν σε κάποιο σημείο αυτό προκαλέσει ανισοζυγία, και μόλις συμβεί αυτό, (δηλ. αν έχει σαν αποτέλεσμα κάποιοι κόμβοι να έχουν παιδιά που το ύψος τους διαφέρει κατά τιμή >1), τότε εφαρμόζουμε στον κόμβο αυτό, έστω vi , την κατάλληλη περιστροφή. Επιλέγουμε την περιστροφή ως εξής:

rvvvu k ,...,, 21

29/10/2010 ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι 17

Page 18: EPL231 – Data Structures and Algorithms

αν ο 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-περιστροφή.

29/10/2010 ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι 18

Page 19: EPL231 – Data Structures and Algorithms

Περιστροφή αριστερά: Κάναμε εισαγωγή αριστερά δύο φορές

Αριστερή Περιστροφή singleRotationLeft()

Κάναμε εισαγωγή αριστερά και μετά δεξία ΑΔ περιστροφήdoubleRotationLeftRight()

Περιστροφή δεξιά: Κάναμε εισαγωγή δεξιά δύο φορές Δεξιά

ΠεριστροφήsingleRotationRight() Κάναμε εισαγωγή δεξιά και μετά αριστερά

ΔΑ περιστροφήdoubleRotationRightLeft()29/10/2010 19ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 20: EPL231 – Data Structures and Algorithms

Βρίσκονται στα αρχεία AVLTree.h AVLTree.cpp

Συμπληρώστε την: insertNode()

Υλοποίηστε: singleRotationLeft() singleRotationRight() doubleRotationLeftRight() doubleRotationRightLeft()

29/10/2010 20ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι

Page 21: EPL231 – Data Structures and Algorithms

29/10/2010 21ΕΠΛ231 - Δομές Δεδομένων και Αλγόριθμοι