Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Σχετικά έγγραφα
Κατ οίκον Εργασία 3 Σκελετοί Λύσεων

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΑΣΚΗΣΗ 3 Δέντρα

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Εργασία 3 Σκελετοί Λύσεων

Αναδροµή. Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Διδάσκων: Παναγιώτης Ανδρέου

Φροντιστήριο 4 Σκελετοί Λύσεων

Φροντιστήριο 4 Σκελετοί Λύσεων

Ισορροπημένα Δένδρα. για κάθε λειτουργία; Ισορροπημένο δένδρο : Διατηρεί ύψος κάθε εισαγωγή ή διαγραφή

Κατ οίκον Εργασία 5 Σκελετοί Λύσεων

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

Διάλεξη 26: Σωροί. Διδάσκων: Παναγιώτης Ανδρέου

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 10 Δυαδικά Δένδρα Αναζήτησης

Δένδρα. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

Δένδρα. Μαθηματικά (συνδυαστικά) αντικείμενα. Έχουν κεντρικό ρόλο στην επιστήμη των υπολογιστών :

Διδάσκων: Παναγιώτης Ανδρέου

Κατ οίκον Εργασία 4 Σκελετοί Λύσεων

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

Διάλεξη 13: Δέντρα ΙΙΙ Ισοζυγισμένα Δέντρα, AVL Δέντρα

Διάλεξη 13: Δέντρα ΙΙΙ Ισοζυγισμένα Δέντρα, AVL Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 13: Δέντρα ΙΙΙ - Ισοζυγισμένα Δέντρα, AVL Δέντρα

Π(n) : 1 + a + + a n = an+1 1 a 1. a 1. + a k+1 = ak+2 1

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Ενότητα 9 Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find)

Διδάσκων: Κωνσταντίνος Κώστα

Δένδρα Αναζήτησης Πολλαπλής Διακλάδωσης

Διάλεξη 17: O Αλγόριθμος Ταξινόμησης HeapSort

Δομές Αναζήτησης. κλειδί από ολικά διατεταγμένο σύνολο. Θέλουμε να υποστηρίξουμε δύο βασικές λειτουργίες: Εισαγωγή ενός νέου στοιχείου

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

Ισορροπημένα Δένδρα. για κάθε λειτουργία; Ισορροπημένο δένδρο : Διατηρεί ύψος κάθε εισαγωγή ή διαγραφή

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

Ουρές Προτεραιότητας: Υπενθύμιση. Σωροί / Αναδρομή / Ταξινόμηση. Υλοποίηση Σωρού. Σωρός (Εισαγωγή) Ορέστης Τελέλης

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Βασικές Ιδιότητες και Διάσχιση Κεφάλαιο 5 ( και ) Ε. Μαρκάκης Επίκουρος Καθηγητής

ΠΛΗ111. Ανοιξη Μάθηµα 7 ο. έντρο. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Εισαγωγή ενός νέου στοιχείου. Επιλογή i-οστoύ στοιχείου : Εύρεση στοιχείου με το i-οστό μικρότερο κλειδί

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

Ισορροπημένα Δένδρα. για κάθε λειτουργία; Ισορροπημένο δένδρο : Διατηρεί ύψος κάθε εισαγωγή ή διαγραφή

Διάλεξη 14: Δέντρα IV B Δένδρα. Διδάσκων: Παναγιώτης Ανδρέου

Ενότητα 9 Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find)

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Κατ οίκον Εργασία 1 Σκελετοί Λύσεων

Διδάσκων: Παναγιώτης Ανδρέου

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Δέντρα Αναζήτησης. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Δοµές Δεδοµένων. 11η Διάλεξη Ταξινόµηση Quicksort και Ιδιότητες Δέντρων. Ε. Μαρκάκης

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων

h/2. Άρα, n 2 h/2-1 h 2log(n+1). Πως υλοποιούµε τη LookUp()? Πολυπλοκότητα?

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Ισορροπημένα Δένδρα. για κάθε λειτουργία; Ισορροπημένο δένδρο : Διατηρεί ύψος κάθε εισαγωγή ή διαγραφή

Βασικές Δομές Δεδομένων

Π(n) : 1 + a + + a n = αν+1 1

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

ένδρα (tail, head) Γονέας Παιδί (ancestor, descendant) Φύλλο Εσωτερικός Κόµβος (leaf, non-leaf) που αποτελεί το γονέα του v.

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Κατηγορίες Συμπίεσης. Συμπίεση με απώλειες δεδομένων (lossy compression) π.χ. συμπίεση εικόνας και ήχου

Δέντρα (Trees) - Ιεραρχική Δομή

Ισορροπημένα Δένδρα. για κάθε λειτουργία; Ισορροπημένο δένδρο : Διατηρεί ύψος κάθε εισαγωγή ή διαγραφή

Κατ οίκον Εργασία 1 Σκελετοί Λύσεων

Δομές δεδομένων. Ενότητα 8: Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find) Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Ουρές Προτεραιότητας Σωροί υλοποίηση και πράξεις Ο αλγόριθμος ταξινόμησης HeapSort

Ενότητα 7 Ουρές Προτεραιότητας

Γέφυρες σε Δίκτυα. Μας δίνεται ένα δίκτυο (κατευθυνόμενο γράφημα) αφετηριακός κόμβος. Γέφυρα του (με αφετηρία τον ) :

Ουρά Προτεραιότητας (priority queue)

Διδάσκων: Παναγιώτης Ανδρέου

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

ΕΝΟΤΗΤΑ 7 ΟΥΡΕΣ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ ΣΩΡΟΙ

Κεφάλαιο 6 Ουρές Προτεραιότητας

Δομές δεδομένων. Ενότητα 5η: Υλοποίηση Λεξικών με Ισοζυγισμένα Δένδρα Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

Επιλογές και Κριτήρια Σχεδιασμού ΑΤΔ Ανεξαρτήτως από Γλώσσα Υλοποίησης 24/4/2012

Κεφάλαιο 11 Ένωση Ξένων Συνόλων

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

Διάλεξη 11: Δέντρα Ι Εισαγωγή σε Δενδρικές Δομές Δεδομένων

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

σωροί ταξινόμηση σωρού οόροςheap σωρός (heap) συστοιχία Α για έναν σωρό μια δομή δεδομένων που πχ.

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

Παράδειγμα δομικής επαγωγής Ορισμός δομικής επαγωγής Συμβολοσειρές Γλώσσες Δυαδικά δένδρα Μαθηματικά Πληροφορικής 3ο Μάθημα Τμήμα Πληροφορικής και Τηλ

Δομές Δεδομένων. Ενότητα 10: Πλήρη Δυαδικά Δέντρα, Μέγιστα/Ελάχιστα Δέντρα & Εισαγωγή στο Σωρό- Ο ΑΤΔ Μέγιστος Σωρός. Καθηγήτρια Μαρία Σατρατζέμη

Δομές Δεδομένων και Αλγόριθμοι

Βασικές Δοµές Δεδοµένων. Σύντοµη επανάληψη (ΕΠΛ 035).

Διδάσκων: Παναγιώτης Ανδρέου ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

Παράδειγμα δομικής επαγωγής Ορισμός δομικής επαγωγής Συμβολοσειρές Γλώσσες Δυαδικά δένδρα Μαθηματικά Πληροφορικής 3ο Μάθημα Αρχικός συγγραφέας: Ηλίας

Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

Διάλεξη 11: Δέντρα Ι - Εισαγωγή σε Δενδρικές Δομές Δεδομένων

Κεφάλαιο 2. Η δομή δεδομένων Σωρός και η Ταξινόμηση Σωρού (The Heap data structure and Heapsort) Έκδοση 1.3, 14/11/2014

Δομές Δεδομένων. Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες

Transcript:

ΕΠΛ 3 Δομές Δεδομένων και Αλγόριθμοι Νοέμβριος 00 Κατ οίκον Εργασία Σκελετοί Λύσεων Άσκηση Έστω ο αριθμός φύλλων που βρίσκονται στο επίπεδο ενός δυαδικού δένδρου. Θέλουμε να αποδείξουμε την πρόταση: Η απόδειξη μπορεί να γίνει με μαθηματική επαγωγή. Βασική περίπτωση = - Προφανώς η περίπτωση αυτή αφορά το κενό δένδρο. Τότε Επομένως το ζητούμενο έπεται. Βασική περίπτωση = 0 Προφανώς η περίπτωση αυτή αφορά δένδρο με ένα ακριβώς κόμβο, τη ρίζα. Τότε Επομένως το ζητούμενο έπεται. Υπόθεση της επαγωγής: Έστω Π(k) για κάθε k < m. Βήμα της επαγωγής: Θα δείξουμε ότι η Π(m) αληθεύει. Έστω ένα δυαδικό δένδρο με ύψος m. Το δένδρο αυτό αποτελείται από μια ρίζα και δύο μη κενά υπόδενδρα που ριζώνουν σε αυτή. Προφανώς και τα δύο αυτά υπόδενδρα έχουν ύψος μικρότερο του m. Έστω L και R τα ύψη του αριστερού και δεξιού υποδένδρου, αντίστοιχα, και L και R ο αριθμός φύλλων που βρίσκονται στο επίπεδο στο αριστερό και στο δεξιό υπόδενδρο αντίστοιχα. Τότε από την υπόθεση της επαγωγής έχουμε για τα δένδρα L και R ότι Ας επιστρέψουμε στο αρχικό δένδρο. Παρατηρούμε ότι τα φύλλα που βρίσκονται στο επίπεδο του αρχικού δένδρου είναι το άθροισμα των φύλλων που βρίσκονται στο επίπεδο - των υποδένδρων L και R, δηλαδή: και = - L + - R Επομένως, ξεκινώντας με το αριστερό σκέλος της ζητούμενης πρότασης, έχουμε

ΕΠΛ 3 Δομές Δεδομένων και Αλγόριθμοι Νοέμβριος 00 L R R L R L Αυτό συμπληρώνει την απόδειξη. Άσκηση Μία σειρά εισαγωγής των στοιχείων που έχει ως αποτέλεσμα την δημιουργία του δένδρου με τον μέγιστο αριθμό κόμβων είναι η, 4, 5, 7, 8, 8, 9, 7. (Υπάρχουν και άλλες σειρές εισαγωγής που δίνουν αυτό τον αριθμό κόμβων.) Μια σειρά που παράγει δένδρο με τον μικρότερο αριθμό κόμβων είναι η 7, 4, 8, 9, 5, 8,, 7. Η σειρά αυτή δημιουργεί το πιο κάτω δένδρο με 4 κόμβους. (Υπάρχουν και άλλες σειρές εισαγωγής που δίνουν αυτό τον αριθμό κόμβων.) Άσκηση 3 Προφανώς τα δένδρα τα οποία θα υλοποιήσουμε δεν έχουν κάποιο προκαθορισμένο βαθμό (δεν υπάρχει καθορισμένος μέγιστος βαθμός ενός κόμβου). Έτσι για εξοικονόμηση χώρου και για υλοποίηση λύσης χωρίς την επιβολή οποιωνδήποτε 5 4 8 9 7 8 7 4 7 8 5 8 9 7 {Για κάθε > L +, L = 0 και συμμετρικά για κάθε +> R {Από την υπόθεση της επαγωγής

ΕΠΛ 3 Δομές Δεδομένων και Αλγόριθμοι Νοέμβριος 00 περιορισμών/υποθέσεων επιλέγουμε να υλοποιήσουμε το δένδρο φυλάγοντας για κάθε κόμβο το πρώτο του παιδί και τον επί δεξιά του αδελφό. Αυτό υλοποιείται μέσω των δομών: struct person{ strng name; nt brt; nt deat; strng spouse; typedef struct FTnode{ struct person pers; struct FTnode *frstcd; struct FTnode *rgtsbng; ftnode; και υποθέτουμε πως ένα γενεαλογικό δένδρο είναι υλοποιημένο ως δείκτης στη ρίζα του δένδρου, δηλαδή, έχει τύπο *ftnode. Αρχικά υλοποιούμε τη βοηθητική διαδικασία Fnd (name, ftree) η οποία εντοπίζει και επιστρέφει δείκτη στον κόμβο που αφορά το άτομο με όνομα name στο δένδρο που δείχνεται από το δείκτη ftree, αν υπάρχει. ftnode *Fnd(strng name, ftnode *p) { f (p == NULL) return NULL ese { f ((p->pers->name) == name) return p; ese { q = Fnd(name, p -> frstcd); f (q!= NULL) return q; ese return Fnd(name, p -> rgtsbng); () Για να τυπώσουμε τα ονόματα των παιδιών ενός ατόμου με κάποιο όνομα, πρώτα εντοπίζουμε τον κόμβο που αντιστοιχεί στο συγκεκριμένο άτομο και μετά επισκεπτόμαστε τα παιδιά του μέσω του δείκτη frstcd του κόμβου και των δεικτών rgtsbng των παιδιών: Cdren(strng name, ftnode *p) { q = Fnd(name, p); f (q!= NULL) { q = p->frstcd; we (q!= NULL) { prnt (q->pers)->name; q = q->rgtsbng; 3

ΕΠΛ 3 Δομές Δεδομένων και Αλγόριθμοι Νοέμβριος 00 () Για να εισαγάγουμε ένα νέο παιδί κάποιου ατόμου θα πρέπει πρώτα να εντοπίσουμε το άτομο αυτό, και στη συνέχεια να τοποθετήσουμε το νέο παιδί στη λίστα παιδιών που δείχνεται από το δείκτη frstcd: Newcd(strng cd, nt year, strng parent, ftnode *p) { q = Fnd(parent, p); f (q!= NULL) { r = (ftnode *) maoc(szeof(ftnode)); r->pers->name = cd; r->pers->brt = year; r->pers->deat = -; r->frstcd = NULL; r->rgtsbng = q->frstcd; q -> frstcd = r; () H διαδικασία που προτείνεται αρχικά εντοπίζει τον ζητούμενο κόμβο και στη συνέχειακαλεί μια δεύτερη, αναδρομική διαδικασία στο πρώτο παιδί του κόμβου αυτού. Η αναδρομική διαδικασία δουλεύει ως εξής: αν το παιδί δεν είναι κενό, τότε: αν το άτομο στη ρίζα του δένδρου βρίσκεται εν ζωή, τότε το όνομα του ατόμου τυπώνεται στην οθόνη και η διαδικασία καλείται () στο πρώτο παιδί του κόμβου και () στον επί δεξιά αδελφό του κόμβου. Lvng(strng name, ftnode *p) { q = Fnd(name, p); f (q == NULL) return; ese f (q->frstcd!= NULL) RecLvng(q->frstcd); RecLve(ftnode *p){ f (p->deat == -) prnt(p->pers->name); f (p->frstcd!= NULL) RecLve(p->frstcd) f (p->rgtsbng!= NULL) RecLve(p->rgsbng) Ο χρόνος εκτέλεσης των διαδικασιών είναι Ο(n) όπου n είναι ο αριθμός των κόμβων του δένδρου. 4

ΕΠΛ 3 Δομές Δεδομένων και Αλγόριθμοι Νοέμβριος 00 Άσκηση 4 Χρησιμοποιούμε τη δομή typedef struct Νode{ nt key; struct node *eft; struct node *rgt; node; και υποθέτουμε πως ένα δυαδικό δένδρο είναι υλοποιημένο ως δείκτης στη ρίζα του δένδρου, δηλαδή, έχει τύπο *node. Το ζητούμενο υλοποιείται με την πιο κάτω αναδρομική διαδικασία: Reverse(node *p){ f (p!= NULL) { temp = p->eft; p->eft = p->rgt; p->rgt = temp; f (p->eft!= NULL) Reverse(p -> eft); f (p->rgt!= NULL) Reverse(p -> rgt); Η αναδρομική διαδικασία καλείται μια φορά σε κάθε κόμβο, επομένως ο χρόνος εκτέλεσής της είναι Ο(n) όπου n είναι ο αριθμός των κόμβων του δένδρου. Η μη-αναδρομική εκδοχή της διαδικασία απαιτεί τη χρήση βοηθητικής δομής. I. Έστω p δείκτης στον κόμβο του δένδρου όπου βρισκόμαστε. Μεταθέτουμε τους δείκτες p->eft και p->rgt. Τοποθετούμε σε μια ουρά (ή στοίβα η σειρά με την οποία γίνονται οι αντιστροφές δεν έχει σημασία) τον δείκτη p->rgt, αν αυτός δεν είναι NULL. II. Εφόσον ο κόμβος έχει αριστερό παιδί προχωρούμε αριστερά και επαναλαμβάνουμε από το βήμα Ι. III. Διαφορετικά, εφόσον η ουρά δεν είναι κενή, ανασύρουμε τον κόμβο κορυφής της, έστω q και προχωρούμε στο βήμα Ι με τον δείκτη q. Reverse(node *p){ queue Q; MakeEmpty(Q); we (p!= NULL OR!IsEmpty(Q)) { f (p!= NULL) { temp = p->eft; p->eft = p->rgt; p->rgt = temp; f (p -> rgt!= NULL) Enqueue(p -> rgt, Q); p = p ->eft; 5

ΕΠΛ 3 Δομές Δεδομένων και Αλγόριθμοι Νοέμβριος 00 ese p = Dequeue(Q); Η διαδικασία επισκέπτεται κάθε κόμβο ακριβώς μια φορά, επομένως ο χρόνος εκτέλεσής της είναι Ο(n) όπου n είναι ο αριθμός των κόμβων του δένδρου. Στην πράξη αναμένουμε η δεύτερη διαδικασία να είναι αποδοτικότερη εφόσον αποφεύγει την αναδρομή και τη σχετική χρήση στοίβας για αποθήκευση και ανάσυρση των στοιχείων των καλούντων διαδικασιών, γεγονός που στοιχίζει στην αποδοτικότητα χρόνου και χώρου. Άσκηση 5 Για την υλοποίηση του ζητούμενου ΑΤΔ χρησιμοποιούμε μια επέκταση των AVL δένδρων όπου, σε κάθε κόμβο, περιέχεται πεδίο numnodes το οποίο αποθηκεύει τον αριθμό των κόμβων του δένδρου που ριζώνει στον κόμβο. Χρησιμοποιούμε την εξής εγγραφή: typedef struct Νode{ nt key; nt egt; nt numnodes; struct Node *eft; struct Node *rgt; node; Ως βοηθητικές διαδικασίες υλοποιούμε τις countabggertan(p,k) και countasmaertan(p,k) οι οποίες υπολογίζουν και επιστρέφουν τον αριθμό των κλειδιών στο δένδρο που ριζώνει στον κόμβο p και είναι μεγαλύτερα και μικρότερα, αντίστοιχα από το k: CountAnRange(node *p, nt k, nt k) { f p = NULL return 0 f (p->key < k) return CountAnRange(p->rgt, k, k); f (p->key > k) return CountAnRange(p->eft, k, k) ese return ( + countabggertan(p->eft, k) + countasmaertan(p->rgt, k) ) H ιδέα που χρησιμοποιείται στον αναδρομικό αυτό αλγόριθμο είναι ότι αν (p->key < k) τότε μπορούμε να αγνοήσουμε τα στοιχεία του αριστερού υπόδενδρου του p και παρόμοια αν (p->key > k) τότε μπορούμε να αγνοήσουμε τα στοιχεία του δεξιού υπόδενδρου του p. Διαφορετικά, θα πρέπει να επιστρέψουμε [ το πλήθος των κλειδιών του αριστερού υπόδενδρου που είναι μεγαλύτερα από k + το πλήθος των κλειδιών του δεξιού υπόδενδρου που είναι μικρότερα από το k + για ρίζα]. 6

ΕΠΛ 3 Δομές Δεδομένων και Αλγόριθμοι Νοέμβριος 00 Η διαδικασία αυτή θα κάνει το πολύ όσες αναδρομικές κλήσεις όσες και το ύψος του δένδρου ενώ κάθε κλήση θα έχει χρόνο εκτέλεσης Ο(). Επομένως ο χρόνος εκτέλεσης της διαδικασίας θα είναι Ο(g n). Πιο κάτω ορίζονται οι δύο βοηθητικές διαδικασίες countabggertan(p,k) και countasmaertan(p,k). countabggertan(p, k){ f p == NULL return 0 f (p->key < k) return countabggertan(p->rgt, k) ese return ( + countabggertan(p->eft, k) + p->rgt->numnodes); countasmaertan(p, k){ f p == NULL return 0 f (p->key > k) return countasmaertan(p->eft, k) ese return ( + countasmaertan(p->rgt, k) + p->eft->numnodes); Απομένει να δείξουμε τον τρόπο με τον οποίο μπορούμε να υλοποιήσουμε τις πράξεις λεξικού στη δομή μας έτσι ώστε το πεδίο numnodes των κόμβων να παίρνει τη σωστή τιμή. Αυτή η επέκταση αφήνεται ως άσκηση στον αναγνώστη. (Υπόδειξη: οι περιστροφές γίνονται ακριβώς όπως σε ένα AVL δένδρο, αλλά τώρα θα πρέπει σε κάθε βήμα μετά από την εισαγωγή του νέου κόμβου να δίνουμε στα πεδία numnodes κατάλληλες καινούριες τιμές.) 7