ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ31: Δομές Δεδομένων και Αλγόριθμοι Εαρινό Εξάμηνο 017-018 Φροντιστήριο 5 1. Δικαιολογήστε όλες τις απαντήσεις σας. i. Δώστε τις 3 βασικές ιδιότητες ενός AVL δένδρου. ii. Δώστε τις βασικές ιδιότητες ενός -3 δένδρου. iii. Ποιά η διαφορά ενός δυαδικού δένδρου αναζήτησης από ένα AVL δένδρο; iv. Σωστό ή λάθος: Η απλά συνδεδεμένη λίστα με n κόμβους είναι ένα AVL δένδρο. Απάντηση: i. α) Είναι Δυαδικό Δένδρο. β) Για κάθε κόμβο του AVL δένδρου, όλα τα κλειδιά στο αριστερό υπόδενδρο του κόμβου είναι μικρότερα από το κλειδί του κόμβου και όλα τα κλειδιά στο δεξί υπόδενδρο του κόμβου είναι μεγαλύτερα από το κλειδί του κόμβου. γ) Για κάθε κόμβο του AVL δένδρου, τα υπόδενδρά του έχουν διαφορά ύψους το πολύ 1. ii. α) Κάθε κόμβος ενός -3 δένδρου περιέχει 1 ή κλειδιά. β) Αν ο κόμβος περιέχει 1 κλειδί τότε έχει δύο υπόδενδρα. Στο αριστερό υπόδενδρο βρίσκονται όλα τα κλειδιά μικρότερα του κλειδιο- ύ του κόμβου. Στο μεσαίο υπόδενδρο βρίσκοντα όλα τα κλειδιά μεγαλύτερα του κλειδιού του κόμβου. Αν ο κόμβος περιέχει κλειδιά τότε έχει τρία υπόδενδρα. Στο αριστερό υπόδενδρο βρίσκονται όλα τα κλειδιά μικρότερα του μικρότερου κλειδιού του κόμβου. Στο δεξί υπόδενδρο βρίσκοντα όλα τα κλειδιά μεγαλύτερα του μεγαλύτερου κλειδιού του κόμβου. Στο μεσαίο υπόδενδρο βρίσκονται όλα τα κλειδιά μεγάλυτερα του μικρότερου κλειδιού του κόμβου και μικρότερα του μεγαλύτερου κλειδιού του κόμβου. γ) Ολα τα φύλλα του -3 δένδρου βρίσκοντα στο ίδιο επίπεδο. iii. Σε ένα δυαδικό δένδρο, σε αντίθεση με το AVL δένδρο, δεν ισχύει απαραίτητα ότι για κάθε κόμβο του δένδρου, τα υπόδενδρά του έχουν διαφορά ύψους το πολύ 1. iv. Λάθος. Μια συνδεδεμένη λίστα μήκους 3 για αντί-παράδειγμα δεν είναι AVL δένδρο γιατί τα υπόδενδρα του πρώτου κόμβου της λίστας έχουν διαφορά ύψους.. Συμπληρώσετε το κάθε κελί (χ,ψ) του παρακάτω πίνακα με ναι εάν ένα Δένδρο τύπου γραμμής χ είναι ένα δένδρο τύπου στήλης ψ; διαφορετικά, εάν ένα δένδρο τύπου γραμμής χ δεν είναι ένα δένδρο τύπου στήλης ψ, συμπληρώστε με όχι, π.χ. το ναι στο κελί (1,1) δηλώνει πως ένα γενικό δένδρο είναι ένα γενικό δένδρο. 1
Δένδρο Δυαδικό Δ. Δυαδικό Δ. Αν. AVL Δ. -3 Δ. Β Δ. τάξης 10 Δένδρο Δυαδικό Δ. Δυαδικό Δ. Αν. AVL Δ. -3 Δ. Β Δ. τάξης 10 ναι Απάντηση Γεν. Δένδρο Δυαδικό Δ. Δυαδικό Δ. Αν. AVL Δ. -3 Δ. Β Δ. τάξης 3 Γεν. Δένδρο ναι όχι όχι όχι όχι όχι Δυαδικό Δ. ναι ναι όχι όχι όχι όχι Δυαδικό Δ. Αν. ναι ναι ναι όχι όχι όχι AVL Δ. ναι ναι ναι ναι όχι όχι -3 Δ. ναι όχι όχι όχι ναι ναι Β Δ. τάξης 3 ναι όχι όχι όχι ναι ναι 3. i. Εστω κενό AVL δένδρο. Κάνετε εισαγωγή με τη σειρά τα στοιχεία 0, 10, 13, 4, 31, 7, 81 και 19. Σχεδιάστε το δένδρο που προκύπτει κάθε φορά. Αν υπάρχει περιστροφή κάθε φορά, τί είδους περιστροφή είναι και σε ποιό κόμβο γίνεται; ii. Εστω κενό -3 δένδρο. Κάνετε εισαγωγή με τη σειρά τα στοιχεία 0, 10, 13, 4, 31, 7, 81 και 19. Σχεδιάστε το δένδρο που προκύπτει κάθε φορά. Απάντηση i. Εισαγωγή του 0. 0, 0 Εισαγωγή του 10. 0, 1 10,0 Εισαγωγή του 13. 0, Ανισοζυγία ΑΔ Περιστοφή 13, 1 10,1 10,0 0,0 13,0 Εισαγωγή του 4.
13, 10,0 0,1 4,0 Εισαγωγή του 31. 13, 10,0 0, Ανισοζυγία ΔΑ Περιστοφή 13, 4,1 10,0 31,1 31,0 0,0 4,0 Εισαγωγή του 7. 13, 3 Ανισοζυγία ΔΑ Περιστοφή 0, 10,0 31, 13,1 31,1 0,1 4,0 10,0 7,0 4,0 7,0 Εισαγωγή του 81. 0, 3 13,1 31, 10,0 7,0 4,1 81,0 Εισαγωγή του 19. 3
0, 3 13,1 31, 10,0 19,0 7,0 4,1 81,0 ii. Εισαγωγή του 0. 0 Εισαγωγή του 10. 10 0 Εισαγωγή του 13. 13 10 0 Εισαγωγή του 4. 13 10 0 4 Εισαγωγή του 31. 13 31 10 0 4 Εισαγωγή του 7. 13 31 10 0 7 4 Εισαγωγή του 81. 13 31 10 0 7 4 81 Εισαγωγή του 19. 4
0 13 31 10 19 7 4 8 4. Εστω κενό AVL δένδρο και λίστα κλειδιών Λ = [1,, 3, 4, 5, 6, 7]. (a) Να σχεδιάσετε το όταν εισαχθούν σε αυτό κατά σειρά τα κλειδιά της Λ. (b) Να συμπληρώσετε πιο κάτω τη συνάρτηση BinarySearchTree orderbst(binarysearchtree root, AVLTreeNode node) έτσι ώστε όταν εκτελεστεί η BinarySearchTree reorder(int n) να επιστραφεί ένα δυαδικό δένδρο αναζήτησης ύψους O(n 1). BinarySearchTree reorder ( i n t n) { AVLTree avl new AVLTree ( ) ; for ( i n t i 1 ; i < pow (, n) ; ++ i ) avl. i n s e r t ( i ) ; return orderbst ( new BinarySearchThree ( ), avl. root ) ; } BinarySearchTree orderbst ( BinarySearchTree root, AVLTreeNode node ) { } Απάντηση (a) 4,,1 6,1 1,0 3,0 5,0 7,0 (b) BinarySearchTree orderbst ( BinarySearchTree root, AVLTreeNode node ) { i f ( node. l e f t! null ) orderbst ( root, node. l e f t ) ; root. add ( node. data ) ; i f ( node. r i g h t! null ) orderbst ( root, node. r i g h t ) ; return root ; } 5
5. Εστω κενό AVL δένδρο και n στοιχεία. Δώστε άνω φράγμα της για την πολυπλοκότητα της διαδικασίας που εισάγει όλα τα στοιχεία στο AVL δένδρο. Δικαιολογήστε την απάντησή σας. Απάντηση Η εισαγωγή σε ένα δυαδικό δένδρο αναζήτησης έχει χρονική πολυπλοκότητα O(h) όπου h το ύψος του δένδρου. Το ύψος ενός AVL δένδρου εξαρτάται σε λογαριθμικό βαθμό από τα στοιχεία του. Συνεπώς η εισαγωγή ενός στοιχείου σε ένα AVL δένδρο έχει χρονική πολυπλοκότητα O(log(n)) όπου n τα στοιχεία του δένδρου. Η διαδικασία εισαγωγής n στοιχείων σε ένα κενό AVL δένδρο αυξάνει το ύψος του λογαριθμικά. n Συνεπώς ϑα χρειαστούν: log i O(n log n) βήματα. i=1 6. i. Υπολογίστε το μέγιστο αριθμό κόμβων που έχει ένα μη κενό AVL δένδρο συναρτήσει του ύψους του. ii. Αποδείξετε ότι το ύψος ενός μη κενού AVL δένδρου στη χειρότερη περίπτωση είναι της τάξης O(log (n)), όπου n ο αριθμός των κόμβων του δένδρου. iii. Σε ένα δυαδικό δένδρο αναζήτησης ένας κόμβος ονομάζεται μοναχοπαίδι αν έχει πατέρα και δεν έχει αδέρφια. Η κατανομή μοναξιάς ενός δένδρου T δίνεται από τον τύπο LR(T) = lc/n όπου lc είναι ο αριθμός των μοναχοπαιδιών του δένδρου T και n ο αριθμός των κόμβων του δένδρου T. Να αποδείξετε ότι για κάθε μη κενό AVL δένδρο T ισχύει ότι LR(T) 1/. i. Εστω Max(h) ο ελάχιστος αριθμός κόμβων AVL δένδρου ύψους h. Η αναδρομική εξίσωση υπολογισμού του Max(h) είναι: Max(0) = 1 Το μη κενό δένδρο ύψους 0 έχει μόνο ένα κόμβο - τη ρίζα. Max(h) = Max(h 1) + 1 Το μεγιστο μη κενό δένδρο ύψους h αποτελείται από μια ρίζα με δύο υπόδενδρα που έχουν το ίδιο ύψος. Αν τα δύο υπόδενδρα διέφεραν στο ύψος τότε το δένδρο δεν ϑα είχε το μέγιστο αριθμό κόμβων. Η επίλυση της πιο πάνω αναδρομική εξίσωσης γίνεται με τη μέθοδο της αντικατάστασης: Max(h) = Max(h 1) + 1 = ( Max(h ) + 1) + 1 = ( Max(h 3) + 1) + + 1 = 3 ( Max(h 4) + 1) + + 1 + 0 = 4 ( Max(h 5) + 1) + 3 + + 1 + 0. = h Max(h h) + h 1 + 3 + + 1 + 0 = h + h 1 + 3 + + 1 + 0 = h+1 1 ii. Αν ο μέγιστος αριθμός κόμβων ενός AVL δένδρου ύψους h είναι n = h+1 1 τότε h = log (n+1)+1 O(log n). iii. Θα αποδείξουμε την πρόταση με τη μέθοδο της επαγωγής. Πριν την αποδείξουμε όμως ϑα δείξουμε ότι κάθε AVL δένδρο με n > κόμβους έχει απαραίτητα η κενά υπόδενδρα στη ρίζα του. Εστω AVL δένδρο με n > κόμβους και με τη ρίζα να έχει μόνο 1 μη κενό υπόδενδρο. Άρα το υπόδενδρο έχει n > 1 κόμβους και άρα έχει ύψος h 1. Αυτό σημαίνει ότι τα υπόδενδρα της ρίζας του AVL δένδρου έχουν διαφορά ύψους μεγαλύτερη του 1. Αυτό οδηγεί σε αντίφαση γιατί παραβιάζεται η συνθήκη του AVL δένδρου. 6
Άρα κάθε AVL δένδρο με n > κόμβους έχει απαραίτητα μη κενά υπόδενδρα στη ρίζα του. Είμαστε έτοιμοι να αποδείξουμε την πρόταση με επαγωγή. Βασικό βήμα: Για μη κενό AVL δένδρο με ένα κόμβο έχουμε ότι η ρίζα δεν είναι μοναχοπαίδι γιατί δεν έχει πατέρα και άρα LR(T 1 ) = 0/1 = 0 1/. Για μη κενό AVL δένδρο με δύο κόμβους έχουμε ότι η ρίζα δεν είναι μοναχοπαίδι γιατί δεν έχει πατέρα αλλά το παιδί της ρίζας είναι μοναχοπαίδι και άρα LR(T ) = 1/ 1/. Επαγωγική υπόθεση: Υποθέτουμε ότι για κάθε AVL δένδρο με k < m κόμβους το LR(T k ) 1/. Επαγωγικό βήμα: AVL δένδρο με m κόμβους. Ενα δένδρο με T m με m κόμβους αποτελείται από μια ρίζα που δεν είναι μοναχοπαίδι και δύο υπόδενδρα που έχουν το κάθενα m 1 και m κόμβους αντίστοιχα. Σημείωση: m = m 1 + m + 1. Από την επαγωγική υπόθεση ξέρουμε ότι LR(T m1 ) = lc 1 1/ και LR(T m ) = lc 1/. Από m 1 m τα τελευταία αποτελέσματα μπορούμε να συμπεράνουμε ότι lc 1 + lc 1/ = lc 1 + lc 1/ (1) m 1 + m m 1 + m + 1 Από την παρατήρηση ότι κάθε AVL δένδρο με n > κόμβους έχει απαραίτητα μη κενά υπόδενδρα στη ρίζα του μπορούμε να συμπεράνουμε ότι οι ρίζες των δύο υπόδενδρων T m1 και T m δεν μπορεί να είναι μοναχοπαίδια στο δένδρο T m γιατί είναι μη κενά δένδρα και είναι αδέλφια. Επίσης η ρίζα του T m δεν είναι μοναχοπαίδι γιατί δεν έχει πατέρα. Άρα τα μοναχοπαίδια του δένδρου T m είναι lc 1 + lc. Η κατανομή μοναξιάς του δένδρου T m υπολογίζεται ως LR(T m ) = lc 1 + lc Το ζητούμενο m 1 + m + 1 έπεται από την εξίσωση (1). 7. Σας δίνεται ένας πίνακας από n ακεραίους με αρκετές επαναλήψεις στοιχείων έτσι που ο αριθμός των διακριτών στοιχείων του πίνακα να είναι της τάξης O(log n). Να κατασκευάσετε ένα αλγόριθμο ταξινόμησης ο οποίος να ταξινομεί τον πίνακα χρησιμοποιώντας αριθμό συγκρίσεων της τάξης O(n log log n). (Υπόδειξη: Μπορείτε να χρησιμοποιήσετε κάποια βοηθητική δενδρική δομή.) Απάντηση: Θα ορίσουμε τη δομή MultiAVL δένδρο επεκτείνοτας τη δομή δεδομένων AVL δένδρο έτσι ώστε να λαμβάνει υπόψη τον αριθμό επαναλήψεων στοιχείων ως εξής. Σε κάθε ϑέση του δένδρου φυλάγουμε ζεύγη της μορφής (k, n) όπου k είναι το αποθηκευμένο κλειδί και n είναι το πλήθος των επαναλήψεων του κλειδιού k μέσα στο δένδρο. Οι πράξεις του MultiAVLδένδρου ορίζονται ως εξής: Insert(k, T): Αναζήτησε στο δένδρο το κλειδί k. Αν υπάρχει σε ζεύγος (k, n) ανανέωσε την πληροφορία αυτή έτσι ώστε να λάβει υπόψη τη νέα εμφάνιση του k, δηλαδή (k, n) := (k, n + 1). Διαφορετικά, αν το k δεν υπάρχει στο δένδρο, εφάρμοσε τη γνωστή διαδικασία εισαγωγής σε AVL δένδρο για το ζεύγος (k, 1). InOrder(T): Τύπωσε τα στοιχεία του δένδρο σε αύξουσα σειρά με τη διαφορά ότι για κάθε κόμβο με κλειδί (k, n) τυπώνουμε το στοιχείο k, n φορές. Η διαδικασία Insert χρησιμοποιεί αριθμό εξακολουθεί να διατηρεί χρόνο εκτέλεσης της τάξης O(log n) όπου n είναι ο αριθμός των κόμβων του δένδρου, ενώ η διαδικασία InOrder εξαρτάται και από την πολλαπλότητα των στοιχείων του δένδρου. Υποθέτοντας υλοποίηση της δομής MultiAVL ορίζουμε τον πιο κάτω αλγόριθμο. 7
i n t A[ n ] ; MultiAVL B; MakeEmpty (B) ; for ( i 0; i < n ; i ++) I n s e r t (A[ i ], B) ; InOrder (B) ; Ο αλγόριθμος αυτός τοποθετεί τα στοιχεία του πίνακα σε ένα MultiAVL-δένδρο μέσω n διαδοχικών κλήσεων της Insert και στη συνέχεια τα τυπώνει σε αύξουσα σειρά μέσω κλήσης της InOrder. Παρατηρούμε ότι αφού ο πίνακας A περιέχει μόνο log n διαφορετικά στοιχεία, ο αριθμός κόμβων του δένδρου B αφού δημιουργηθεί ϑα είναι log n. Επομένως ο χρόνος εκτέλεσης της Insert ϑα είναι της τάξης O(log log n) και της InOrder O(n). Ετσι, ο χρόνος εκτέλεσης του πιο πάνω αλγόριθμου ταξινόμησης είναι O(n log log n + n) = O(n log log n), όπως ζητείται από την άσκηση. 8. Μηχανή αναζήτησης διαθέτει 3, 000, 000, 000, 000 κλειδιά, αποθηκευμένα σε εξωτερική μνήμη. Η φόρτωση ενός κόμβου x κλειδών στην κύρια μνήμη απαιτεί χρόνο 0.1111 x δευτερόλεπτα. Η ε- πεξεργασία ενός κόμβου x κλειδιών απαιτεί χρόνο log (x) δευτερόλεπτα. Υπολογίστε τον χρόνο αναζήτησης ενός κλειδιού εαν η δομή αναπαράστασης των κλειδιών είναι Β Δένδρο τάξης 9. Απάντηση Ο χρόνος αναζήτησης ενός Β Δένδρου είναι ίσος με: ύψος του δένδρου χρόνος επεξεργασίας ενός κόμβου. Το ύψος του δένδρου είναι log 10 3, 000, 000, 000, 000 = 1 + log 10 3. Ο χρόνος επεξεργασίας του κόμβου είναι: Ο χρόνος φόρτωσης του κόμβου στην κύρια μνήμη + ο χρόνος επεξεργασίας ενός φορτωμένου κόμβου. Άρα: (0.1111 9) + log 9 1 + log 9. Ο συνολικός χρόνος εκτέλεσης είναι (1 + log 10 3)(1 + log 9). 8